/*在VC2012中编译通过,使用了c++11新特性,低版本的VC可能不能编译*/
/*在dev-cpp中设置编译器选项,使支持c++11,就可以编译:
项目-->项目属性-->编译器-->代码生成-->语言标准(-std),在下拉选项中选择
ISO C++11即可。*/
#include<windows.h>
#include<conio.h> /*包含_kbhit()函数。不是标准库*/
#include<time.h>
#include<iostream>
#include<deque>
using namespace std;
/*由于windows提供的POINT的x、y是LONG类型的,所以自己定义了个*/
struct m_POINT{
short x;
short y;
};
class Snake{
HANDLE s_hConsole; //
deque<m_POINT> snakeCoor; //存储蛇身坐标
m_POINT foodCoor; //存储食物坐标
char key; //按键信息,控制蛇移动的信息
m_POINT tempCoor; //蛇头坐标
void Control(); //控制蛇移动
public:
Snake();
void initScene(); //初始化游戏场景
void gotoXY(m_POINT pt);//设置光标位置
void printSnake(); //输出蛇身
void Run(); //运行游戏
bool isCollision(); //检测是否碰撞
inline bool isOver();
void newFood(); //新的食物坐标
};
Snake::Snake()
{
s_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
tempCoor.x=6; tempCoor.y=6;
foodCoor.x=10; foodCoor.y=13;
key=100;
}
void Snake::initScene()
{
SetConsoleTitle(TEXT("贪吃蛇"));
system("color 3c");
m_POINT initCoor;
for(auto i=2;i<26;i++)
{
initCoor.x=2; initCoor.y=i;
gotoXY(initCoor);
initCoor.x=40; cout<<"▇";
gotoXY(initCoor); cout<<"▇";
}
for(auto i=2;i<42;i+=2)
{
initCoor.x=i; initCoor.y=25;
gotoXY(initCoor); cout<<"▇";
initCoor.y=2;
gotoXY(initCoor); cout<<"▇";
}
}
void Snake::gotoXY(m_POINT pt)
{
COORD coord;
coord.X=pt.x; coord.Y=pt.y;
SetConsoleCursorPosition(s_hConsole,coord);
}
void Snake::printSnake()
{
for(auto x:snakeCoor)
{
gotoXY(x); cout<<"▇";
}
}
bool Snake::isCollision()
{
if(foodCoor.x==tempCoor.x && foodCoor.y==tempCoor.y)
return true;
return false;
}
void Snake::Control()
{
while (_kbhit()) //判断是否有键按下
key = _getch();
switch(key)
{
case 97 : case 65:case 4: case 75: //左
tempCoor.x-=2;
break;
case 100: case 68: case 6: case 77: //右
tempCoor.x+=2;
break;
case 119: case 87: case 8: case 72: //上
tempCoor.y--;
break;
case 115: case 83: case 2: case 80: //下
tempCoor.y++;
break;
}
}
void Snake::newFood()
{
srand((unsigned) time(NULL));
foodCoor.x=5+rand()%34;
if(foodCoor.x%2!=0)
{
if(foodCoor.x>=20)
foodCoor.x--;
else
foodCoor.x++;
}
foodCoor.y=3+rand()%20;
gotoXY(foodCoor); cout<<"★";
snakeCoor.push_front(*--snakeCoor.end());
}
bool Snake::isOver()
{
if(tempCoor.x<4 || tempCoor.x>=40 || tempCoor.y<=2 || tempCoor.y>=26)
{
return true;
}
return false;
}
void Snake::Run()
{
snakeCoor.push_back(tempCoor);
while(1)
{
gotoXY(tempCoor); cout<<" ";
Control();
if(isOver())
{
system("cls");
cout<<"GameVoer!"<<endl;
return;
}
snakeCoor.push_back(tempCoor);
gotoXY(foodCoor); cout<<"★"; //食物坐标
if(isCollision()) //判断是否吃到食物
newFood();
printSnake();
gotoXY(snakeCoor.front());cout<<" "; //清除轨迹
snakeCoor.pop_front();
gotoXY(tempCoor); cout<<"▇";
Sleep(200);
}
}
int main()
{
Snake snake;
snake.initScene();
snake.Run();
system("pause");
}