Úprava jednoduché hry v céčku – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Úprava jednoduché hry v céčku – C / C++ – Fórum – Programujte.comÚprava jednoduché hry v céčku – C / C++ – Fórum – Programujte.com

 

Autor
~ Anonymní uživatel
3 příspěvky
1. 5. 2017   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 84.16.108.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 5. 2017   #2
-
0
-

Ten zavináč testuješ mimo ten cyklus a testuješ hodnotu souřadnic místo obsahu pole.

A nepiš stejný kód 8krát, když se liší jen v jednom příkazu.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 5. 2017   #3
-
0
-

   

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 = -zmenar;
  zmenas = -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;
}
Nahlásit jako SPAM
IP: 213.211.51.–
Staon0
Návštěvník
3. 5. 2017   #4
-
0
-

No, měl bych ještě jeden námět na zlepšení. Proměnnou chaos bys mohl iniciálně nastavit na 1, a pak s ní násobit změnu pozice (zmenar a zmenas v kódu gna). A při vstupu na pole s @ proměnnou chaos vynásobit -1, čímž se bude elegantně překlápět mezi normálním a opačným ovládáním.

Nahlásit jako SPAM
IP: 94.142.234.–
Autor
~ Anonymní uživatel
3 příspěvky
3. 5. 2017   #5
-
0
-

 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 :) 

Nahlásit jako SPAM
IP: 84.16.108.–
gna
~ Anonymní uživatel
1891 příspěvků
3. 5. 2017   #6
-
0
-

Klávesy W a S jsou od začátku prohozené, protože jsem to napsal špatně. Prohoď to zpátky a nekopíruj, ale studuj.

Všude máš pole[R][S], ale ten zavináč testuješ na [S][R], takže jinde. Taky ho testuješ mimo ten blok pro pohyb, takže dokud budeš na @ tak se ti bude chaos pořád přehazovat.

Pokud neumíš používat krokování, tak si tam prostě přidej nějaké výpisy hodnot.

Nahlásit jako SPAM
IP: 213.211.51.–
Autor
~ Anonymní uživatel
3 příspěvky
3. 5. 2017   #7
-
0
-

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 !

Nahlásit jako SPAM
IP: 84.16.108.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 37 hostů

Podobná vlákna

Projekty v cecku — založil jaelisa

Cyklus v Cécku — založil DaN

Nový web o Céčku — založil Elver

Nový web o Céčku — založil Tomáš

Moderátoři diskuze

 

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