Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Sono alle prime armi, tento di fare il gioco sneak(serpente che si mangia i frutti e si allunga)
Forum - C/C++ - Sono alle prime armi, tento di fare il gioco sneak(serpente che si mangia i frutti e si allunga)

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
sebas (Normal User)
Newbie


Messaggi: 6
Iscritto: 14/08/2014

Segnala al moderatore
Postato alle 19:34
Lunedì, 25/08/2014
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <conio.h>
  4. #include <cstdlib>
  5. #include <ctime>
  6. using namespace std;
  7.  
  8.  
  9. void gotoxy(int x, int y)/*Funzione che mi posiziona il cursore in un punto di coord x,y*/
  10.         {
  11.                
  12.                 COORD coord;
  13.                 coord.X = x;
  14.                 coord.Y = y;
  15.                 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
  16.         }
  17.  
  18. bool impatto(int cord1, int cord2, int cord3, int cord4){
  19.                 if (cord1 == cord3 && cord2 == cord4){
  20.                         return true;
  21.                 }
  22.                 else { return false; }
  23.         }
  24.  
  25.  
  26.  
  27. int FruttoPosiz(int xf,int yf)
  28. {
  29.         srand(time(0));
  30.                         xf = 5 + (rand() % 45);
  31.                         yf = 6 + (rand() % 14);
  32.                         gotoxy(xf, yf);
  33.                         cout << "&";
  34.                         return xf, yf;
  35.                         }
  36.  
  37. int main()
  38. {
  39.         int a(0),b(0);
  40.         int x(20), y(15);
  41.  
  42.     FruttoPosiz(a,b);
  43.         gotoxy(5, 20);
  44.         cout << "###############################################";
  45.         gotoxy(5, 5);
  46.         cout << "###############################################";
  47.         gotoxy(1, 4);
  48.         cout << "Seba'sGames";
  49.         for (int a = 5; a < 20; a++){
  50.                 gotoxy(5, a);
  51.                 cout << "#";
  52.         }
  53.         for (int a = 5; a < 20; a++){
  54.                 gotoxy(51, a);
  55.                 cout << "#";
  56.         }
  57.        
  58.         if (a == x && b == y){
  59.                 cout << "colpito";
  60.         }
  61.         do{
  62.                 if (_getch() == 'w') {
  63.                         gotoxy(x, y);
  64.                         --y;
  65.                         cout << "O";
  66.                         gotoxy(x, y+2);
  67.                         cout << " ";
  68.                         if (y == 6){
  69.                                 y = y + 1;
  70.                         }
  71.                 }
  72.                 else if (_getch() == 's'){
  73.                         gotoxy(x, y);
  74.                         ++y;
  75.                         cout << "O";
  76.                         gotoxy(x, y-2);
  77.                         cout << " ";
  78.                         if (y == 19){
  79.                                 y = y - 1;
  80.                         }
  81.                 }
  82.                 else if (_getch() == 'a'){
  83.                         gotoxy(x, y);
  84.                 --x;
  85.                         cout << "O";
  86.                         gotoxy(x +2 , y);
  87.                         cout << " ";
  88.                         if (x == 6){
  89.                                 x = x + 1;
  90.                         }
  91.                 }
  92.                 else if (_getch() == 'd'){
  93.                         gotoxy(x, y);
  94.                         ++x;
  95.                         cout << "O";
  96.                         gotoxy(x-2, y);
  97.                         cout << " ";
  98.                         if (x == 49){
  99.                                 x = x - 1;
  100.                         }
  101.                 }
  102.         } while (1 != 3);
  103. return 0;
  104. }


Io uso visual studio 2013.

Prima domanda: eseguitelo e premete w,s,d,a quando cambia direzione fa qualcosa di strano e mi lascia stampato una "O".
Poi come faccio a usare le coordinate xf,yf della funzione FruttoPosz per fare in modo che quando sono uguali alle coordinate della "O" succeda qualcosa vorrei fare tipo: if (xf = x && yf = y){cout<<"Hai mangiato un frutto";} L'idea era di usare la funzione impatto, ma non ci riesco.
Necessito anche di qualche consiglio su come far allungare il "serpente" di "O" dopo che sei passato sul "frutto"

Ultima modifica effettuata da sebas il 25/08/2014 alle 20:00
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:59
Lunedì, 25/08/2014
Per cominciare ... il gioco si chiama "snake" ...

Per il resto ... troppe domande nello stesso thread ... comincia a focalizzarti su un problema, uno per volta ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:41
Lunedì, 25/08/2014
Per le collisioni ti posso consigliare di memorizzare la posizione delle O in un vettore, così la funzione collisione cercherà in quel vettore o sulla stessa posizione della testa del serpente: http://www.cplusplus.com/reference/vector/vector/

Esempio
Codice sorgente - presumibilmente C++

  1. struct posizione
  2. {
  3.            int X,
  4.            int Y
  5. };
  6.  
  7. bool impatto(int cord1, int cord2, vector<posizione> O){
  8.             size_t indice;
  9.             for(indice = 0; indice < O.size(); indice++)
  10.             {
  11.                     if ((coord1 == O[indice].X) && (coord2 == O[indice].Y))
  12.                             return true;
  13.             }
  14.             return false;


PM Quote
Avatar
sebas (Normal User)
Newbie


Messaggi: 6
Iscritto: 14/08/2014

Segnala al moderatore
Postato alle 0:10
Martedì, 26/08/2014
Grazie, ora me lo studio perche non so nemmeno cos'è un vettore!

PM Quote
Avatar
sebas (Normal User)
Newbie


Messaggi: 6
Iscritto: 14/08/2014

Segnala al moderatore
Postato alle 14:24
Mercoledì, 27/08/2014
Il problema della collisione l'ho risolto facendo due funzioni separate, una per la x del frutto e l'altra per la y, assegnandogli come valore di ritorni rispettivamente la x e la y, nella main ho eguagliato ognuna delle due funzioni a una variabile che quindi acquista il valore di ritorno della funzione, poi ho eguagliato i valori di ritorno a quelli delle coordinate della testa del serpente e funziona. Ora resta il problema del cambio di direzione perche quando vado a destra,(e lo fa solo se prima andavo in su o in giu), fa uno scatto verso l'alto e poi comincia a girare, non capisco perche, sapete come risolvere questo problema?


Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <conio.h>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <vector>
  7. using namespace std;
  8.  
  9.  
  10. void gotoxy(int x, int y)/*Funzione che mi posiziona il cursore in un punto di coord x,y*/
  11.         {
  12.                
  13.                 COORD coord;
  14.                 coord.X = x;
  15.                 coord.Y = y;
  16.                 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
  17.         }
  18.  
  19.  
  20.  
  21. int FruttoPosiz1(int xf=0){
  22.         srand(time(0));
  23.                 xf = 5 + (rand() % 45);
  24.                 return xf;
  25. }
  26. int FruttoPosiz2(int yf=0){
  27.         srand(time(0));
  28.         yf = 6 + (rand() % 14);
  29.         return yf;
  30. }
  31.  
  32.  
  33.  
  34.  
  35.  
  36. int main()
  37. {
  38.         int a(0),b(0);
  39.         int x(20), y(15);
  40.  
  41.    
  42.         gotoxy(5, 20);
  43.         cout << "###############################################";
  44.         gotoxy(5, 5);
  45.         cout << "###############################################";
  46.         gotoxy(1, 4);
  47.         cout << "Seba'sGames";
  48.         for (int a = 5; a < 20; a++){
  49.                 gotoxy(5, a);
  50.                 cout << "#";
  51.         }
  52.         for (int a = 5; a < 20; a++){
  53.                 gotoxy(51, a);
  54.                 cout << "#";
  55.         }
  56.         a = FruttoPosiz1(a);
  57.         b = FruttoPosiz2(b);
  58.         gotoxy(a, b);
  59.         cout << "&";
  60. do{
  61.                 if (_getch() == 'w') {
  62.                         gotoxy(x, y);
  63.                         --y;
  64.                         cout << "O";
  65.                         gotoxy(x, y+2);
  66.                         cout << " ";
  67.                         if (y == 6){
  68.                                 y = y + 1;
  69.                         }
  70.                 }
  71.                 else if (_getch() == 's'){
  72.                         gotoxy(x, y);
  73.                         ++y;
  74.                         cout << "O";
  75.                         gotoxy(x, y-2);
  76.                         cout << " ";
  77.                         if (y == 19){
  78.                                 y = y - 1;
  79.                         }
  80.                 }
  81.                 else if (_getch() == 'a'){
  82.                         gotoxy(x, y);
  83.                 --x;
  84.                         cout << "O";
  85.                         gotoxy(x + 2, y);
  86.                         cout << " ";
  87.                         if (x == 6){
  88.                                 x = x + 1;
  89.                         }
  90.                 }
  91.                 else if (_getch() == 'd'){
  92.                         gotoxy(x, y);
  93.                         x++;
  94.                         cout << "O";
  95.                         gotoxy(x-2, y);
  96.                         cout << " ";
  97.                         if (x == 49){
  98.                                 x = x - 1;
  99.                         }
  100.                 }
  101.                 if (x == a && y == b){
  102.                         cout << "Frutto mangiato";
  103.                 }
  104.         } while (1 != 3);
  105. return 0;
  106. }


PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 15:14
Mercoledì, 27/08/2014
Testo quotato

Postato originariamente da sebas:

Il problema della collisione l'ho risolto facendo due funzioni separate, una per la x del frutto e l'altra per la y, assegnandogli come valore di ritorni rispettivamente la x e la y



Ovviamente le struct sono roba sconosciuta e oscura per te al momento, vero?
Separare la parte logica del gioco da quella in cui prendi un comando e stampi a video pensi sia sbagliato?
E poi hai fatto il debug di quel codice?

PM Quote
Avatar
sebas (Normal User)
Newbie


Messaggi: 6
Iscritto: 14/08/2014

Segnala al moderatore
Postato alle 18:30
Mercoledì, 27/08/2014
Si al momento non so che roba siano le struct o come si usino, non so come separare la parte logica, non so fare niente, so come funziona una funzione ma gia per usarla..... comunque il debug l'ho fatto e funziona perfettamente.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 19:04
Mercoledì, 27/08/2014
il debug serve per trovare gli errori logici. Comunqe separare la parte logica è abbastanza facile: memorizzi la posizione di tutto ciò che ti serve in delle variabili/strutture. Ad ogni pressione  di tasti aggiorni tutto e stampi a video, ovvero costruisci quelllo che deve essere stampato a video da quelle variabili.

Posso farti vedere come diventano FruttoPosiz1 FruttoPosiz2 con una struct:

Codice sorgente - presumibilmente C++

  1. struct PosizioneFrutto {
  2.     int X,
  3.     int Y
  4. };
  5.  
  6. void RiposizionaFrutto(struct PosizioneFrutto *Frutto)
  7. {
  8. srand(time(NULL));
  9. Frutto.X = 5 + (rand() % 45);
  10. Frutto.Y = 6 + (rand() % 14);
  11. }
  12.  
  13. //Per chiamare la funzione fai:
  14. void FruttoPosiz(&MioFrutto);
  15.  
  16. //dove MioFrutto è una variabile di tipo struct PosizioneFrutto, quindi:
  17. //struct PosizioneFrutto MioFrutto



In questo modo hai:
reso  il codice più snello, più comprensibile, usato i puntatori e ti sei sbarazzato di quell' orrore di:

a = FruttoPosiz1(a);
b = FruttoPosiz2(b);

PM Quote
Avatar
sebas (Normal User)
Newbie


Messaggi: 6
Iscritto: 14/08/2014

Segnala al moderatore
Postato alle 20:30
Mercoledì, 27/08/2014
Grazie, mi sono letto come funziona struct, adesso faccio le modifiche!
Per favore pero mi spiegheresti cosè l'asterisco prima di frutto riga 6, il null al posto dello zero riga 8 srand(time(null)) e cosa significa Frutto.X.
Lo so sono un rompipalle, ma ci metto ore a cercare di capire tutto cercando qualche sito che me lo spiega!
grazie ancora

Ultima modifica effettuata da sebas il 27/08/2014 alle 20:34
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo