文档章节

C - 推箱子小游戏

gwl_
 gwl_
发布于 2016/12/22 14:58
字数 941
阅读 4
收藏 0

#include <stdio.h>
#include <stdlib.h>

#define ROWS 10
#define COLS 11

/** 二维数组 */
char map[ROWS][COLS] = {
    "##########",
    "#  ####  #",
    "# X####  #",
    "# O      #",
    "######   #",
    "#  ####  #",
    "#        #",
    "#   ######",
    "#         ",
    "##########"
};

/** 保存小人当前的行坐标 */
int currentPersonRow = 3;

/** 保存小人当前的列坐标 */
int currentPersonCol = 2;

/** 显示游戏地图 */
void showMap();

/** 让用户输入小人的前进方向,将用户输入的字符返回 */
char enterDirection();

/** 将小人向上移动 */
void moveToUp();
/** 将小人向下移动 */
void moveDown();
/** 将小人向左移动 */
void moveToLeft();
/** 将小人向右移动 */

void moveToRight();

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        int flag = 1;
        
        while (flag)
        {
            // 调用一个函数,就可以将控制台上的内容清空
            //#include <stdlib.h>
            // 清空控制台上所有内容
            //清除操作xcode下面的输出区域太不支持
            //需要在终端运行才可以清空
            system("clear");
            
            showMap();
        
            // 判断游戏是否胜利
            if (map[8][9] == 'X')
            {
                printf("恭喜你取得游戏的胜利\n");
                break;
            }
            
            char dir = enterDirection();
            
            switch (dir) {
                case 'a':
                case 'A':
                    //将小人向左移动
                    moveToLeft();
                    break;
                case 'w':
                case 'W':
                    //将小人向上移动
                    moveToUp();
                    break;
                case 's':
                case 'S':
                    //将小人向下移动
                    moveDown();
                    break;
                case 'd':
                case 'D':
                    //将小人向右移动
                    moveToRight();
                    break;
                case 'q':
                case 'Q':
                    //退出
                    printf("你的智商真底\n");
                    flag = 0;
                    break;
                default:
                    break;
            }
        }
    }
    return 0;
}

char enterDirection()
{
    //输入小人的前进方向
    printf("请输入小人的前进方向 w.上 s.下 a.左 d.右 q.退出游戏\n");
    //接收输入小人的方向
    char dir = 'a';
    
    //将scanf缓冲区中的数据清空,避免输入的时候会出现一些问题
    rewind(stdin);
    scanf("%c",&dir);
    
    //将用户输入的前进方向返回
    return dir;
}
/** 显示游戏地图 */
void showMap()
{
    // 打印map数组中的元素
    for (int i = 0; i < ROWS; i ++)
    {
        printf("%s\n",map[i]);
    }
}
/** 将小人向上移动 */
void moveToUp()
{
    // 下一个行坐标
    int nextPersonRow = currentPersonRow - 1;
    // 下一个列坐标
    int nextPersonCol = currentPersonCol;
    //判断下一个坐标在地图上的格子是个什么类型
    if (map[nextPersonRow][nextPersonCol] == ' ')
    {
        // 路,移动小人
        map[nextPersonRow][nextPersonCol] = 'O';
        map[currentPersonRow][currentPersonCol] = ' ';
        
        // 从新设置小人当前坐标
        currentPersonRow = nextPersonRow;
        currentPersonCol = nextPersonCol;
        
    } else if (map[nextPersonRow][nextPersonCol] == 'X')
    {
        int nextBoxRow = nextPersonRow - 1;
        int nextBoxCol = nextPersonCol;
        
        if (map[nextBoxRow][nextBoxCol] == ' ')
        {
            // 路,移动小人
            map[nextBoxRow][nextBoxCol] = 'X';
            map[nextPersonRow][nextPersonCol] = 'O';
            map[currentPersonRow][currentPersonCol] = ' ';
            
            // 从新设置小人当前坐标
            currentPersonRow = nextPersonRow;
            currentPersonCol = nextPersonCol;
        }
    }
}
/** 将小人向下移动 */
void moveDown()
{
    // 下一个行坐标
    int nextPersonRow = currentPersonRow + 1;
    // 下一个列坐标
    int nextPersonCol = currentPersonCol;
    
    //判断下一个坐标在地图上的格子是个什么类型
    if (map[nextPersonRow][nextPersonCol] == ' ')
    {
        // 路,移动小人
        map[nextPersonRow][nextPersonCol] = 'O';
        map[currentPersonRow][currentPersonCol] = ' ';
        
        // 从新设置小人当前坐标
        currentPersonRow = nextPersonRow;
        currentPersonCol = nextPersonCol;
        
    } else if (map[nextPersonRow][nextPersonCol] == 'X')
    {
        int nextBoxRow = nextPersonRow + 1;
        int nextBoxCol = nextPersonCol;
        
        if (map[nextBoxRow][nextBoxCol] == ' ')
        {
            // 路,移动小人
            map[nextBoxRow][nextBoxCol] = 'X';
            map[nextPersonRow][nextPersonCol] = 'O';
            map[currentPersonRow][currentPersonCol] = ' ';
            
            // 从新设置小人当前坐标
            currentPersonRow = nextPersonRow;
            currentPersonCol = nextPersonCol;
        }
    }
}
/** 将小人向左移动 */
void moveToLeft()
{
    // 下一个行坐标
    int nextPersonRow = currentPersonRow;
    // 下一个列坐标
    int nextPersonCol = currentPersonCol - 1;
    
    //判断下一个坐标在地图上的格子是个什么类型
    if (map[nextPersonRow][nextPersonCol] == ' ')
    {
        // 路,移动小人
        map[nextPersonRow][nextPersonCol] = 'O';
        map[currentPersonRow][currentPersonCol] = ' ';
        
        // 从新设置小人当前坐标
        currentPersonRow = nextPersonRow;
        currentPersonCol = nextPersonCol;
        
    } else if (map[nextPersonRow][nextPersonCol] == 'X')
    {
        int nextBoxRow = nextPersonRow;
        int nextBoxCol = nextPersonCol - 1;
        
        if (map[nextBoxRow][nextBoxCol] == ' ')
        {
            // 路,移动小人
            map[nextBoxRow][nextBoxCol] = 'X';
            map[nextPersonRow][nextPersonCol] = 'O';
            map[currentPersonRow][currentPersonCol] = ' ';
            
            // 从新设置小人当前坐标
            currentPersonRow = nextPersonRow;
            currentPersonCol = nextPersonCol;
        }
    }
}
/** 将小人向右移动 */
void moveToRight()
{
    // 下一个行坐标
    int nextPersonRow = currentPersonRow;
    // 下一个列坐标
    int nextPersonCol = currentPersonCol + 1;
    
    //判断下一个坐标在地图上的格子是个什么类型
    if (map[nextPersonRow][nextPersonCol] == ' ')
    {
        // 路,移动小人
        map[nextPersonRow][nextPersonCol] = 'O';
        map[currentPersonRow][currentPersonCol] = ' ';
        
        // 从新设置小人当前坐标
        currentPersonRow = nextPersonRow;
        currentPersonCol = nextPersonCol;
        
    } else if (map[nextPersonRow][nextPersonCol] == 'X')
    {
        int nextBoxRow = nextPersonRow;
        int nextBoxCol = nextPersonCol + 1;
        
        if (map[nextBoxRow][nextBoxCol] == ' ')
        {
            // 路,移动小人
            map[nextBoxRow][nextBoxCol] = 'X';
            map[nextPersonRow][nextPersonCol] = 'O';
            map[currentPersonRow][currentPersonCol] = ' ';
            
            // 从新设置小人当前坐标
            currentPersonRow = nextPersonRow;
            currentPersonCol = nextPersonCol;
        }
    }
}

 

© 著作权归作者所有

下一篇: 知识架构图
gwl_
粉丝 1
博文 230
码字总数 119285
作品 0
其它
私信 提问
js 简单的推箱子小游戏步骤解析--大家都玩过的

前言 推箱子小游戏大家肯定都玩过,之所以写这篇文章,是觉得这个小游戏足够简单好理解,大家看完文章之后,自己也能花上半天功夫敲出一个推箱子小游戏来,如果喜欢的话可以点波赞,或者关注...

2018/01/09
0
0
原生 JS 智能推箱子游戏 - aitxz

一个用原生js编写的智能推箱子 机器人可以在游戏中随时启动机器人可以自动推箱子当然机器人也可以在游戏中随时停止 当然启动机器人的时候我们的箱子必须得可以推成功才行哦 进入死胡同了肯定...

abc_y
2018/12/19
0
0
Java版推箱子(搬箱子)游戏开发入门示例及源码

推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1...

cping
2018/06/26
0
0
Java swing实现的小游戏推箱子升级版项目源码

大家好,今天给大家演示一下由Java swing实现的推箱子小游戏升级版,该项目实现了推箱子游戏的主要功能,可在Java环境下运行,jdk版本不限,比我们上次演示的推箱子游戏功能上复杂了一点,下...

llqqxf
2017/12/13
0
0
纯C写的小游戏-----最炫酷推箱子

很多编程爱好者都编写过推箱子游戏编程吧,最近有好些朋友看见我以前的推箱子程序后, 问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正...

小辰GG
2017/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DLA SQL技巧:行、列转换和JSON数据列展开

1. 简介 在数据库SQL处理中,常常有行转列(Pivot)和列转行(Unpivot)的数据处理需求。本文以示例说明在Data Lake Analytics中,如何使用SQL的一些技巧,达到行转列(Pivot)和列转行(Unp...

阿里云官方博客
12分钟前
0
0
分布式数据库选型——数据水平拆分方案

概述 水平拆分的概念随着分布式数据库的推广已为大部分人熟知。分库分表、异构索引、小表广播、这些功能几乎是产品功能需求标配。然而有些客户使用分布式数据库后的体验不尽如意。 本文尝试从...

阿里云云栖社区
12分钟前
0
0
Swagger2常用注解说明

这里只讲述@Api、@ApiOperation、@ApiImplicitParams、@ApiImplicitParam、@ApiParam、@ApiModel、@ApiModelProperty、ApiResponses、@ApiResponse这几个常用的。 一、@Api 用在请求的类上,...

Ryan-瑞恩
13分钟前
0
0
DM 源码阅读系列文章(八)Online Schema Change 同步支持

作者:lan 本文为 DM 源码阅读系列文章的第八篇,上篇文章 对 DM 中的定制化数据同步功能进行详细的讲解,包括库表路由(Table routing)、黑白名单(Black & white table lists)、列值转化...

TiDB
22分钟前
1
0
使用nginx负载均衡登录后不能跳转的问题

upstream test-server { #ip_hash; server 192.168.0.1:8080 weight=10; server 192.168.0.1:8081 weight=10;} 在测试环境中模拟生产使用nginx做应用负载均衡,登录页面可以...

Jack088
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部