Gra Snake, poruszanie się

0

Witam
Mam problem z poruszaniem się węża, po naciśnięciu strzałki tworzy się tylko jeden element, a poprzedni się nie zeruje. Wiem, że dużo rzeczy jeszcze nie jest napisane, oraz dużo rzeczy nie wykorzystanych, jednak na razie chciałbym aby działało samo poruszanie się po planszy. Proszę o pomoc.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define WYS 50	// 296 do gory , 304 dol, 299 lewo, 301 prawo
#define SZER 50	

typedef struct tab{
	int value;
	struct tab *ogon;
} Tab;

int CreateMap(Tab ***tab);
void Show(Tab **tab);
int Odczytaj(int *temp);
void Losuj(Tab **tab, int zebrano);
void Ruch(Tab **tab, int odczytaj, Tab *glowa, int temp);

int main(){
	int temp;
	int err, flag = 0, x, y, zebrano = 0, odczytaj;
	Tab **tab, *glowa;
	srand(time(NULL));

	if (CreateMap(&tab)){
		fprintf(stderr, "Blad z alokacja");
		return 1;
	}

	x = rand() % SZER;
	y = rand() % WYS;

	tab[y][x].value = 2;
	tab[20][20].value = 1;

	glowa = &tab[20][20];

	while(temp != 3){

		odczytaj = Odczytaj(&temp);
		system("cls");
		Losuj(tab, zebrano);
		Ruch(tab, odczytaj, glowa, temp);		
		Show(tab);
		Sleep(100);
		printf("-------------------------");

	}
	return 0;
}

int CreateMap(Tab ***tab){
	int i, j, x, y;
	//ALOKACJA TAB
	*tab = (Tab**)malloc(WYS * sizeof(Tab*));
	if (*tab == NULL){
		fprintf(stderr, "Blad alokacji!");
		return 1;
	}
	for (i = 0; i < WYS; i++){
		(*tab)[i] = (Tab*)malloc(SZER * sizeof(Tab));
		if ((*tab)[i] == NULL){
			fprintf(stderr, "Blad alokcji %d wiersza", i);
			for (j = 0; j < i; j++)
				free((*tab)[j]);
			return 1;
		}
	}
	for (i = 0; i < WYS; i++){
		for (j = 0; j < SZER; j++){
			(*tab)[i][j].ogon = NULL;
			(*tab)[i][j].value = 0;
		}
	}
	return 0;
}


void Show(Tab **tab){
	int i, j;

	for (i = 0; i < WYS; i++){
			for (j = 0; j < SZER; j++){
				if (tab[i][j].value == 0)
					printf(" ");
				else
					printf("*");
			}
			printf("\n");
		}


}
int Odczytaj(int *temp){

	if(*temp = getch()){
		if (*temp == 224)
			*temp += getch();
		return 1;
	}
	else
		return 0;

}

void Losuj(Tab **tab, int zebrano){
	int x, y;

	if (zebrano){
			x = rand() % SZER;
			y = rand() % WYS;
			tab[y][x].value = 2;
			zebrano = 0;
		}

}
void Ruch(Tab **tab, int odczytaj, Tab *glowa, int temp){
	int i, j;

	if (odczytaj){
		if (temp == 296){//GORA
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa - SZER;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
		else if (temp == 304){//DOL
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa + SZER;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
		else if (temp == 299){//LEWY
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa - 1;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
		else if (temp == 301){//PRAWY
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa + 1;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
	}
} 
0

Machnij sobie bufor gdzie będziesz zapamiętywał początek i koniec węża. A potem przesuwaj to dodając jeden element na początek, a kasując ten na końcu. Skasuj kod ten co masz i jeszcze raz przemyśl z kartką papieru działanie węża. Te 'potrójne' wskaźniki mnie przerażają.

0

Co prawda nie wiele poprawiłem, ale na prawdę nie wiem czemu mój jednoelementowy wąż się nie porusza, wiem że mój kod nie jest optymalny bo za każdym razem wypisuje wszystko od nowa, ale chciałbym żeby algorytm który wymyśliłem zadziałał.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define WYS 50	// 296 do gory , 304 dol, 299 lewo, 301 prawo
#define SZER 50	

typedef struct tab{
	int value;
	struct tab *ogon;
} Tab;

Tab tab[WYS][SZER];
Tab *glowa = &tab[20][20];

void Show();
int Odczytaj(int temp);
void Losuj(int zebrano);
void Ruch(int odczytaj, int temp);

int main(){
	int temp;
	int err, flag = 0, x, y, zebrano = 0, odczytaj, i, j;
	srand(time(NULL));

	for (i = 0; i < WYS; i++){
		for (j = 0; j < SZER; j++){
			tab[i][j].ogon = NULL;
			tab[i][j].value = 0;
		}
	}

	x = rand() % SZER;
	y = rand() % WYS;

	tab[y][x].value = 2;
	tab[20][20].value = 1;


	while(temp != 3){

		odczytaj = Odczytaj(temp);
		system("cls");
		Losuj(zebrano);
		Ruch(odczytaj, temp);		
		Show();
		Sleep(100);

	}
	return 0;
}


void Show(){
	int i, j;

	for (i = 0; i < WYS; i++){
			for (j = 0; j < SZER; j++){
				if (tab[i][j].value == 0)
					printf(" ");
				else
					printf("*");
			}
			printf("\n");
		}


}
int Odczytaj(int temp){

	if(temp = getch()){
		if (temp == 224)
			temp += getch();
		return 1;
	}
	else
		return 0;

}

void Losuj(int zebrano){
	int x, y;

	if (zebrano){
			x = rand() % SZER;
			y = rand() % WYS;
			tab[y][x].value = 2;
			zebrano = 0;
		}

}
void Ruch(int odczytaj, int temp){
	int i, j;

		if (temp == 296){//GORA
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa - SZER;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
		else if (temp == 304){//DOL
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa + SZER;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
		else if (temp == 299){//LEWY
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa - 1;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
		else if (temp == 301){//LEWY
			glowa->ogon = NULL;
			glowa->value = 0;
			glowa = glowa + 1;
			glowa->value = 1;
			glowa->ogon = NULL;
		}
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1