Zacharry Ответов: 1

Игра в змей. Тело не убирают :(


Таким образом, тело было инициализировано в исходное положение и не удаляется с доски, когда начинается игра. Уходя к этому выступающему в качестве препятствия.

Чтобы запустить код:

gcc-o змеи Змеи. c-lncurses
Затем
./Змеи

Что я уже пробовал:

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

#define LEN 22 	//this will be the size of the game	
#define DOWN 2 //defines the movement value sequentially 
#define UP 3
#define LEFT 4
#define RIGHT 5

//Void function for creating the games map
void boardGeneration(int x, int y, char map[][LEN])
{
	int Rows;
	int Cols;
	for(Rows = 0; Rows < LEN ; Rows++)
	{
		for(Cols = 0; Cols < LEN ; Cols++)
		{
			mvaddch(Rows+1,Cols+1,map[Rows][Cols]);
		}
	}
	mvaddch(y+1, x+1, '#');	//movement of the snakes head around the baord
}

//Function to determine next position of food
int foodLocation(void){
		srand(time(NULL)); 	//Generates random seed

		return (rand()%10); //Return comand of the random number
}
	

int main(){
  int start = 1;
  printf("Do you want to start playing Snakes?\nType 1 for Yes or 2 for No: ");
  scanf("%d", &start);

  while (start == 1){

	int score=0;	//Initialises score value for game
  	char map[][LEN]={" -------------------- ",  	//Defines map boundaries
                   	 "|                    |", 
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
                   	 "|                    |",
				   	 "|                    |",
				   	 "|                    |",
				   	 "|                    |",
				   	 "|                    |",
				   	 "|                    |",
				   	 " -------------------- ",				   
  };
	map[foodLocation()][foodLocation()]='$';
  	keypad(initscr(),TRUE);	//Allows terminal to read from keypad
  	curs_set(0); 	//Removes cursor symbol

	mvprintw(2,23," You are now playing SNAKE'S ");		//Print comments on game screen
	mvprintw(3,23," Move around the screen with your arrows ");
	mvprintw(4,23," But, be mindful of your tail and the walls! ");
	mvprintw(11,23," End game by pressing 'e' ");

  	int PosX=11; 		//initiaised location to the center of board
  	int PosY=11;
  	int inc=1;
  	int snakeLength=5; 	//Make snake initial length
  	int xvalue[100];   	//stores previous position
  	int yvalue[100];								
  	int i;
  	int movement; 		//place holder for movement direction 
  
  	char c;       		//initialised end game charactor 
 
		while(c!='e'){

			mvprintw(10,23," Current score %d", score);		
			boardGeneration(PosX,PosY,map); //updating displayed array
			c=getch(); //reading a single character from keyboard
			map[PosY][PosX]='*';//updates position of curser in array
			
			switch(c){
				case UP:
					PosY--;
					movement=UP;
					break;
				case DOWN:
					PosY++;
					movement=DOWN;
					break;
				case LEFT:
					PosX--;
					movement=LEFT;
					break;
				case RIGHT:
					PosX++;
					movement=RIGHT;
					break;
				
			}
			if(map[PosY][PosX]=='$'){
				snakeLength = snakeLength + 1;	//increases the length of the snake
				score = score + 1;		//updates score when food is eaten
				if((PosY+PosX)<=20){
					map[foodLocation()+10][foodLocation()+10]='$';	//updates food position on map
				}
			else{
				map[foodLocation()][foodLocation()]='$';
			}
		}

		xvalue[0]=PosX; //current position is first in the array
		yvalue[0]=PosY;
		for(i=snakeLength;i>0;i--){ //loop for transferring past postions in the x position
			xvalue[i]=xvalue[i-1];
		}
		for(i=snakeLength;i>0;i--){	//loop for transferring past postions in the y position
			yvalue[i]=yvalue[i-1];
		}
		if(inc==snakeLength){
			map[yvalue[snakeLength]][xvalue[snakeLength]]=' '; //Removes old position
		}
		if(inc<snakeLength){
			inc=inc+1;
		}
		
		if(map[PosY][PosX]=='-'|| map[PosY][PosX]=='|'){ //game over if the xursor position hits the boundary
		break;
		}		
		if(map[PosY][PosX]=='*' && snakeLength>4){ // game over if cursor runs into body
		break;
		}	
	}
	endwin();
		if (map[PosY][PosX]=='-'|| map[PosY][PosX]=='|'){		// print comands to tell the user how/why the game ended
			printf("\nYou just ran into a wall and died\nYour score was %d\n\n",score);
		}
		else if ('e'){
			printf("\nThanks for playing\nYour score was %d\n\n", score);
		}
		else if (map[PosY][PosX]=='*'){
			printf("\nYou just tried to eat yourself and died\nYor score was %d\n\n", score);
		}
			printf("Do you want to play Snakes again?\nType 1 for Yes or 2 for No: ");
  			scanf("%d", &start);
  		if (start == 2){
  			printf("\nYou chose not to play right now\nBYE\n");
  		}
	}	
}

Richard MacCutchan

И мы должны догадываться, что происходит и где?

Zacharry

Таким образом, змея предназначена для того, чтобы передвигаться по доске и собирать"$", но у меня есть проблема, которая заключается в том, что тело остается позади

Richard MacCutchan

Ваш код может быть легче понять, если вы разделите свой основной метод на отдельные функции. Создайте функцию, которая обрабатывает движения змеи, а затем выполните несколько тестов, чтобы увидеть, как она себя ведет. Тогда вы сможете быстро определить, где что-то идет не так.

1 Ответов

Рейтинг:
1

KarstenK

Вы должны перерисовать все измененное содержимое. Или, может быть, вы неправильно изменили положение змеи.

Чаевые:

1. Используйте отладчик, чтобы найти проблему.
2. внедрите в свой код некоторое ведение журнала отладки (он же трассировка).
3. развивайте больше увлеченности и терпения в кодировании

;-)


Zacharry

Да, видите ли, я уже пробовал это сделать и не могу сузить круг проблем. Есть ли какие-нибудь советы по коду?

jeron1

Прохождение кода с помощью отладчика не помогает?

Zacharry

Не совсем? Какой отладчик вы используете?

jeron1

Visual studio. Большинство, если не все отладчики позволяют вам установить точку останова и пошагово пройти через рассматриваемый код, где вы можете увидеть значения всех ваших переменных и сразу же увидеть эффект любого заданного вызова функции на экране и на переменных. Это исключительно мощный инструмент, вы не можете сделать намного лучше, чем это.