Anonymní profil Autor – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Autor – Programujte.comAnonymní profil Autor – Programujte.com

 

Příspěvky odeslané z IP adresy 84.16.108.–

Autor
C / C++ › Úprava jednoduché hry v céčku
3. 5. 2017   #215839

No sláva, konečně se mi to povedlo zprovoznit. Začínám být zoufalý, protože pokaždé, co se snažím vytvořit nějaký ''složitější'' kod, tak se někde šprajcnu a většinou se bez cizí pomoci nedostanu dál :) No nic, musím setrvat a snad se toho víc dostanu.. Každopádně díky za rady a trpělivost :) Mějte se a ještě jednou díky !

Autor
C / C++ › Úprava jednoduché hry v céčku
3. 5. 2017   #215836

 Moc děkuju za tipy.

Dostal jsem se k něčemu takovému : 

int main(){
   int  znak=0, chaos=1, zmenar=0, zmenas=0;
   
   init();
   cas1=(unsigned long)time(0);
   ;
   
  
     
   nahrajPoleZeSouboru();  
   do{
   if(pole[pozices][pozicer]=='@') chaos=chaos*-1;
     if(kbhit()!=0){
        znak=getch();
       int zmenar = 0, zmenas = 0;

switch(znak) {
  case 'w': zmenar++; break;
  case 's': zmenar--; break;
  case 'd': zmenas++; break;
  case 'a': zmenas--; break;
}


if (chaos) {
  zmenar = chaos*zmenar;
  zmenas = chaos*zmenas;
}

int nover = pozicer + zmenar, noves = pozices + zmenas;

if (nover < 0 || nover >= MAX ||
    noves < 0 || noves >= MAX ||
    pole[nover][noves] == '#') {
  trestnebody++;
} else {
  pozicer = nover;
  pozices = noves;

Ovšem pořád to nefunguje tak, jak by mělo. Už od spuštění hry jsou prohozené klávesy S a W, klávesy A a D fungují normálně (levo, pravo) a najetí na pole se zavináčem nemění vůbec nic. Hádám, že chyba bude v části : if(pole[pozices][pozicer]=='@') chaos=chaos*-1; ovšem jistý si nejsem ničím :) 

Autor
C / C++ › Úprava jednoduché hry v céčku
1. 5. 2017   #215772

Zdravíčko,
mám zde jednoduchou hru v céčku, ve které se pohybujete klasicky klávesami WASD a vaším úkolem je se dostat do pravého dolního rohu pole. Pokud narazíte do zdi (ve hře  #) nebo se pokusíte vylézt z pole, přičte se vám jeden trestný bod. Pokud vyprší časový limit, dosáhnete tří trestných bodů nebo stisknete klávesu ''q'' , hra skončí. S tímhle problém není.
 

#include <stdio.h>
#include <time.h>
#define MAX 10-2
#define CASLIMIT 20
char pole[MAX][MAX];
int pozicer=0,pozices=0,trestnebody=0;
unsigned long cas1,cas2;
void init() {
 int r,s;
  for(r=0;r<MAX;r++)    
   for(s=0;s<MAX;s++)
    pole[r][s]=' ';
     }
 void nahrajPoleZeSouboru() {
      int i,r,znak;
      FILE *soubor;
      soubor=fopen("sachovnice.txt","r");
      if (soubor!=NULL) {
        for(i=0                    
     
     
     
     
void vypis(){
     int r,s;
     system("cls");
      for(r=0;r<MAX;r++)  {
         for(s=0;s<MAX;s++)
          printf("+-") ;
          
          printf("+\n");                
        for(s=0;s<MAX;s++)
         
         if(pozicer==r && pozices==s)
         printf("|*");
         else
        printf("|%c",pole[r][s]); 
        printf("|\n");
        
        
         }
   for(s=0;s<MAX;s++)
   printf("+-") ;
   printf("+\n"); 
   printf("Trestne body : %d\n",trestnebody);
   cas2=(unsigned long)time(0);
   
   printf("Cas: %d\n", CASLIMIT-(cas2-cas1));
   
       }   

int main() {
    int i, znak=0, 
    
    init();
    
    cas1=(unsigned long)time(0);
    
    for(i=1; i<7; i++)
       pole [4][i]='#';  
       
    do{
      if(kbhit()!=0){
        znak=getch();
        switch(znak){   
           case 's': if(pozicer<(MAX-1) && pole[pozicer+1][pozices]!='#') 
                      pozicer++; 
                         else trestnebody++;                 
                      break;
          case 'w': if(pozicer>0 && pole[pozicer-1][pozices]!='#') 
                      pozicer--;  
                         else trestnebody++;                   
                      break;   
          case 'a': if(pozices>0 && pole[pozicer][pozices-1]!='#')
                      pozices--;   
                          else trestnebody++;                  
                      break;  
         case 'd': if(pozices<(MAX-1)&& pole[pozicer][pozices+1]!='#')
                      pozices++;  
                         else trestnebody++;                    
                      break;                                               
        }
        
        
           
        }                                  
       vypis();
     }while ( znak !='q' && !(pozicer==(MAX-1) && pozices==(MAX-1)) && trestnebody<5 && (cas2-cas1<CASLIMIT)); 
    getchar();
    
    

Jenže jsem se snažil do hry přidat vychytávku, kdy po vkročení na určité políčko (v mém případě políčko označené ''@'') se ovládaní přetočí ( doposud znamenal znak W posun od jedno nahoru, nyní by ale znamenal posun dolů, S by znamenal posun nahoru, A by znamenal posun doprava a D posun doleva). 

Pokusil jsem se o to následovně  

int main(){
   int i, znak=0, chaos=0;
   
   init();
   cas1=(unsigned long)time(0);
   ;
   if(pozices=='@' && pozicer=='@')
       chaos++; 
  
     
   nahrajPoleZeSouboru();  
   do{
   if(chaos==0) {
     if(kbhit()!=0){
        znak=getch();
        switch(znak){
          case 's': if(pozicer<(MAX-1) && pole[pozicer+1][pozices]!='#')
                      pozicer++;
                    else trestnebody++;
                    break;
          case 'w': if(pozicer>0 && pole[pozicer-1][pozices]!='#')
                      pozicer--;
                    else trestnebody++;  
                    break;
          case 'd': if(pozices<(MAX-1) && pole[pozicer][pozices+1]!='#')
                      pozices++;
                    else trestnebody++;  
                    break;
          case 'a': if(pozices>0 && pole[pozicer][pozices-1]!='#')
                      pozices--;
                    else trestnebody++;  
                    break;}
        } 
   else  
       if(kbhit()!=0){
        znak=getch();
        switch(znak){
          case 'w': if(pozicer<(MAX-1) && pole[pozicer+1][pozices]!='#')
                      pozicer++;
                    else trestnebody++;
                    break;
          case 's': if(pozicer>0 && pole[pozicer-1][pozices]!='#')
                      pozicer--;
                    else trestnebody++;  
                    break;
          case 'a': if(pozices<(MAX-1) && pole[pozicer][pozices+1]!='#')
                      pozices++;
                    else trestnebody++;  
                    break;
          case 'd': if(pozices>0 && pole[pozicer][pozices-1]!='#')
                      pozices--;
                    else trestnebody++;  
                    break;   
                    } }  
     }
     printf("%d\n",chaos);
     vypis();             
   }while( znak !='q' && !(pozicer==(MAX-1) && pozices==(MAX-1)) && (cas2-cas1<CASLIMIT) && trestnebody<3 );
   
   getchar();
    

Do mainu jsem přidal proměnou ''chaos'' rovnou nule. A přidal ''if'' který by měl inkrementovat chaos o jedna, pokud hráč vstoupí právě na políčko označené zavináčem. Dále druhý ''If'' před ovládaní, kdy pokud je chaos roven nule, funguje klasické ovládání, pokud je různý od nuly, tak by fungovat mělo druhé- přehozené ovládaní.
Samozřejmě to nefunguje tak, jak bych si to představoval a ovládaní zůstává pořád stejné. Našel by se tu někdo, kdo by mi poradil v čem mám chybu a nasměroval mě ke správnému řešení ? 
Předem díky za snahu a trpělivost.

Jinak jsem zapomněl dodat, že hrací pole se nahrává z textové souboru, který jsem vytvořil v poznámkovém bloku a do které jsem jednoduše vložil mezery nebo mřížky.

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý