Oppure

Loading
25/08/14 17:34
sebas
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <cstdlib>
#include <ctime>
using namespace std;


void gotoxy(int x, int y)/*Funzione che mi posiziona il cursore in un punto di coord x,y*/
	{
		
		COORD coord;
		coord.X = x;
		coord.Y = y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
	}

bool impatto(int cord1, int cord2, int cord3, int cord4){
		if (cord1 == cord3 && cord2 == cord4){
			return true;
		}
		else { return false; }
	}



int FruttoPosiz(int xf,int yf)
{
	srand(time(0));
			xf = 5 + (rand() % 45);
			yf = 6 + (rand() % 14);
			gotoxy(xf, yf);
			cout << "&";
			return xf, yf;
			}

int main()
{
	int a(0),b(0);
	int x(20), y(15);

    FruttoPosiz(a,b);
	gotoxy(5, 20);
	cout << "###############################################";
	gotoxy(5, 5);
	cout << "###############################################";
	gotoxy(1, 4);
	cout << "Seba'sGames";
	for (int a = 5; a < 20; a++){
		gotoxy(5, a);
		cout << "#";
	}
	for (int a = 5; a < 20; a++){
		gotoxy(51, a);
		cout << "#";
	}
	
	if (a == x && b == y){
		cout << "colpito";
	}
	do{
		if (_getch() == 'w') {
			gotoxy(x, y);
			--y;
			cout << "O";
			gotoxy(x, y+2);
			cout << " ";
			if (y == 6){
				y = y + 1;
			}
		}
		else if (_getch() == 's'){
			gotoxy(x, y);
			++y;
			cout << "O";
			gotoxy(x, y-2);
			cout << " ";
			if (y == 19){
				y = y - 1;
			}
		}
		else if (_getch() == 'a'){
			gotoxy(x, y);
	        --x;
			cout << "O";
			gotoxy(x +2 , y);
			cout << " ";
			if (x == 6){
				x = x + 1;
			}
		}
		else if (_getch() == 'd'){
			gotoxy(x, y);
			++x;
			cout << "O";
			gotoxy(x-2, y);
			cout << " ";
			if (x == 49){
				x = x - 1;
			}
		}
	} while (1 != 3);
return 0;
}


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 25/08/14 18:00
aaa
25/08/14 17:59
nessuno
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
25/08/14 18:41
TheDarkJuster
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: cplusplus.com/reference/vector/vector/

Esempio
struct posizione
{
           int X,
           int Y
};

bool impatto(int cord1, int cord2, vector<posizione> O){
            size_t indice;
            for(indice = 0; indice < O.size(); indice++)
            {
                    if ((coord1 == O[indice].X) && (coord2 == O[indice].Y))
                            return true;
            }
            return false;
aaa
25/08/14 22:10
sebas
Grazie, ora me lo studio perche non so nemmeno cos'è un vettore!
aaa
27/08/14 12:24
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, 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?


#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;


void gotoxy(int x, int y)/*Funzione che mi posiziona il cursore in un punto di coord x,y*/
	{
		
		COORD coord;
		coord.X = x;
		coord.Y = y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
	}



int FruttoPosiz1(int xf=0){
	srand(time(0));
		xf = 5 + (rand() % 45);
		return xf;
}
int FruttoPosiz2(int yf=0){
	srand(time(0));
	yf = 6 + (rand() % 14);
	return yf;
}





int main()
{
	int a(0),b(0);
	int x(20), y(15);

    
	gotoxy(5, 20);
	cout << "###############################################";
	gotoxy(5, 5);
	cout << "###############################################";
	gotoxy(1, 4);
	cout << "Seba'sGames";
	for (int a = 5; a < 20; a++){
		gotoxy(5, a);
		cout << "#";
	}
	for (int a = 5; a < 20; a++){
		gotoxy(51, a);
		cout << "#";
	}
	a = FruttoPosiz1(a);
	b = FruttoPosiz2(b);
	gotoxy(a, b);
	cout << "&";
do{
		if (_getch() == 'w') {
			gotoxy(x, y);
			--y;
			cout << "O";
			gotoxy(x, y+2);
			cout << " ";
			if (y == 6){
				y = y + 1;
			}
		}
		else if (_getch() == 's'){
			gotoxy(x, y);
			++y;
			cout << "O";
			gotoxy(x, y-2);
			cout << " ";
			if (y == 19){
				y = y - 1;
			}
		}
		else if (_getch() == 'a'){
			gotoxy(x, y);
	        --x;
			cout << "O";
			gotoxy(x + 2, y);
			cout << " ";
			if (x == 6){
				x = x + 1;
			}
		}
		else if (_getch() == 'd'){
			gotoxy(x, y);
			x++;
			cout << "O";
			gotoxy(x-2, y);
			cout << " ";
			if (x == 49){
				x = x - 1;
			}
		}
		if (x == a && y == b){
			cout << "Frutto mangiato";
		}
	} while (1 != 3);
return 0;
}
aaa
27/08/14 13:14
TheDarkJuster
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?
aaa
27/08/14 16:30
sebas
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.
aaa
27/08/14 17:04
TheDarkJuster
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:

struct PosizioneFrutto {
    int X,
    int Y
};

void RiposizionaFrutto(struct PosizioneFrutto *Frutto)
{
srand(time(NULL));
Frutto.X = 5 + (rand() % 45);
Frutto.Y = 6 + (rand() % 14);
}

//Per chiamare la funzione fai:
void FruttoPosiz(&MioFrutto);

//dove MioFrutto è una variabile di tipo struct PosizioneFrutto, quindi:
//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);
aaa