想写一个贪吃蛇~先占个坑
-----------------------------------
来填坑了,啦啦啦。
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
void gotoxy(int x,int y)
{
COORD a; /*COORD表示一个字符在控制台屏幕上的坐标。*/
a.X=x;
a.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),a);
/*SetConsoleCursorPosition定位光标位置的函数,坐标为GetStdHandle()返回标准的输出的句柄,
也就是获得输出屏幕缓冲区的句柄,并赋值给对象a*/
/*GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误
的屏幕缓冲区的句柄。*/
}
void color(int a) //颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
/*SetConsoleTextAttribute是API设置控制台窗口字体颜色和背景色的函数*/
}
struct point
{
int x;
int y;
};
class asnake
{
private:
int image[20][30];//小蛇活动范围
point snake[2000];
int foodx;
int foody;
int snakex;
int snakey;
int head;//头部下标
int tail;
int direct;
int gamespeed;
int score;
int numx;
char arrowkey;
int gameover;
int level;
public:
asnake()
{
head=3; //初始化头部下标
tail=0; //初始化尾部下标
gamespeed=150; //游戏速度(移动的间隔时间)
score=0; //初始化分数为0
direct='d'; //小蛇的初始方向向右
gameover=0; //进入游戏初始化为0
level=1;
}
void init(); //初始化游戏面板及小蛇的坐标
int drawsnake(); //记录小蛇每次移动后头部及身体的下一坐标
void automove(); //使小蛇自动移动
int over(); //判断游戏是否结束
int generatefood(); //产生食物
void display(); //显示游戏面板
void shiftleft(); //控制左移
void shiftright(); //控制右移
void shiftdown(); //控制下移
void shiftup(); //控制上移
int playgame(); //执行游戏的函数
void setspeed(); //设置速度
int pause(); //游戏的暂停
};
void asnake::init()//初始化
{
for(int i=0;i<20;i++)
{
for(int j=0;j<30;j++)
{
image[i][j]=0;
}
}
for(int j=0;j<4;j++)
{
snake[j].x=1;
snake[j].y=j+1;
}
for(int i=1;i<=4;i++)
{
image[1][i]=3;
}
}
int asnake::over()
{
if(snakex<0||snakex>19||snakey<0||snakey>29)
{
system("cls");
gotoxy(35,5);
cout << "-----Game over23333!-----" << endl<<endl;
gameover=1;
return gameover;
}
if((image[snakex][snakey]!=0)&&!(snakex==foodx&&snakey==foody))
{
system("cls");
gotoxy(35,5);
cout << "-----Game over23333!-----" << endl<<endl;
gameover=1;
return gameover;
}
return 0;
}
int asnake::generatefood() // 产生食物
{
srand(time(0));
do{
foodx=rand()%20;
foody=rand()%30;
}while(image[foodx][foody]!=0);
image[foodx][foody]=2;
return image[foodx][foody];
/*通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,
进而产生不同的随机数序列 */
}
void asnake::display()//画出所有的图像。
{
color(10);
gotoxy(0,0);
for(int i=0;i<32;i++)
{
cout<<"■";
}
gotoxy(0,1);
for(int i=0;i<20;i++)
{
cout<<"■";
for(int j=0;j<30;j++)
{
switch(image[i][j])
{
case 0:cout<<" ";break;
case 2:color(12);cout<<"◆";break;
case 3:color(11);cout<<"●";break;
}
}
color(10);
cout<<"■"<<endl;
}
color(10);
for(int i=0;i<32;i++)
cout<<"■";
cout<<endl;
color(14);
gotoxy(70,10);
cout<<"SCORE: "<<score<<endl<<endl;
gotoxy(70,12);
cout<<"level: "<<level<<endl;
}
int asnake::drawsnake()
{
if(snakex==foodx&&snakey==foody)
{
score+=10;
image[foodx][foody]=3;
head++;
snake[head].x=snakex;
snake[head].y=snakey;
display();
generatefood();
if(score>40&&score<90)
{
gamespeed=gamespeed/2;
level=2;
}
else if(score>90&&score<140)
{
gamespeed=gamespeed/10;
level=3;
}
else if(score>140&&score<200)
{
gamespeed=gamespeed/10;
level=3;
}
else if(score>280)
{
gamespeed=gamespeed/10;
level=4;
}
else if(score==360)
{
system("cls");
color(15);
gotoxy(30,10);
cout<<"-----你这只猪哈哈哈哈哈哈------"<<endl;
exit(0);
}
}
else
{
image[snake[tail].x][snake[tail].y]=0;
tail++;
head++;
snake[head].x=snakex;
snake[head].y=snakey;
image[snake[head].x][snake[head].y]=3;
display();
}
return 0;
}
void asnake::shiftleft()
{
direct='a';
}
void asnake::shiftright()
{
direct='d';
}
void asnake::shiftdown()
{
direct='s';
}
void asnake::shiftup()
{
direct='w';
}
void asnake::automove()
{
switch(direct)
{
case 'd':snakex= snake[head].x; snakey= snake[head].y+1;break;
case 'a':snakex= snake[head].x; snakey= snake[head].y-1;break;
case 'w':snakex= snake[head].x-1; snakey= snake[head].y;break;
case 's':snakex= snake[head].x+1; snakey= snake[head].y;break;
default:;
}
}
void asnake::setspeed()
{
int speed,mark=0;
for(int i=0;i<10;i++)
{
cout<<endl;
}
cout<<" make your choice first please"<<endl<<endl;
cout<<" 1.slow 2.normal 3.fast 4.very fast 5.very very fast,hahaha"<<endl<<endl;
while(mark==0)
{
cout<<" ";cin>>speed;
switch(speed)
{
case 1:gamespeed=150;mark=1;break;
case 2:gamespeed=125;mark=1;break;
case 3:gamespeed=100;mark=1;break;
case 4:gamespeed=50;mark=1;break;
case 5:gamespeed=10;mark=1;break;
default:cout<<"别乱按。。!"<<endl;break;
}
}
}
int asnake::playgame()
{
init(); //初始化游戏面板及小蛇的坐标
generatefood();
display(); //显示游戏面板
while(gameover==0)
{
if(kbhit()!=0) //kbhit() 功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{ //接受按键
arrowkey = getch();
}
if(direct=='w'||direct=='s')
{
switch(arrowkey)
{
case 'd':shiftright();break;
case 'a':shiftleft();break;
default:break;
}
}
else
{
switch(arrowkey)
{
case 's':shiftdown();break;
case 'w':shiftup();break;
default:break;
}
}
Sleep(gamespeed);
automove();
over();
if(gameover==1) break;
drawsnake();
display();
}
return 0;
}
int main()
{
for(int i=0;i<10;i++)
{
cout<<endl;
}
color(15);
cout<<" -------------- 贪~吃~蛇~ -------------- "<<endl;
cout<<" -----------游戏规则:w向上,a向左,d向右,s向下。-----------"<<endl;
for(int i=0;i<10;i++)
{
cout<<endl;
}
system("pause");
system("cls");
asnake SNAKE;
SNAKE.setspeed();
system("cls");
SNAKE.playgame();
return 0;
}