65.9K
CodeProject 正在变化。 阅读更多。
Home

Win32 控制台贪吃蛇游戏

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.35/5 (18投票s)

2010年6月3日

CPOL

2分钟阅读

viewsIcon

98882

downloadIcon

4725

Win32 控制台中的贪吃蛇游戏

引言

贪吃蛇游戏是一个广受欢迎的游戏。它已经被制作了无数次,并且可以在任何设备上玩。贪吃蛇的变种运行在手机到大型机等各种设备上,并且贪吃蛇已经用大多数主流编程语言编写,从 BASIC、C/C++、Pascal、Java、C# 到其他任何语言。今天,我们将看看一个用 C/C++ 编写的贪吃蛇游戏,它设计用于在 Win32 控制台中运行,使用文本字符。

那么,贪吃蛇是什么以及它是如何工作的呢?我们的贪吃蛇只是一个文本字符,在屏幕上指定的边界内移动,吞噬随机放置在该边界内的苹果。我们的蛇将其 x y 坐标与苹果的坐标进行比较,以查看是否发生了碰撞,也就是说,如果我们的蛇吃掉了苹果。如果是,则该苹果被移除,并在指定的边界内随机放置一个新的苹果,我们的蛇就会
进行身体移植,它被延长了。我们所需要做的就是处理用户的键盘命令并绘制蛇。我们将使用 <LEFT><RIGHT><UP><DOWN> 键来控制蛇。

所以让我们开始吧。

我们像往常一样,通过创建一个项目和一个类开始,然后我们继续通过使用成员来体现该类。我们选择不在头文件中定义和体现我们的成员函数,我们只是将原型放在一个单独的文件中。

项目文件是

CSnake_main.cpp 主文件
CSnake.cpp 类定义和方法体文件
CSnake.h 类声明文件

我们将把变量、原型和函数头文件的声明放在 CSnake.h 中。

class CSnake
{
	public:

		int snakeXLocation[201];
		int snakeYLocation[201];
		int color_background, color_border  , color_apple , 
				color_normal , color_snake ;  //  colors
		int snake, prvSnake, snake_Enlongment ;
		int randomX, randomY, apple ;
		int level ;
		int score ;
		char playAgain;

		int i, j;
		int centerX, centerY;
		int x, y, oldX, oldY;
		int lines, columns;
		char c;
		int direction, difficulty;

	public:
		CSnake();
		CSnake( int i);
		~CSnake();

	public:

	   void Settings();
	   void Game_Main();
	   void game_Canvas();
	   void initsnake();
	   void check_collision();
	   void keyPressed();
	   void Display_snake();
	   void check_Snake_Location();
	   void Create_Apples();
	   void Check_Apples();
	   void Remove_Apple();
	   void Game_Over();
	   void Display();

		void gotoxy(int x, int y);
		void clrscr();
		void setcolor(WORD color);
		void clrbox(unsigned char x1,unsigned char y1,
			unsigned char x2,unsigned char y2,unsigned char bkcol);
		void box(unsigned x,unsigned y,unsigned sx,unsigned sy,
			unsigned char col,unsigned char col2,char text_[]);
		void putbox(unsigned x1,unsigned y1,unsigned x2,unsigned y2,
			unsigned char texcol,unsigned char frcol,
			unsigned char bkgcol,char bheader[]);
};

并在 CSnake.cpp 中让贪吃蛇复活。
现在让我们来看看 CSnake.cpp 中包含的一些重要方法。

Create_Apples() 方法

Create_Apples() 方法创建一个新的苹果并将其随机放置在指定的边界内。

/***************************
 *   create apples         *
****************************/
void CSnake::Create_Apples()
{
   setcolor(color_apple);
   randomX= ( rand()% columns )+ centerX ;
   randomY= ( rand()% lines)+ centerY  ;
   for(i=1;i<=snake;i++)
   {
      if((randomX==snakeXLocation[i])&&(randomY==snakeYLocation[i])) Create_Apples();
   }
   gotoxy(randomX,randomY); printf("%c",770);
   if(score==1)getch();
} 

Check_Apples() 方法

Check_Apples() 方法将蛇的位置与苹果的位置进行比较,如果它们发生了碰撞,蛇就会进行身体移植,它会被延长,苹果被移除,并在边界内随机放置一个新的苹果。

/***************************
 *   check apples          *
****************************/
void CSnake::Check_Apples()
{
	if((snakeXLocation[1]==randomX)&&(snakeYLocation[1]==randomY))
	{
       	       apple++;
	       Remove_Apple();
	       snake+=snake_Enlongment;
	       Create_Apples();
	}
} 

Display_snake() 方法

Display_snake() 方法在 for 循环中绘制蛇并延长蛇的身体。 Display_snake() 还打印出分数以及剩余的苹果数量。

/***************************
 *   display snake         *
****************************/
void CSnake::Display_snake()
{
   for(i=snake;i>=0;i--)
   {
      gotoxy(snakeXLocation[i],snakeYLocation[i]);
      if(i==0)
	  {
              setcolor(color_background);
              printf("%c",177);
      }else setcolor(color_snake);
         if(i==1)           printf("%c",178);
         if((i!=0)&&(i!=1)) printf("%c",219);
   }
   setcolor (color_normal);
   gotoxy(centerX-1,centerY+lines+2);
   printf("level: %2.d",level);
   gotoxy(centerX-1,centerY+lines+2+1);
   printf(" apple(s) :%2.d/%2.d ",apple,(((lines*columns)/30)+6));
   setcolor (color_background);
} 

keyPressed() 方法

keyPressed() 方法只获取用户从键盘发出的命令并设置蛇的方向。使用 <LEFT><RIGHT><UP><DOWN> 键来控制蛇。

 /***************************
 *   keypressed             *
****************************/
	void CSnake::keyPressed()
{
   if(kbhit())
   {                           //
      c=getch();
      switch(c)
	  {
         case RIGHT :
			 if(direction!=3)
			 {
                       x++ ;
                       direction=1;
                       }else x-- ;
			 break;
	         case LEFT:
			 if(direction!=1)
			 {
                       x-- ;
                       direction=3;
                       }else x++ ;
			 break;
	         case DOWN :
			 if(direction!=2)
			 {
                       y++ ;
                       direction=4;
                       }else y-- ;
			 break;
	         case UP  :
			 if(direction!=4)
			 {
                       y-- ;
                       direction=2;
	                       }else y++ ;
			 break;
	         case SPACE : getch() ; break;
      }
   }
} 

主文件

最后,CSnake_main.cpp 文件是我们为类创建一个实例并运行我们的贪吃蛇游戏的地方。

#include "CSnake.h"

int main()
{
  CSnake *snake = new CSnake(1);

  return 0;
}

感谢阅读。

© . All rights reserved.