c 语言 通过二维数组实现推箱子小游戏

//
//  main.c
//  05推箱子
//
//  Created by liuan on 2019/7/9.
//  Copyright © 2019 liuan. All rights reserved.
//

#include <stdio.h>
#define ROWS 10
#define COLS 11
/**
 地图数组,用来把村地图上每一个格子的类型
 */
char map[ROWS][COLS]={
    "##########",
    "#  ####  #",
    "# X####  #",
    "# O      #",
    "######   #",
    "#   ###  #",
    "#        #",
    "#   ######",
    "#         ",
    "##########",
};

//小人 当前所在的行坐标 默认在第三行 二列
int personCurrentRow=3;
int personCurrentCol=2;
/**
 游戏流程
 1 打印地图
 2 接受输入小人的前进方向
 3 根据小人的前进方向来进行推箱子
 
 */
void showMap();

/**
 
 */
char enterDirection();

/**
 将小人移动到指定的方向
 */
void movePerson(char dir);
/*
 根据小人坐标 得到下一个坐标
 */
void getPersonNextPosition(char dir,int currentRow,int currentCol,int *pPersonNextRow,int *pPersonNextCol);

int main() {
    while(1){
 // 1打印地图
    showMap();
    //2 接受小人的前进方向
    char dir=enterDirection();
    //  根据小人的前进方向。来移动小人或者推箱子
        movePerson(dir);
    }}

void showMap(){
    for (int i=0;i<ROWS;i++){
        printf("%s\n",map[i]);
    }
}

char enterDirection(){
    printf("请输入小人的前进方向,a.左边 s.下边 d.右边 w.上边 q.s结束\n");
    char dir='a';
    rewind(stdin);
    scanf("%c",&dir);
    return dir;
}

void getPersonNextPosition(char dir,int currentRow,int currentCol,int *pPersonNextRow,int *pPersonNextCol){
    /*1 向上移动 就要知道小人的上一个格子的类型
     如果上面是1个墙 不能动
     如果上面是个路 移动
     如果上面是箱子,判断箱子上面是什么
     路:推
     墙:不动
     
     
     2 首先要拿到小人的上一个坐标
     要拿到小人的一上一个坐标 必须知道当前的坐标
     根据小人现在的坐标 计算小人的上1个坐标
     
     */
    
    int personNextRow=currentRow-1;
    int personNextCol=currentCol;
    switch (dir) {
        case 'a':
        case 'A':
            personNextRow=currentRow;
            personNextCol=currentCol-1;
            break;
        case 'w':
        case 'W':
            personNextRow=currentRow-1;
            personNextCol=currentCol;
            break;
        case 'd':
        case 'D':
            personNextRow=currentRow;
            personNextCol=currentCol+1;
            break;
        case 's':
        case 'S':
            personNextRow=currentRow+1;
            personNextCol=currentCol;
            break;
       
            
            
        default:
            break;
    }
    *pPersonNextRow=personNextRow;
    *pPersonNextCol=personNextCol;
    
}
void movePerson(char dir){
    int personNextRow=0;
    int personNextCol=0;
    getPersonNextPosition(dir,personCurrentRow,personCurrentCol,&personNextRow,&personNextCol);
    printf("%d\n",personNextRow);
    printf("%d\n",personNextCol);
    
    //3 判断小人的上1个是什么格子。
    if(map[personNextRow][personNextCol]==' '){
        //说明是个路 小人移动
        //将上1个格子赋值为"O" 小人现在的位置复制为“ ”
        map[personNextRow][personNextCol]='O';
          map[personCurrentRow][personCurrentCol]=' ';
        //更新位置
        personCurrentCol=personNextCol;
        personCurrentRow=personNextRow;
    }else if (map[personNextRow][personNextCol]=='X'){
        //上一个格子是箱子
        // 判断能不能推
        // 1 找到箱子上面的格子的坐标
        // 计算出 箱子上面的坐标
        
        
        int boxNxtRow=0;
        int boxNextCol=0;
        getPersonNextPosition(dir, personNextRow,personNextCol, &boxNxtRow,&boxNextCol);

        if(map[boxNxtRow][boxNextCol]==' '){
            //推位置
            // a 把当前上一个格子设置为箱子
            // 当前箱子的格子设置为小人
            // 把小人的位置设置为空格
            map[boxNxtRow][boxNextCol]='X';
            map[personNextRow][personNextCol]='O';
            map[personCurrentRow][personCurrentCol]=' ';
            //更新位置
            personCurrentRow=personNextRow;
            personCurrentCol=personNextCol;
          
            
        }
    }
    
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值