#include<iostream>
using namespace std;
#include<conio.h>
#include<windows.h>
#include <stdlib.h>
#include <time.h>
#define line 42
#define col 27
#define left 1
#define right 2
#define up 3
#define down 4
int level(void);//模式选择
void basic(void);//设计用户界面
void game(void);//游戏大致过程
void rungame(void);//游戏运行's cause
void randomPosition(void);//生成随机方块
//更新snake头坐标
bool cP(char input);//2.用户操作
void direction(void);//1.用户 NONE 操作
void displayScore(void);//打印分数
void streng(void);//判断snake是否增长
void move(void);//snake移动一次
bool judge(void);//判断是否game over!
void renew(void);//更新snake的长度
void littleRenew(void);
void placeCursor(int x , int y);//移动光标位置
int lev;
int snack[500][2];//存储snake每一点的位置
int num=1;//存储snake长度
int mem[22][27]={0};//存储snake以及随机黑快
int player=1;//游戏运行标识
int add=0;//是否增长标识
int head[2]={10,11};//snake head position
int flag=left;//direction
int main()
{
basic();
game();
return 0;
}
//游戏大致过程
void game(void)
{
char input;
lev=level()*100;
snack[0][0]=11;
snack[0][1]=10;
randomPosition();
while(player){
_sleep(lev);
if (kbhit()){
input=getch();
if (cP(input)){
rungame();
}
else {
direction();
rungame();
}
}
else {
direction();
rungame();
}
displayScore();
}
}
//打印分数
void displayScore()
{
placeCursor(60,15);
cout<<"you sorce is :"<<(num-1)*100;
}
//游戏运行's cause
void rungame(void)
{
//judge()边界判断
if (!judge() || mem[head[0]][head[1]]==1){
move();
player=0;
placeCursor(16,15);
cout<<"G a m e o v e r!";}
else {
streng();//判断snake是否增长
if (!add){
move();
renew();
}
else{
renew();
add=0;
}
}
}
//生成随机方块
void randomPosition(void)
{
srand((unsigned)time(NULL));
int m=0,n=0;
while (m==0 || n==0){
m=rand()%21;
n=rand()%26;
if (mem[m][n]!=1 && m!=0 && n!=0)
break;
}
placeCursor(45,12);
placeCursor(2*m,n);
mem[m][n]=2;
cout<<"▇";
}
//判断snake是否增长
void streng(void)
{
if (mem[head[0]][head[1]]==2){
num+=1;
add=1;
if (num%5==0)
lev-=50;
}
}
//更新snake的长度
void renew(void)
{
mem[head[0]][head[1]]=1;
if (add){
randomPosition();
littleRenew();
}
else{
mem[snack[num-1][0]][snack[num-1][1]]=0;
littleRenew();
}
snack[0][0]=head[0];
snack[0][1]=head[1];
}
void littleRenew(void)
{
for (int p=num-1;p>0;p--){
snack[p][1]=snack[p-1][1];
snack[p][0]=snack[p-1][0];}
}
//判断是否game over!
bool judge(void)
{
if (head[0]==0 || head[0]==21 || head[1]==0 || head[1]==26)
return 0;
else
return 1;
}
//移动光标位置
void placeCursor(int a, int b)
{
HANDLE hort;
COORD coord;
coord.X=a;
coord.Y=b;
hort=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hort,coord);
}
//设计用户界面
void basic(void)
{
for (int k=0;k<line+2;k+=2){
placeCursor(k,0);
cout<<'*';
placeCursor(k,col-1);
cout<<'*';
}
for (int o=1;o<col-1;o++){
placeCursor(0,o);
cout<<'*';
placeCursor(line,o);
cout<<'*';
}
}
//模式选择
int level(void)
{
int le;
placeCursor(60,10);
cout<<"选择难度 : "<<"\t1.困难"<<"\t2.一般"<<"\t3.简单";
while (1){
cin>>le;
if (le == 1)
return 2;
else if (le == 2)
return 5;
else if (le == 3)
return 7;
else
cout<<"Please input right num";
}
}
//更新snake头坐标
//1.用户 NONE 操作
void direction(void)
{
if (flag == left)
head[0]--;
else if (flag == right)
head[0]++;
else if (flag == up)
head[1]--;
else
head[1]++;
}
//2.用户操作
bool cP(char input)
{
if (input == 'a' && flag!=right){
head[0]--;flag=left;return 1;}
else if ( input == 'd' && flag!=left){
head[0]++;flag=right;return 1;}
else if (input == 'w' && flag!=down){
head[1]--;flag=up;return 1;}
else if ( input == 's' && flag!=up){
head[1]++;flag=down;return 1;}
return 0;
}
//snake移动一次
void move(void)
{
placeCursor(snack[num-1][0]*2,snack[num-1][1]);
cout<<" ";
placeCursor(head[0]*2,head[1]);
cout<<"▇";
}