prosty konsolowy snake w C

0

Witam
zacząłem dzisiaj się trochę bawić z tablicami 2 wymiarowymi i postanowiłem zrobić prostą grę typu snake, jednak za chiny ludowe nie potrafię wymyślić co zrobić z ogonem, próbowałem to zrobić na kilka sposobów ale jedynie ten jest jak minimalnie zbliżony do tego co chcę uzyskać. Proszę o jakiekolwiek rady czy też naprowadzenie :) . Wiem, że można to zrobić dużo lepiej z biblioteką conio.h bardziej zależy mi na zrozumieniu mechanizmu.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int gameover = 1;
int i,j;
int plansza[50][20];
int wysokosc = 20, szerokosc = 50;
int snakex=25,snakey=25;
int rozmiar = 5; 
int jedzeniex=25, jedzeniey=25;
int historiax[1000], historiay[1000];
int ile = 0;
char odp;
	
void draw(){ 

for(i=0;i<wysokosc;i++){
	for(j=0;j<szerokosc;j++){
		plansza[j][i] = ' ';
		if(i==0)
			plansza[j][i] = '#';
		if(j==0)
			plansza[j][i] = '#';
		if(j==szerokosc-1)
			plansza[j][i] = '#';
		if(i==wysokosc-1)
			plansza[j][i] = '#';
	
	}	
}

}

void show(){
system("cls");
	for(i=0;i<wysokosc;i++){
		for(j=0;j<szerokosc;j++){
			printf("%c", plansza[j][i]);
		}
	printf("\n");
	}
}

void snake(){
	ile++;
	srand(time(0));	
	odp = getchar();	
	switch(odp){
		case 'a':
			snakex--;
			break;
		case 'd':
			snakex++;
			break;
		case 's':
			snakey++;
			break;
		case 'w':
			snakey--;
			break;
	}
	
		
			historiax[ile] = snakex;
			historiay[ile] = snakey;
			
			plansza[snakex][snakey] = 'O';
			plansza[historiax[ile-rozmiar]][historiay[ile-rozmiar]] = 'o';
			if(plansza[snakex][snakey] == plansza[jedzeniex][jedzeniey])
	{
	//score = score + 10;
	rozmiar++;
		do{
		
			jedzeniex = rand()%szerokosc;
			jedzeniey = rand()%wysokosc;
		}while(	plansza[jedzeniex][jedzeniey] == '#');

	}
	plansza[jedzeniex][jedzeniey] = 'F';

	if(snakex == 0 || snakex == szerokosc || snakey==0 || snakey==wysokosc ){
		gameover=0;
	}
	
}
int main()
{

while(gameover){
	
	draw();
	snake();
	show();
}
}

1

Snake'a oczywiście najlepiej trzymać w linked liście.

typedef struct snake
{
  int x, y;
  struct snake *next;
} snake_t;

A ruch węża to po prostu usunięcie ostatniego elementu i dodanie nowego z przodu. Na przykład (może to być nieco mniej czytelne przez to, że wykorzystuję usuwany element jako nową głowę, zamiast tworzyć ją od nowa):

void snake_move(snake_t **snake, enum snake_dir d)
{
  snake_t *head = *snake;
  snake_t *pretail = *snake; // snake segment just before tail
  while (pretail->next->next != NULL)
    pretail = pretail->next;

  snake_t *tail = pretail->next;
  pretail->next = NULL;
  tail->next = *snake;

  switch (d)
  {
    case UP:
      tail->y = head->y-1;
      tail->x = head->x;
      break;

    case DOWN:
      tail->y = head->y+1;
      tail->x = head->x;
      break;

    case LEFT:
      tail->y = head->y;
      tail->x = head->x-1;
      break;

    case RIGHT:
      tail->y = head->y;
      tail->x = head->x+1;
      break;
  }

  *snake = tail;
}
0

właśnie nie chętnie chciałem używać struktur bo jeszcze ich nie umiem ale i tak pięknie dziękuję za pomysł :)

0

Zostawiam dla potomnych <3

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int gameover = 1;
int i,j;
int plansza[50][20];
int wysokosc = 20, szerokosc = 50;
int snakex=25,snakey=25;
int rozmiar = 3; 
int jedzeniex=25, jedzeniey=25;
int historiax[1000], historiay[1000];
int ile = 0;
char odp;
	
void draw(){ 

for(i=0;i<wysokosc;i++){
	for(j=0;j<szerokosc;j++){
		plansza[j][i] = ' ';
		if(i==0)
			plansza[j][i] = '#';
		if(j==0)
			plansza[j][i] = '#';
		if(j==szerokosc-1)
			plansza[j][i] = '#';
		if(i==wysokosc-1)
			plansza[j][i] = '#';
	
	}	
}

}

void show(){
system("cls");
	for(i=0;i<wysokosc;i++){
		for(j=0;j<szerokosc;j++){
			printf("%c", plansza[j][i]);
		}
	printf("\n");
	}
}

void snake(){
	
	srand(time(0));	
	odp = getchar();	
	switch(odp){
		case 'a':
			snakex--;
			break;
		case 'd':
			snakex++;
			break;
		case 's':
			snakey++;
			break;
		case 'w':
			snakey--;
			break;
	}
	
		
		
			for(i=rozmiar;i>0;i--){
			historiax[i] = snakex;
			historiay[i]= snakey;
			if(i!=1){
				
				historiax[i] = historiax[i-1];
				historiay[i] = historiay[i-1];
				plansza[historiax[i]][historiay[i]] = 'o';
			}	
		
			}
			plansza[snakex][snakey] = 'O';
			
		
	if(plansza[snakex][snakey] == plansza[jedzeniex][jedzeniey])
	{
	//score = score + 10;
	rozmiar++;
		do{
		
			jedzeniex = rand()%szerokosc;
			jedzeniey = rand()%wysokosc;
		}while(	plansza[jedzeniex][jedzeniey] == '#');

	}
	plansza[jedzeniex][jedzeniey] = 'F';

	if(snakex == 0 || snakex == szerokosc || snakey==0 || snakey==wysokosc ){
		gameover=0;
	}
	
}
int main()
{

while(gameover){
	
	draw();
	snake();
	show();
}
}

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