c++之贪吃蛇

 
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <iostream>
using namespace std;

//-------------------------------------------------------------------
void GotoXY(int x, int y)      //设定输出位置,定位光标
{
	COORD c;
	c.X = x-1;
	c.Y = y-1;
	SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
//-----------------------------------------------------------------
void color(int a)              //颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
struct HeroList
{
	char Name[10];
	int Highscore;
}Hero[10];
//----------------------------------------------------------
void Save()                    //存储最高分及名字
{
	FILE *fp;
	if((fp=fopen("Hero_list","wb"))==NULL)
	{cout<<"can not open file!"<<endl;return;}
	if(fwrite(&Hero[0],sizeof(struct HeroList),1,fp)!=1)
		cout<<"file write error!"<<endl;
	fclose(fp);
}
//**********************************************************
class Snake
{
     int image[20][20];        //游戏面板,即小蛇活动范围
     int FoodX;                //事物出现的X坐标
     int FoodY;                //事物出现的Y坐标
     int snakeX;               //记录小蛇的头部X坐标
     int snakeY;               //记录小蛇的头部Y坐标
     int head;                 //小蛇头部下标
     int tail;                 //小蛇尾部下标
     int snake[2][2000];         //记录小蛇所有身体的坐标
	 int direction;            //小蛇头部的方向
     int i,j;
	 int gamespeed;            //速度
	 int score;                //记录分数
	 char arrowKey;            //接受按键的变量
	 int GameOver;             //使游戏结束的变量
	 int level;                //设置等级
	 int length;               //为了设置等级而与node一样记录设的长度
public:

	Snake()        //构造函数初始化部分变量
	{
        head=3;                //初始化头部下标
        tail=0;                //初始化尾部下标
    	gamespeed=300;         //游戏速度(移动的间隔时间)
    	score=0;               //初始化分数为0
        direction=6;           //小蛇的初始方向向右
		GameOver=0;            //进入游戏初始化为0
		level=1;
		length=4;
	}
	~Snake()     //析构函数
	{}
	void Init();                //初始化游戏面板及小蛇的坐标
	int  ENTSnake();           //记录小蛇每次移动后头部及身体的下一坐标
	void  Automove();            //使小蛇自动移动
    int  Gameover();            //判断游戏是否结束
	int  Generatefood();        //产生食物
	void display();             //显示游戏面板
	void shiftLeft();           //控制左移
	void shiftRight();          //控制右移
	void shiftDown();           //控制下移
	void shiftUp();	            //控制上移
	int  PlayGame();            //执行游戏的函数
	void Setspeed();            //设置速度
	int Pause();                //游戏的暂停
};
 void Snake::Init()
{

 for(i=0;i<20;i++)
   for(j=0;j<20;j++)
	image[i][j]=0;
 for(i=0;i<4;i++)
    { snake[0][i]=1;
      snake[1][i]=i+1;
    }
 for(i=1;i<=3;i++)
        image[1][i]=3;
   image[1][4]=1;
}
int Snake::Gameover()
{
  if(snakeX<0 || snakeX>19 ||snakeY<0 || snakeY>19)
  {
	  GotoXY(46,22);
      cout << "Game over!" << endl;
      GameOver=1;
     return GameOver;
  }
  if((image[snakeX][snakeY]!=0)&&!(snakeX==FoodX&&snakeY==FoodY))
   {
	  GotoXY(46,22);
	  cout << "Game over!" << endl;
	  GameOver=1;
	  return GameOver;
  }
  return 0;
}
int Snake::ENTSnake()
{   if(snakeX==FoodX && snakeY==FoodY)
     {
      score+=10;
	  length++;
	  if(length>=8)
	  {length-=8;
	  level++;}
      image[snakeX][snakeY]=1;
      image[snake[0][head]][snake[1][head]] = 3;
      head=(head+1);
      snake[0][head] = snakeX;
      snake[1][head] = snakeY;
      Generatefood();
	  display();
      }
     else
     {
      image[snake[0][tail]][snake[1][tail]]=0;
      tail=(tail+1);
      image[snake[0][head]][snake[1][head]]=3;
      head=(head+1);
      snake[0][head]=snakeX;
      snake[1][head]=snakeY;
      image[snake[0][head]][snake[1][head]]=1;
      display();
      }
  return 0;
}
void Snake::shiftLeft()
{
    direction=4;
}
void Snake::shiftRight()
{
    direction=6;
}
void Snake::shiftUp()
{
    direction=8;
}
void Snake::shiftDown()
{
    direction=2;
}
void Snake::Automove()
{
	switch(direction)
	{
	case 6:snakeX= snake[0][head]; snakeY= snake[1][head]+1;break;
	case 4:snakeX= snake[0][head]; snakeY= snake[1][head]-1;break;
	case 8:snakeX= snake[0][head]-1; snakeY= snake[1][head];break;
	case 2:snakeX= snake[0][head]+1; snakeY= snake[1][head];break;
    default:;
	}
}

int Snake::Generatefood() {
	srand(time(0));
	do{
     FoodX=rand()%20;
     FoodY=rand()%20;
	}while(image[FoodX][FoodY]!=0);
    image[FoodX][FoodY]=2;
 return image[FoodX][FoodY];
}

void Snake::display()
{
	color(15);
    GotoXY(1,1);

    for(i=0;i<22;i++)
    printf("■");
    GotoXY(1,2);
    for(i=0;i<20;i++)
	{	color(15);
	printf("■");
	for(j=0;j<20;j++)
	{
		switch(image[i][j])
		{
		case 0:color(15);printf("  ");break;
		case 1:color(13);printf("■");break;
		case 2:color(15);printf("●");break;
		case 3:color(15);printf("●");break;
		}
	}  color(15);
	printf("■\n");
}

for(i=0;i<22;i++)
printf("■");  color(15);
GotoXY(46,9); printf(" SCORE:%d",score);
GotoXY(46,10); printf(" LEVEL=%d",level);
color(15);
GotoXY(46,6);cout<<" 上移:W    下移:S"<<endl;
GotoXY(46,7);cout<<" 左移:A    右移:D"<<endl;
GotoXY(46,8);cout<<" 暂停:空格 退出:E"<<endl;
}
void Snake::Setspeed()
{
	int Esc=0;
	while(!Esc)
	{
		int speed;
				color(12);
				cout<<"1  2  3"<<endl;
				cout<<"请输入您的选择:";
				cin>>speed;
				switch(speed)
				{
				case 0:
					Esc=1;
					gamespeed=280;
					break;
				case 1:
					gamespeed=280;
					Esc=1;
					break;
				case 2:
					gamespeed=200;
					Esc=1;
					break;
				case 3:
					gamespeed=80;
					Esc=1;
					break;
				}
	}
}
int Snake::Pause()
{
    char c;
    do
	{
	    c=getch();
    }while(c!=' ');
	arrowKey=0;
	return arrowKey;
}
int Snake::PlayGame()
 {
   Init();
   Generatefood();
   display();
	while (!GameOver)
    {
        if(kbhit())
		{
          arrowKey = getch();
        }
			if(direction==2||direction==8)
			{
              switch(arrowKey)
              {
			  case'd':shiftRight();break;
			  case'a':shiftLeft();break;
			  case'e':exit(1);break;
			  case' ':Pause();break;
			  default:break;
               }
			}
			else if(direction==4||direction==6)
			{
		      switch(arrowKey)
			  {
			  case'w':shiftUp();break;
			  case's':shiftDown();break;
			  case'e':exit(1);break;
			  case' ':Pause();break;
			  default:break;
			  }
			}
			Sleep(gamespeed);
			Automove();
			Gameover();
			if(GameOver==1)
            break;
			ENTSnake();
			display();
	}
	Hero[0].Highscore=score;
	getch();
	return 0;
}
void Welcome()
{
    color(12);

    cout<<"               *                         ● ●                           "<<endl;
    cout<<"             *    *                     ●    ●                         "<<endl;
    cout<<"           *   *    *                ☆       ●                        "<<endl;
    cout<<"         *    ****    *                    ●                           "<<endl;
    cout<<"       *       **       *                 ●                            "<<endl;
    cout<<"           * * * * *                    ●                              "<<endl;
    cout<<"           *   *   *                    ●                              "<<endl;
    cout<<"           *   *   *                     ●   ●   ●                     "<<endl;
    cout<<"             *   *                    ●    ●       ●                   "<<endl;
    cout<<"           *       *               ●   ●   ●  ●   ●                    "<<endl;
}
int main()
{
	Snake SNAKE;
	char Name[10];
	char ch;
	Welcome();
	while(1)
	{
		cout<<"     ▁▁▁▁▁▁▁▁▁▁▁▁▁▁      "<<endl;
		cout<<"     ▏                          ▏    "<<endl;
		cout<<"     ▏       1.开始游戏         ▏    "<<endl;
		cout<<"     ▏       2.设置速度         ▏    "<<endl;
		cout<<"     ▏       3.英雄榜           ▏    "<<endl;
		cout<<"     ▏       4.退出             ▏    "<<endl;
		cout<<"     ▏                          ▏    "<<endl;
		cout<<"     ▔▔▔▔▔▔▔▔▔▔▔▔▔▔      "<<endl;
		cin>>ch;
		if(ch=='1')
		{
			system("cls");
			SNAKE.PlayGame();
			system("cls");
			if(Hero[0].Highscore<100)
			{cout<<"You also need to refuel!"<<endl;cout<<endl;}
			else if(400>Hero[0].Highscore&&Hero[0].Highscore>200)
			{cout<<"You must be superior!"<<endl;cout<<endl;}
			if(Hero[0].Highscore>200)
			{
			cout<<"Please enter your name:";
			cin>>Hero[0].Name;
			Save();
			}
			system("pause");
			system("cls");
			break;
		}
		else if(ch=='2')
		{
			system("cls");
			SNAKE.Setspeed();
			system("pause");
			system("cls");
			continue;
		}

		else if(ch=='3')
		{
			system("cls");
			color(10);
			FILE *fp;
			fp=fopen("Hero_list","rb");
			fread(&Hero[0],sizeof(struct HeroList),1,fp);
			cout<<"$#######_---   英雄榜:  ---_#######$"<<endl;
			cout<<"               名字:"<<Hero[0].Name<<endl;
			cout<<"               最高分:"<<Hero[0].Highscore<<endl;
			cout<<"--------------------------------------------"<<endl;
			fclose(fp);
			system("pause");
			system("cls");
			continue;
		}
		else if(ch=='4')
		{
			system("cls");
			exit(0);
		}
		else
		{
			system("cls");
			cout<<"请重新输入!"<<endl;
			continue;
		}
	}

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值