Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] pętla podczas ponownego wywołania nie działa.

shishibi 25 Paź 2010 00:54 1098 2
  • #1 25 Paź 2010 00:54
    shishibi
    Poziom 8  

    musze napisac gre pseudo węża, zawiera skarby i pulapki jest ograniczone pole itd. moj problem zaczal sie jak zaczalem rysowac powiekszajacego sie weza moze zeby nie tlumaczyc na sucho to wkleje kod ktory jest dosyc dlugi i zdaje sobie sprawe ze jest dosyc niechlujnie napisane i zlożonosc mojego kodu jest dosyc duza ale nie o to tu chodzi:

    Code:

    #include "console.h"
    #include "windows.h"
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>

    using namespace std;



    int main(int argc, char* argv[])
    {   
       restart:
       initConsole();
       int key;

       
       char res='t';
       bool trap=false;
       int wysokosc = 4,j,k;
       int szerokosc = 22;
       int d=0,i=1, tab[10][3];
       srand ( time(NULL) );
       int skarb_x=(rand()%77)+1;
       srand ( time(NULL) );
       int skarb_y=(rand()%45)+3;
       
       int pulapka_x=(rand()%77)+1;
       
       int pulapka_y=(rand()%45)+3;

       // wąz
          
          for(int j=1;j<=9;j++)
          {
             tab[j][1]=0;
             tab[j][2]=0;
          }
       
       do{

         do
          {
          clearScreen();
          
       


          
          // Pulapka
          if(trap==true)
          {
             gotoXY(pulapka_x,pulapka_y);
             write('P');
             
          }

          if((szerokosc==pulapka_x)&(wysokosc==pulapka_y))
          {
             clearScreen();
             break;
             write("Chcesz zagrac jeszcze raz? t/n");
          }

          // Skarb
          gotoXY(skarb_x,skarb_y);
          write('S');




         

          //Podpis
          
          gotoXY(20,1);
          write("Tomasz Adamczak 131448");

          // Licznik

          gotoXY(44,1);
          {
            printf("Licznik: ");
          printf("%i",d);
          printf("%i",i);
          }
          
          
          
          gotoXY(szerokosc,wysokosc);
          write('H');
          if((szerokosc==skarb_x)&(wysokosc==skarb_y))
          {
               srand ( time(NULL) );
            skarb_x=(rand()%77)+1;
            srand ( time(NULL) );
            skarb_y=(rand()%45)+3;
            d++;
              i++;
           
           
          }

          for(k=(i-1);k==1;k--)
            {
              tab[k+1][1]=tab[k][1];
              tab[k+1][2]=tab[k][2];
             }
                tab[1][1]=wysokosc;
              tab[1][2]=szerokosc;

          for(j=2;j==i;j++)
          {
             gotoXY(tab[j][2],tab[j][1]);
             write('#');
          }
                
          
          
          

          //obsluga klawiszy

          key = getVKey();
          
          switch (key)
          {

          case VK_UP :   wysokosc--;
                         if (wysokosc==2)
                         wysokosc=3;
                      break;

          case VK_DOWN :   wysokosc++;
                      if (wysokosc==49)
                         wysokosc = 48;
                      break;
            case VK_LEFT :   szerokosc--;
                      if (szerokosc==0)
                         szerokosc = 1;
                      break;
          case VK_RIGHT :   szerokosc++;
                      if (szerokosc==79)
                         szerokosc = 78;
                      break;

          case 80 :      if(trap==false)
                      trap=true;
                      
                      else
                      trap=false;
                      break;

          }

          
          
          
       }
          while (key!=VK_ESCAPE);
       clearScreen();
       printf("Chcesz zagrac jeszcze raz? t/n\n");
       
       scanf("%c",&res);
       if(res=='t')
       goto restart;
       }
    while (res!='n');
       return 0;
    }




    to miejsce odpowiada za rysowanie weza :

    Code:
        gotoXY(szerokosc,wysokosc);
    
          write('H');
          if((szerokosc==skarb_x)&(wysokosc==skarb_y))
          {
               srand ( time(NULL) );
            skarb_x=(rand()%77)+1;
            srand ( time(NULL) );
            skarb_y=(rand()%45)+3;
            d++;
              i++;
           
           
          }

          for(k=(i-1);k==1;k--)
            {
              tab[k+1][1]=tab[k][1];
              tab[k+1][2]=tab[k][2];
             }
                tab[1][1]=wysokosc;
              tab[1][2]=szerokosc;

          for(j=2;j==i;j++)
          {
             gotoXY(tab[j][2],tab[j][1]);
             write('#');
          }



    prześledziłem kod z debuggerem w visual studio, wszystko dziala dobze w 1 przebiegu, jak wąż ma tylko 1 ogonek ale za drugim przebiegiem program omija mi te 2 petle i wszystkie ogonki sie kasuja:
    Code:
    for(k=(i-1);k==1;k--)
    
            {
              tab[k+1][1]=tab[k][1];
              tab[k+1][2]=tab[k][2];
             }
                tab[1][1]=wysokosc;
              tab[1][2]=szerokosc;

          for(j=2;j==i;j++)
          {
             gotoXY(tab[j][2],tab[j][1]);
             write('#');

    nie mam pojecia czemu program zaczyna omijac te petle prosze o pomoc.

    0 2
  • Pomocny post
    #2 25 Paź 2010 08:46
    marcinj12
    Poziom 40  

    Nie chce mi się analizować całego kodu ;), ale z tego co się rzuca w oczy (i pasuje do tego o czym piszesz) to warunek pętli:

    Code:
    for(k=(i-1);k==1;k--) 
    , a dokładnie:
    Code:
    k==1
    . Dlaczego tak?? To jest warunek kontynuacje pętli, ten będzie spełniony (a więc pętla wykona się) tylko w jednej, konkretnej sytuacji: dla i=2. Dla wszystkich pozostałych: pętla się nie wykona. Przyjrzyj się czy warunek nie powinien wynosić np. k >= 1 (to samo dotyczy pętli poniżej)

    0
  • #3 25 Paź 2010 09:23
    shishibi
    Poziom 8  

    zadzialalo :) jestem Twoim dluznikiem

    0