012-C语言小游戏之推箱子

一、创建游戏地图

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define ROWS 11
#define COLS 12
 
charmap[ROWS][COLS]={
    "###########",
    "#         #",
    "#O        #",
    "# X#  #  @#",
    "#  #  #   #",
    "#  #  #   #",
    "#  #  #   #",
    "#         #",
    "#         #",
    "###########"
};

因为推箱子游戏地图是由多个格子组成的,所以我们可以使用二维字符数组或字符串数组创建地图。我们可以改变数组中的元素来对游戏功能进行实现。例如:小人移动方向无障碍物,就是小人原来位置的数组元素设置为路,移动后的元素设置为小人。这样就实现了小人移动功能,箱子也是同理。

二、初始化位置和游戏开关

 
1
2
3
4
5
6
7
8
9
10
//游戏开关
intflag=1;
 
//人的坐标
intrenRows=2;
intrenCols=1;
 
//箱子的坐标
intxiangRows=3;
intxiangCols=2;

因为整个游戏操作都是放在循环里的,所以我们先定义一个全局开关,然后用while(开关)来控制游戏的结束。并且在判断用户输入方向前,我们需要先确定小人和箱子的初始位置,再根据用户输入进行判断。

三、接收用户输入方向

 
1
2
3
4
5
printf("W.前  S.后  A.左  D.右  Q.退出\n");
charenterInput='a';
rewind(stdin);
//接收键盘方向
scanf("%c",&enterInput);

接收用户从键盘输入的字符,由于方向4个,加上退出功能就5个分支。所以我们使用switch case结构来实现判断用户输入字符,并执行一些操作。

四、判断用户输入方向

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        //初始化人和箱子的下一个坐标
        intnextRows=0,nextCols=0,nextXiangRows=0,nextXiangCols=0;
        
        //判断方向并操作
        switch(enterInput){
            case'w':
            case'W':{
                nextRows=renRows-1;
                nextCols=renCols;
                nextXiangRows=xiangRows-1;
                nextXiangCols=xiangCols;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case's':
            case'S':{
                nextRows=renRows+1;
                nextCols=renCols;
                nextXiangRows=xiangRows+1;
                nextXiangCols=xiangCols;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case'a':
            case'A':{
                nextRows=renRows;
                nextCols=renCols-1;
                nextXiangRows=xiangRows;
                nextXiangCols=xiangCols-1;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case'd':
            case'D':{
                nextRows=renRows;
                nextCols=renCols+1;
                nextXiangRows=xiangRows;
                nextXiangCols=xiangCols+1;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case'q':
            case'Q':
                //如果输入Q则关闭游戏
                flag=0;
                break;
            default:
                printf("输入错误\n");
                break;
        }

人下一个位置的行下标 nextRows

人下一个位置的列下标 nextCols

箱子下一个位置的行下标 nextXiangRows

箱子下一个位置的列下标 nextXiangCols

这里说的下一个位置就好比,我输入w后向上移动了一个位置,这个新的位置我称他为下一个位置。

如果向上移动,人和箱子的行下标-1,列下标不变。

如果向下移动,人和箱子的行下标+1,列下标不变。

如果向左移动,人和箱子的行下标不变,列下标-1。

如果向右移动,人和箱子的行下标不变,列下标+1。

我这里是先根据方向判断出人和箱子位置会发生的移动变化,并使用局部变量临时存储,所以不用担心人没有顶着箱子的时候,箱子也会跟着移动的问题。因为最终移动后的新位置坐标还是由全局变量来存储的,我只是根据用户输入方向计算出人和箱子下一个位置的新坐标,然后再根据实际情况(实际情况就是人前进方向是否是障碍物,还是箱子来确定的。如果是障碍物,就只有人移动,并只有人刷新位置。如果是箱子,则判断箱子下一个位置是否是障碍物,来刷新人和箱子的新位置)赋值给全局变量。

五、移动控制实现

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
voidmoveRen(intnextRows,intnextCols,intnextXiangRows,intnextXiangCols){
    if(map[nextRows][nextCols]==' '){
        //如果人下一个位置是路
        map[nextRows][nextCols]='O';//下一个位置设置为人
        map[renRows][renCols]=' ';//人原来的位置设置为路
        
        //刷新人的位置
        renRows=nextRows;
        renCols=nextCols;
    }elseif(map[nextRows][nextCols]=='X'&&map[nextXiangRows][nextXiangCols]!='#'&&map[nextXiangRows][nextXiangCols]!='@'){
        //如果人下一个位置是箱子,并且箱子下一个位置不是墙也不是关卡
        map[nextRows][nextCols]='O';//下一个位置设置为人
        map[renRows][renCols]=' ';//人原来的位置设置为路
        map[nextXiangRows][nextXiangCols]='X';//箱子下一个位置设置为箱子
        
        //刷新人和箱子的位置
        renRows=nextRows;
        renCols=nextCols;
        xiangRows=nextXiangRows;
        xiangCols=nextXiangCols;
    }elseif(map[nextXiangRows][nextXiangCols]=='@'){
        //如果箱子下一个位置是关卡,就过关
        printf("您已经过关!\n");
        flag=0;
    }
}

最终程序代码为

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdio.h>
#include <stdlib.h>
#define ROWS 11
#define COLS 12
 
charmap[ROWS][COLS]={
    "###########",
    "#         #",
    "#O        #",
    "# X#  #  @#",
    "#  #  #   #",
    "#  #  #   #",
    "#  #  #   #",
    "#         #",
    "#         #",
    "###########"
};
 
//游戏开关
intflag=1;
 
//人的坐标
intrenRows=2;
intrenCols=1;
 
//箱子的坐标
intxiangRows=3;
intxiangCols=2;
 
//移动小人
voidmoveRen(intnextRows,intnextCols,intnextXiangRows,intnextXiangCols);
 
intmain(intargc,constchar*argv[]){
    
    while(flag){
        system("clear");
        //刷新地图
        for(inti=0;i<ROWS;i++){
            printf("%s\n",map[i]);
        }
        
        printf("W.前  S.后  A.左  D.右  Q.退出\n");
        charenterInput='a';
        rewind(stdin);
        //接收键盘方向
        scanf("%c",&enterInput);
        
        //初始化人和箱子的下一个坐标
        intnextRows=0,nextCols=0,nextXiangRows=0,nextXiangCols=0;
        
        //判断方向并操作
        switch(enterInput){
            case'w':
            case'W':{
                nextRows=renRows-1;
                nextCols=renCols;
                nextXiangRows=xiangRows-1;
                nextXiangCols=xiangCols;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case's':
            case'S':{
                nextRows=renRows+1;
                nextCols=renCols;
                nextXiangRows=xiangRows+1;
                nextXiangCols=xiangCols;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case'a':
            case'A':{
                nextRows=renRows;
                nextCols=renCols-1;
                nextXiangRows=xiangRows;
                nextXiangCols=xiangCols-1;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case'd':
            case'D':{
                nextRows=renRows;
                nextCols=renCols+1;
                nextXiangRows=xiangRows;
                nextXiangCols=xiangCols+1;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case'q':
            case'Q':
                //如果输入Q则关闭游戏
                flag=0;
                break;
            default:
                printf("输入错误\n");
                break;
        }
    }
    return0;
}
 
//移动小人
voidmoveRen(intnextRows,intnextCols,intnextXiangRows,intnextXiangCols){
    if(map[nextRows][nextCols]==' '){
        //如果人下一个位置是路
        map[nextRows][nextCols]='O';//下一个位置设置为人
        map[renRows][renCols]=' ';//人原来的位置设置为路
        
        //刷新人的位置
        renRows=nextRows;
        renCols=nextCols;
    }elseif(map[nextRows][nextCols]=='X'&&map[nextXiangRows][nextXiangCols]!='#'&&map[nextXiangRows][nextXiangCols]!='@'){
        //如果人下一个位置是箱子,并且箱子下一个位置不是墙也不是关卡
        map[nextRows][nextCols]='O';//下一个位置设置为人
        map[renRows][renCols]=' ';//人原来的位置设置为路
        map[nextXiangRows][nextXiangCols]='X';//箱子下一个位置设置为箱子
        
        //刷新人和箱子的位置
        renRows=nextRows;
        renCols=nextCols;
        xiangRows=nextXiangRows;
        xiangCols=nextXiangCols;
    }elseif(map[nextXiangRows][nextXiangCols]=='@'){
        //如果箱子下一个位置是关卡,就过关
        printf("您已经过关!\n");
        flag=0;
    }
}

012-C语言小游戏之推箱子的更多相关文章

  1. 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

    ​ 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...

  2. C语言小游戏: 推箱子 支线(一)--1

    好家伙,考完试了 回顾一下2021 回顾一下某次的作业 妙啊 所以, 做一个推箱子小游戏 1.先去4399找一下关卡灵感 就它了 2.在百度上搜几篇推箱子, 参考其中的"■ ☆"图 ...

  3. [转]Flash ActionScript2.0面向对象游戏开发-推箱子

    本文转自:http://www.alixixi.com/Dev/W3C/Flash/2007/2007070868666.html 概述: Flash ActionScript2.0是一种面向对向的编 ...

  4. C语言小游戏: 2048.c

    概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...

  5. c语言小游戏-扫雷的完成

    C语言-扫雷游戏 本文将对此游戏做一个大致的概述,此代码适合初学者,编写软件使用了vs2017. 该代码可以实现如下功能: 1.用户可以选择3个难度,分别布置不同个数的雷. 2.随机数设置雷的位置. ...

  6. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  7. C语言小游戏——2048

      2048   2048这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢.相撞时会相加. ...

  8. C语言小游戏:贪吃蛇

    #include <graphics.h> #include <conio.h> #include <stdio.h> #define WIDTH 40 //设置宽 ...

  9. c语言小游戏-三子棋的完成

    三子棋的实现 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用‘O’代表电脑下的子,‘X’代表玩家下的子.未下子的时候初始化 ’ ‘(space).则二维数组为“char ...

随机推荐

  1. Java 借助poi操作PDF工具类

    ​ 一直以来说写一个关于Java操作PDF的工具类,也没有时间去写,今天抽空写一个简单的工具类,拥有PDF中 换行,字体大小,字体设置,字体颜色,首行缩进,居中,居左,居右,增加新一页等功能,如果需要 ...

  2. docker:一文学基础使用

    目录 docker介绍 安装与镜像源配置 CentOS7 安装 设置镜像源 补充: 简单使用例子 基础概念 四个概念 镜像概念补充: 容器概念补充: 常用命令: 查看docker信息 镜像操作 容器操 ...

  3. Bash语句中的循环语句注意事项

    case #!/bin/bash case $1 in 9) echo "nine" ;; 8) echo "eight" ;; 7) echo "s ...

  4. 用java分组查elasticsearch

    哎,编程路漫漫,一坑又一坑,爬完还会掉,何时是尽头! 今朝有酒今朝醉,程序不对不敢睡! 还是接口昂,今天还是接口有问题,我是很菜,很笨,但是我还是要努力!! 正文: 接口需求是这样的,根据车型查询在线 ...

  5. vue命令式组件和插件编写

    一直在写各种业务,好多基本用法都忘记了,回顾一下: 一.vue各种UI库里的命令式组件比如element-ui里Notification组件,可以这样调用 this.$notify({ title: ...

  6. 写爬虫爬了3w条职位数据,看看当前招聘形势 | 开源

    最近有不少程序员又开始找工作了,为了了解目前技术类各职位的数量.薪资.招聘公司.岗位职责及要求,我爬取了拉勾网北上广深4个城市的招聘数据,共3w条.职位包括:人工智能(AI).大数据.数据分析.后端( ...

  7. Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分

    题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...

  8. NEKO's Maze Game - Codeforces 题解

    题目 NEKO#ΦωΦ has just got a new maze game on her PC! The game's main puzzle is a maze, in the forms o ...

  9. 使用jdbc实现简单的mvc模式的增删改查

    Mvc模式设计: 视图:添加界面(addUser.jsp),修改界面(updateUser.jsp),显示页面(allUser.jsp) 控制器:添加信息控制器(AddUserServlet),修改信 ...

  10. CCF题库刷题编译错误

    最近在CCF上刷题,因为C语言更合适,就使用了devc编译器,选择C语言但是却报编译错误 后来查了一下,发现在提交时选择C++语言就能满分通过,问题得以解决.