命令行界面通过打印字符实现了贪吃蛇游戏的基本功能
代码仅130行
实现原理为,采用链式单调数列在矩阵地图中储存为蛇的坐标信息。
//贪吃蛇的实现原理在于,将蛇在矩阵中的点表示为正数,并且由蛇尾到蛇头是有向的,从1逐个递增的数列。
//每次移动时,将蛇头下一格的数据填入当前蛇头的数据+1,再使得地图矩阵的所有正数-1,即可实现整体蛇的移动。 如(01234500 -》 01234560 -》00123450)
//若吃到食物,则不执行整体-1,即可实现长度+1;
//移动例子 如 0 1 2 3 4 5 0 0 -》
// 0 1 2 3 4 5 6 0 -》 (若吃到食物,执行到这一步结束就是蛇的边长。)
// 0 0 1 2 3 4 5 0
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define M 20 //可调节地图的宽高
#define N 40
#define SL 5
int G=1;
int l=SL;
int boundary_x,boundary_y;
int frame[M][N]={0};
int turn=4;
void initialization()
{
boundary_x=M;
boundary_y=N;
}
void refresh()
{
int i,j;
system("cls");
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
if(frame[i][j]==-1) printf("*");
else if(frame[i][j]==0) printf(" ");
else if(frame[i][j]==1) printf("@");
else if(frame[i][j]>1) printf("#");
else if(frame[i][j]==-2) printf("X");
//printf("%3d",frame[i][j]);
printf("\n");
}
printf("得分:%d",l-SL);
}
void withinput()
{
int i,j;
char c;
if(kbhit())
{
c=getch();
if(turn!=3&&(c=='w'||c=='W')) turn=1;
else if(turn!=4&&(c=='a'||c=='A')) turn=2;
else if(turn!=1&&(c=='s'||c=='S')) turn=3;
else if(turn!=2&&(c=='d'||c=='D')) turn=4;
}
}
void withoutinput()
{
int i,j,p=0;
int x=-1,y=-1;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(frame[i][j]>0) //蛇身整体++
frame[i][j]++;
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{if(frame[i][j]==2)
{
if(turn==2) {if(frame[i][j-1]==0||frame[i][j-1]==-2) frame[i][j-1]=1;
else if(frame[i][j-1]>0||frame[i][j-1]==-2) G=0;
else if(frame[i][j-1]==-1) frame[i][N-2]=1;}
else if(turn==4){if(frame[i][j+1]==0||frame[i][j+1]==-2) frame[i][j+1]=1;
else if(frame[i][j+1]>0||frame[i][j+1]==-2) G=0;
else if(frame[i][j+1]==-1) frame[i][1]=1;}
else if(turn==1){if(frame[i-1][j]==0||frame[i-1][j]==-2) frame[i-1][j]=1;
else if(frame[i-1][j]>0||frame[i-1][j]==-2) G=0;
else if(frame[i-1][j]==-1) frame[M-2][j]=1;}
else if(turn==3){if(frame[i+1][j]==0||frame[i+1][j]==-2) frame[i+1][j]=1;
else if(frame[i+1][j]>0||frame[i+1][j]==-2) G=0;
else if(frame[i+1][j]==-1) frame[1][j]=1;}
}
}
for(i=0;i<M;i++)
for(j=0;j<N;j++){
if(frame[i][j]==l+1) //除尾操作
frame[i][j]=0;
if(frame[i][j]==-2) //判断场上是否存在目标
p=1; //p=1为判断存在
}
if(p==0) //取模随机生成;
{
l++;
do{
x=rand()%(M-2)+1;
y=rand()%(N-2)+1;
if(frame[x][y]==0)
frame[x][y]=-2;
}
while(frame[x][y]!=-2);
}
if(G==0)
exit(0);
}
int main()
{
int x,y;
int i,j;
i=M/2;
for(j=M/2;j<M/2+SL;j++)
frame[i][j]=M/2+SL-j;
x=rand()%(M-2)+1;
y=rand()%(N-2)+1;
frame[x][y]=-2;
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
if(i==0||i==M-1||j==0||j==N-1)
frame[i][j]=-1;}
while(1)
{
refresh();
withinput();
withoutinput();
Sleep(50);
}
}
运行截图: