贪吃蛇
代码很容易理解,循环与函数。
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
用这些库。
int vb=3,endx,endy,foodx,n[250]={15,16,17},m[250]={34,34,34},foody,tim=170,h,v[30][100],j,i,x=3;
char d,df;
bool c;
x存储蛇身长度。endx和endy存蛇尾坐标。tim是每次刷新蛇身的毫秒数。v数组是地图 v中1代表蛇身,2代表食物。i,j 循环。n,m都是存蛇身坐标。
void go(int x,int y)
{
COORD pos={y,x};
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
void cv(unsigned int ForeColor=7,unsigned int BackGroundColor=0)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle,ForeColor+BackGroundColor*0x10);
}
这两个函数是上网抄的,go是把光标移动到x,y这个位置。cv是更改输出的字体及背景颜色。
具体看gotoxy以及background
void prinf()
{
if(tim<=140&&tim>=101)
{
cv(6,5);
go(4,103);
cout<<" ";
go(4,103);
cout<<"中";
}
if(tim<=100&&tim>=65)
{
cv(6,5);
go(4,103);
cout<<" ";
go(4,103);
cout<<"高";
}
if(tim<=64&&tim>=15)
{
cv(6,5);
go(4,103);
cout<<" ";
go(4,103);
cout<<"大";
go(5,103);
cout<<" ";
go(5,103);
cout<<"师";
go(6,103);
cout<<"级";
}
if(tim<15)
{
system("cls");
go(14,42);
cout<<"恭 喜 !游 戏 成 功 !";
}
if(x%3==0&&x!=vb&&x!=3) tim-=12;
//tim是移动一次的时间间隔,单位是ms,随着等级增大而减小
cv(1,7);
for(i=0;i<30;i++)
{
for(j=0;j<99;j++)
{
if(v[i][j]==1)
{
go(i,j);
cout<<"█";
}
}
}
go(29,102);
}
void wei()
{
v[n[x-1]][m[x-1]]=0;//v里的蛇尾=0
go(n[x-1],m[x-1]);
cv(0,7);
cout<<" ";//清除蛇尾
}
void food()
{
srand(time(NULL));//设置时间种子
while(1)
{
foodx=rand()%28+0;//产生随机的食物坐标x
foody=rand()%95+0;//产生随机的食物坐标y
c=false;//标记c
for(int l=0;l<x;l++)
{
if(n[l]==foodx&&m[l]==foody)
{
c=true;
break;
}
}//判断食物是否出现在蛇身上
if(c==false) break;
}
if(foody%2==0) foody++;//因为食物●占两列,所以foody必须是奇数
v[foodx][foody-1]=2;
go(foodx,foody-1);
cv(4,7);
cout<<"●";//输出食物
}
void qiang()
{
system("cls");
go(14,43);
cout<<"撞 墙 !游 戏 结 束 !";
go(16,49);
cout<<"得 分 :"<<x;
go(27,0);
}
一些有关游戏功能的函数。
int main()
{
system("color 71");
cv(6,5);
go(1,103);
cout<<"级";
go(2,103);
cout<<"别";
go(3,103);
cout<<" ";
go(4,103);
cout<<"初";
go(5,103);
cout<<"级";
for(i=0;i<=100;i++)
{
cv(1,2);
go(28,i);
cout<<" ";
}
for(i=0;i<=28;i++)
{
cv(1,2);
go(i,100);
cout<<" ";
}
v[17][34]=1;
v[16][34]=1;
v[15][34]=1;
for(i=0;i<29;i++)
{
for(j=0;j<95;j++)
{
if(v[i][j]==1)
{
cv(3,7);
go(i,j);
cout<<"█";
}
}
}
go(15,34);
food();
}
这段不难理解,v中1是蛇身,用food函数随机生出食物坐标。
先写一个无限循环,用来每次打印蛇身。
while(1)
{
while(kbhit()==0)//监控键盘
{
//这里面打印蛇身并进行更新
}
d=getch();//读取键盘上的数(不回显)
df=d;
d=0;
}
具体写一下就是:
while(1)
{
while(kbhit()==0)
{
vb=x;//蛇的长度
switch(df)//用switch判断df也就是每次的方向
{
case 72: //72是“↑”的键盘扫描码
if(v[n[0]-1][m[0]]!=2)//如果没吃到食物
wei();//删除蛇尾
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
//这两个for是刷新n和m数组,变成新的蛇身坐标,增加蛇头
if(v[n[0]-1][m[0]]==2)//如果吃到食物
{
x++;//蛇身长度++
n[x-1]=endx;
m[x-1]=endy;//这两句是新加蛇尾
food();//刷新食物
}
if(n[0]-1<0)//判断是否撞墙
{
qiang();//执行游戏结束
if(kbhit!=0)//如果按下了任意键
return 0;//结束程序
}
if(v[n[0]-1][m[0]]==1)//如果吃到了自己
{
ziji();//执行游戏结束
return 0;//结束游戏
}
v[--n[0]][m[0]]=1;//新的蛇头
break;
case 80: //80是“↓”的键盘扫描码
if(v[n[0]+1][m[0]]!=2)
wei();
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
if(v[n[0]+1][m[0]]==2)
{
x++;
n[x-1]=endx;
m[x-1]=endy;
food();
}
if(n[0]==27)
{
qiang();
if(kbhit!=0)
return 0;
}
if(v[n[0]+1][m[0]]==1)
{
ziji();
if(kbhit!=0)
return 0;
}
v[++n[0]][m[0]]=1;
break;
case 75: //75是“←”的键盘扫描码
if(v[n[0]][m[0]-2]!=2)
wei();
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
if(v[n[0]][m[0]-2]==2)
{
x++;
n[x-1]=endx;
m[x-1]=endy;
food();
}
if(m[0]-1<0)
{
qiang();
if(kbhit!=0)
return 0;
}
if(v[n[0]][m[0]-2]==1)
{
ziji();
if(kbhit!=0)
return 0;
}
m[0]-=2;
v[n[0]][m[0]]=1;
break;
case 77: //77是“→”的键盘扫描码
if(v[n[0]][m[0]+2]!=2)
wei();
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
if(v[n[0]][m[0]+2]==2)
{
x++;
n[x-1]=endx;
m[x-1]=endy;
food();
}
if(m[0]+2==100)//因为蛇身██占两个位置,所以是加2
{
qiang();
if(kbhit!=0)
return 0;
}
if(v[n[0]][m[0]+2]==1)
{
ziji();
if(kbhit!=0)
return 0;
}
m[0]+=2;
v[n[0]][m[0]]=1;
break;
}
//现在这里在switch外面
prinf();//打印新蛇,并且判断现在的等级、速度
Sleep(tim);//停歇tim毫秒
}
d=getch();
df=d;
d=0;
}
接下来把各个代码块合起来。
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
int vb=3,endx,endy,foodx,n[250]={15,16,17},m[250]={34,34,34},foody,tim=170,h,v[30][100],j,i,x=3;
char d,df;
bool c;
void go(int x,int y)
{
COORD pos={y,x};
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
void cv(unsigned int ForeColor=7,unsigned int BackGroundColor=0)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle,ForeColor+BackGroundColor*0x10);
}
void ziji()
{
system("cls");
go(14,40);
cout<<"吃 到 自 己 !游 戏 结 束 !";
go(16,48);
cout<<"得 分 :"<<x;
go(27,0);
}
void prinf()
{
if(tim<=140&&tim>=101)
{
cv(6,5);
go(4,103);
cout<<" ";
go(4,103);
cout<<"中";
}
if(tim<=100&&tim>=65)
{
cv(6,5);
go(4,103);
cout<<" ";
go(4,103);
cout<<"高";
}
if(tim<=64&&tim>=15)
{
cv(6,5);
go(4,103);
cout<<" ";
go(4,103);
cout<<"大";
go(5,103);
cout<<" ";
go(5,103);
cout<<"师";
go(6,103);
cout<<"级";
}
if(tim<15)
{
system("cls");
go(14,42);
cout<<"恭 喜 !游 戏 成 功 !";
}
if(x%3==0&&x!=vb&&x!=3) tim-=12;
cv(1,7);
for(i=0;i<30;i++)
{
for(j=0;j<99;j++)
{
if(v[i][j]==1)
{
go(i,j);
cout<<"█";
}
}
}
go(29,102);
}
void wei()
{
v[n[x-1]][m[x-1]]=0;
go(n[x-1],m[x-1]);
cv(0,7);
cout<<" ";
}
void food()
{
srand(time(NULL));
for(int ll=0;;ll++)
{
foodx=rand()%28+0;
foody=rand()%95+0;
c=false;
for(int l=0;l<x;l++)
{
if(n[l]==foodx&&m[l]==foody)
{
c=true;
break;
}
}
if(c==false) break;
}
if(foody%2==0) foody++;
v[foodx][foody-1]=2;
go(foodx,foody-1);
cv(4,7);
cout<<"●";
}
void qiang()
{
system("cls");
go(14,43);
cout<<"撞 墙 !游 戏 结 束 !";
go(16,49);
cout<<"得 分 :"<<x;
go(27,0);
}
int main()
{
system("color 71");
cv(6,5);
go(1,103);
cout<<"级";
go(2,103);
cout<<"别";
go(3,103);
cout<<" ";
go(4,103);
cout<<"初";
go(5,103);
cout<<"级";
for(i=0;i<=100;i++)
{
cv(1,2);
go(28,i);
cout<<" ";
}
for(i=0;i<=28;i++)
{
cv(1,2);
go(i,100);
cout<<" ";
}
v[17][34]=1;
v[16][34]=1;
v[15][34]=1;
for(i=0;i<29;i++)
{
for(j=0;j<95;j++)
{
if(v[i][j]==1)
{
cv(3,7);
go(i,j);
cout<<"█";
}
}
}
go(15,34);
food();
while(1)
{
while(kbhit()==0)
{
vb=x;
switch(df)
{
case 72:
if(v[n[0]-1][m[0]]!=2)
wei();
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
if(v[n[0]-1][m[0]]==2)
{
x++;
n[x-1]=endx;
m[x-1]=endy;
food();
}
if(n[0]-1<0)
{
qiang();
if(kbhit!=0)
return 0;
}
if(v[n[0]-1][m[0]]==1)
{
ziji();
return 0;
}
v[--n[0]][m[0]]=1;
break;
case 80:
if(v[n[0]+1][m[0]]!=2)
wei();
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
if(v[n[0]+1][m[0]]==2)
{
x++;
n[x-1]=endx;
m[x-1]=endy;
food();
}
if(n[0]==27)
{
qiang();
if(kbhit!=0)
return 0;
}
if(v[n[0]+1][m[0]]==1)
{
ziji();
if(kbhit!=0)
return 0;
}
v[++n[0]][m[0]]=1;
break;
case 75:
if(v[n[0]][m[0]-2]!=2)
wei();
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
if(v[n[0]][m[0]-2]==2)
{
x++;
n[x-1]=endx;
m[x-1]=endy;
food();
}
if(m[0]-1<0)
{
qiang();
if(kbhit!=0)
return 0;
}
if(v[n[0]][m[0]-2]==1)
{
ziji();
if(kbhit!=0)
return 0;
}
m[0]-=2;
v[n[0]][m[0]]=1;
break;
case 77:
if(v[n[0]][m[0]+2]!=2)
wei();
endx=n[x-1];
endy=m[x-1];
for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
if(v[n[0]][m[0]+2]==2)
{
x++;
n[x-1]=endx;
m[x-1]=endy;
food();
}
if(m[0]+2==100)
{
qiang();
if(kbhit!=0)
return 0;
}
if(v[n[0]][m[0]+2]==1)
{
ziji();
if(kbhit!=0)
return 0;
}
m[0]+=2;
v[n[0]][m[0]]=1;
break;
}
prinf();
Sleep(tim);
}
d=getch();
df=d;
d=0;
}
}
游戏截图:
蓦然回首,那蛇却在灯火阑珊处。
眉间盈盈,码量如蚁。