#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <iostream.h>
//-------------------------------------------------------------------
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 CSnake
{
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 node; //小蛇的节数
int direction; //小蛇头部的方向
int i,j;
int gamespeed; //速度
int score; //记录分数
char arrowKey; //接受按键的变量
int GameOver; //使游戏结束的变量
int level; //设置等级
int length; //为了设置等级而与node一样记录设的长度
public:
CSnake() //构造函数初始化部分变量
{
head=3; //初始化头部下标
tail=0; //初始化尾部下标
node=4; //小蛇初始节数为4节
gamespeed=300; //游戏速度(移动的间隔时间)
score=0; //初始化分数为0
direction=6; //小蛇的初始方向向右
GameOver=0; //进入游戏初始化为0
level=1;
length=4;
}
~CSnake() //析构函数
{}
void Init(); //初始化游戏面板及小蛇的坐标
int DrawSnake(); //记录小蛇每次移动后头部及身体的下一坐标
void Automove(); //使小蛇自动移动
int Gameover(); //判断游戏是否结束
int Generatefood(); //产生食物
void display(); //显示游戏面板
void shiftLeft(); //控制左移
void shiftRight(); //控制右移
void shiftDown(); //控制下移
void shiftUp(); //控制上移
int PlayGame(); //执行游戏的函数
void Setspeed(); //设置速度
int Pause(); //游戏的暂停
};
//-------------------------------------- -------------------------------
void CSnake::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 CSnake::Gameover() //判断游戏是否结束
{
if(snakeX<0 || snakeX>19 ||snakeY<0 || snakeY>19) // 碰到墙壁游戏结束
{
GotoXY(1,25);
cout << "Game over!" << endl;
GameOver=1;
return GameOver;
}
if((image[snakeX][snakeY]!=0)&&!(snakeX==FoodX&&snakeY==FoodY)) //蛇头碰到蛇身游戏结束
{
GotoXY(1,25);
cout << "Game over!" << endl;
GameOver=1;
return GameOver;
}
return 0;
}
//----------------------------------------------------------------
int CSnake::DrawSnake()
{ if(snakeX==FoodX && snakeY==FoodY) //若小蛇头部坐标与食物坐标重叠则吃掉食物
{
node++; // 小蛇节数增一
score+=10; //分数增加
length++;
if(length>=8) //当小蛇增长到8个时,等级加一
{length-=8;
level++;}
image[snakeX][snakeY]=1; //小蛇头部移动的下一位置头部图像对应的值赋给图像
image[snake[0][head]][snake[1][head]] = 3; //小蛇头部其后紧跟的身体一格移动的下一位置头部图像对应的值赋给图像
head=(head+1)%10000;
snake[0][head] = snakeX; //将小蛇头部此时的坐标值赋给记录头部坐标的snake[0][head]
snake[1][head] = snakeY;
Generatefood(); //吃掉食物后再次随机分布食物
display(); //刷新显示
}
else
{ //没有吃食物
image[snake[0][tail]][snake[1][tail]]=0; //擦去小蛇尾部
tail=(tail+1)%10000;
image[snake[0][head]][snake[1][head]]=3; //小蛇头部其后紧跟的身体一格移动的下一位置头部图像对应的值赋给图像
head=(head+1)%10000;
snake[0][head]=snakeX; //将小蛇头部此时的坐标值赋给记录头部坐标的snake[0][head]
snake[1][head]=snakeY;
image[snake[0][head]][snake[1][head]]=1; //小蛇头部移动的下一位置头部图像对应的值赋给图像
display();
}
return 0;
}
//-----------------------------------------------------------
void CSnake::shiftLeft() //左移则小蛇蛇头方向向左
{
direction=4;
}
//++++++++++++++++++++++++++
void CSnake::shiftRight() //右移则小蛇蛇头方向向右
{
direction=6;
}
//+++++++++++++++++++++++++++
void CSnake::shiftUp() //上移则小蛇蛇头方向向上
{
direction=8;
}
//+++++++++++++++++++++++++++
void CSnake::shiftDown() //下移则小蛇蛇头方向向下
{
direction=2;
}
//------------------------------------------------------
void CSnake::Automove()
{
switch(direction)
{
case 6:snakeX= snake[0][head]; snakeY= snake[1][head]+1;break; //接收到向右的信息小蛇头部Y坐标加一,X坐标不变并赋给记录头部坐标的变量
case 4:snakeX= snake[0][head]; snakeY= snake[1][head]-1;break; //接收到向左的信息小蛇头部Y坐标减一,X坐标不变并赋给记录头部坐标的变量
case 8:snakeX= snake[0][head]-1; snakeY= snake[1][head];break; //接收到向上的信息小蛇头部X坐标加一,Y坐标不变并赋给记录头部坐标的变量
case 2:snakeX= snake[0][head]+1; snakeY= snake[1][head];break; //接收到向下的信息小蛇头部X坐标加一,Y坐标不变并赋给记录头部坐标的变量
default:;
}
}
//---------------------------------------------------------------------
int CSnake::Generatefood() // 产生食物
{
srand(time(0)); //以时间为种子生成随机序列
do{
FoodX=rand()%20; //食物输出的X坐标
FoodY=rand()%20; //食物输出的Y坐标
}while(image[FoodX][FoodY]!=0); //产生的食物坐标限定在游戏面板内,且食物坐标不与小蛇身体坐标重合
image[FoodX][FoodY]=2;
return image[FoodX][FoodY];