设计简单的贪吃蛇

概念

贪吃蛇是让用户手动操控蛇头来吃食物,不碰到边界和蛇身。目标是使游戏回合数最多。

思路

用队列存储蛇,这样可以O(1)得到蛇尾。
模拟和维护四个方向移动时的情况。

规则

H是蛇头,X是蛇身,M是食物,*是边界。
输入行数n和列数m,地图中不会有除边界外的障碍物,地图保证有且仅有一个食物,碰到边界或蛇身时游戏结束,并输出步数。

代码

//蛇长度初始是5 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");
    }   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值