vMatrix 1009

本文介绍了一种使用C语言实现的棋盘游戏模拟器。通过将游戏角色与地图分离的方法简化了游戏逻辑,利用二维数组存储地图信息,并通过坐标变换实现了角色移动。文章详细解释了如何处理边界情况和游戏状态更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hint1:想象一个棋盘,我们可以在上面放一个棋子,无论棋子如何移动,棋盘是不会有任何改变的。同理,我们把“大熊弟”和地图分别想象成棋子和棋盘,将它们分离开来,地图归地图,“大熊弟”归”大熊弟”,然后就和棋子在棋盘上移动一样啦。
Hint2:我们用两个变量(x,y)表示”大熊弟“在地图上的位置,用一个二维数组来存下map[][]来存下地图,把大熊弟所在的初始位置map[i,j]赋值成空格’ ‘,以后无论大熊弟(棋子)怎么移动,我们都不改变地图(棋盘)。
Hint3:关于方向的问题,我们可以设一个数组来表示往不同的方向走这里写图片描述
第一维表示方向,第二维的0对应x坐标,1对应y坐标。那么对于一次移动,我们就只需要这里写图片描述
这样就从旧的大熊弟的坐标(x,y),得到相应移动后的新的大熊弟的坐标(nx,ny),这样就可以帮助我们减少代码量,避免200+,300+行的情况出现啦^_^。
Hint4:得到坐标之后,我们就要判断这个nx,ny是不是一个合法的坐标,不合法的话我们就对这个坐标进行maintain操作这里写图片描述
Hint5:输出的时候我们就直接输出我们一开始存下来那个和棋子分离了的地图,在输出到i=x,j=y的时候改成输出’A’就可以了,其他的都不变。

//不要ctrl+c & ctrl+v!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 22

int n,x,y;
char map[MAXN][MAXN],con[5];
int dir[128][2];
_Bool flag;

void Scan(){
    scanf("%d",&n);
    getchar();
    n+=2;
    for (int i = 0; i < n; i ++) {
        fgets(map[i],n+10,stdin);
        map[i][n]=0;
    }
}

void Maintain(int *x){
    if (*x<1) *x = n - 2;
    if (*x>n-2) *x = 1;
}

void Print(int x,int y){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)
            if ((i==x)&&(j==y)) 
                printf("A");
            else 
                printf("%c",map[i][j]);
        printf("\n");
    }
}

void Move(int k){
    if (flag) {
        Print(x,y); 
        flag=0;
    }
    else {
        int nx=x+dir[k][0],ny=y+dir[k][1];
        Maintain(&nx);
        Maintain(&ny);
        if (map[nx][ny]=='$') {
            puts("Game Over!");
            exit(0);
        }
        if (map[nx][ny]=='@') flag=1;
        if (map[nx][ny]=='#') {
            nx=x;
            ny=y;
        }
        Print(nx,ny);
        x=nx;
        y=ny;
    }
}

int Work(){
    for (int i = 0 ;i < n; i ++) 
        for (int j = 0 ;j < n; j++){
            if (map[i][j]=='A') {
                x = i;
                y = j;
                map[i][j]=' ';
            }
        }
    flag=0;
    while (scanf("%s",con)!=EOF)
        Move(con[0]);
}

void Preprocessing(){
    dir['a'][0]=0;dir['a'][1]=-1;
    dir['d'][0]=0;dir['d'][1]=1;
    dir['w'][0]=-1;dir['w'][1]=0;
    dir['s'][0]=1;dir['s'][1]=0;
}

int main(){
    //freopen("in.txt","r",stdin);这两个函数很实用
    //freopen("out.txt","w",stdout);建议学一下
    Preprocessing();
    Scan();
    Work();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值