概念
贪吃蛇是让用户手动操控蛇头来吃食物,不碰到边界和蛇身。目标是使游戏回合数最多。
思路
用队列存储蛇,这样可以O(1)得到蛇尾。
模拟和维护四个方向移动时的情况。
规则
H是蛇头,X是蛇身,M是食物,*是边界。
输入行数n和列数m,地图中不会有除边界外的障碍物,地图保证有且仅有一个食物,碰到边界或蛇身时游戏结束,并输出步数。
代码
#include<bits/stdc++.h>
#define inf 1e9
#define rep(i,l,r) for (int i=l;i<=r;i++)
using namespace std;
int n,m,mcnt=0,x=1,y=5,pre,rx,ry,len=5;
struct node{int x,y;};
queue<node> q;
char Map[1005][1005];
void makemap(){
puts("n=");
scanf("%d",&n);
system("cls");
puts("m=");
scanf("%d",&m);
system("cls");
rep(i,0,n+1) rep(j,0,m+1) Map[i][j]=' ';
rep(i,0,m+1) Map[0][i]=Map[n+1][i]='*';
rep(i,0,n+1) Map[i][0]=Map[i][m+1]='*';
rep(i,1,4) Map[1][i]='X',q.push((node){1,i});
Map[1][5]='H'; q.push((node){1,5});
}
void init(){
while (1){
if (mcnt) break;
rx=rand()%n+1,ry=rand()%m+1;
if (Map[rx][ry]==' ') Map[rx][ry]='M',mcnt++;
}
rep(i,0,n+1) {
rep(j,0,m+1) printf("%c",Map[i][j]); puts("");
}
}
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int solve(int i){
int xx=x+dx[i],yy=y+dy[i];
if (Map[xx][yy]!=' '&&Map[xx][yy]!='M') return 0;
if (Map[xx][yy]!='M') {
Map[q.front().x][q.front().y]=' '; q.pop();
} else mcnt--,len++;
Map[x][y]='X';
Map[xx][yy]='H'; q.push((node){xx,yy}); x=xx; y=yy;
return 1;
}
char ch[2];
int main(){
srand(time(NULL));
makemap();
pre=0;
int steps=0;
while (1){
init();
scanf("%s",ch);
int flag;
if (ch[0]=='d') flag=solve(0);
if (ch[0]=='s') flag=solve(1);
if (ch[0]=='a') flag=solve(2);
if (ch[0]=='w') flag=solve(3);
if (!flag) {printf("GAME OVER!\nyour steps:%d\n",steps); break;}
steps++;
system("cls");
}
}