指针小应用:推箱子游戏
来源:互联网 发布:外贸数据网 编辑:程序博客网 时间:2024/09/21 06:33
推箱子和迷宫有点类似,不过多了箱子位置的判断,需要利用指针比较方便.
程序调试过程中出现过几个bug:
第一次:小人推着箱子能穿墙!
检查发现第二个判定条件里没加箱子的下一步是路> <
第二次:把箱子推到目的地以后,箱子到了目标'!'的位置,人移到箱子位置,'!'移到原来人所在的位置.到达目的条件永远不会满足,程序在死循环中无法退出
错误原因:能否推动箱子判定的是箱子的下一步不是'#',显然'!'也不是'#',导致交换了三者的位置.进而找到游戏成功的判定条件出现了基础错误.本来是判定箱子地址所指向的内容是否是'!',仔细一想箱子地址指向的内容永远是'm',后来换成箱子当前地址是否等于最初'!'的地置,即map[2][10]的地址.后来在朋友的提醒下,可以设置一个标记值(初始flag=0)想到当箱子推到目的地时直接记录(flag=1).更加简单明了.
最后:就是细节上的再优化,其实还有许多能做的.
通过这个小游戏的编写,有以下几点体会:
1.宏定义的好处:利用宏定义了地图的行和列以后,如果地图有更改,比如增加难度,可以让地图从12*12扩大到15*20,那么只要直接更改宏定义的行和列数值,然后再初始化一下map就好,不需要再去更改程序中的数值了.游戏更新的时候方便许多.
2.要培养简单思考问题的习惯,将任务划分为一个一个单一的问题,逐一完成
3.指针的灵活性:利用指针明显要比迷宫游戏中利用数组下标记录位置方便太多了
//
// 打印地图.m
// 应用:推箱子游戏
//
// Created by lanou3g on 15/6/24.
// Copyright (c) 2015年 ZhangJia. All rights reserved.
#import "打印地图.h"
@implementation ____
void printMap(char map[COL][ROW]){
for (int i =0; i <COL; i++) {
for (int j =0; j <ROW; j++) {
printf("%c",map[i][j]);
}
printf("\n");
}
}
@end
// main.m
// 应用:推箱子游戏
//
// Created by lanou3g on 15/6/22.
// Copyright (c) 2015年 ZhangJia. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "打印地图.h"
#define COL 12
#define ROW 12
int main(int argc,constchar * argv[])
{
//******** 定义变量 **********
//1.定义地图数组map
char map[COL][ROW]={
'#','#','#','#','#','#','#','#','#','#','#','#',
'#','R','#',' ',' ',' ','#',' ',' ','#','#','#',
'#',' ','m',' ',' ',' ',' ',' ','#','#','!','#',
'#',' ','#',' ','#',' ','#','#',' ',' ',' ','#',
'#',' ',' ',' ',' ',' ',' ','#',' ',' ',' ','#',
'#',' ','#','#','#',' ',' ','#','#',' ','#','#',
'#',' ','#','#','#',' ',' ',' ','#',' ','#','#',
'#',' ','#',' ',' ',' ',' ',' ',' ',' ','#','#',
'#',' ','#',' ','#','#',' ',' ','#',' ','#','#',
'#',' ',' ',' ','#','#',' ','#','#',' ','#','#',
'#',' ',' ',' ','#','#',' ',' ',' ',' ',' ','#',
'#','#','#','#','#','#','#','#','#','#','#','#',
};
//2.定义变量接受小人和箱子的位置
char *r = &map[1][1];
char derection =0;
char ch =0;
int flag =0;
//******** 打印地图 **********
//打印地图
printMap(map);
//提示用户玩法w-上 s-下 a-左 d-右 其他任意键-退出
printf("Game Start!\nw-上 s-下 a-左 d-右 其他任意键-退出游戏\n");
//******** 循环控制 **********
//1.接受输入的方向
//2.判断
// 1.if如果小人的下一步是路
// 满足,移动小人
// else-->
// 2.if判断小人的下一个位置是否是箱子,且箱子的下一步有路可走
// 满足,箱子移到路的位置,小人移到箱子位置,路移到原来小人的位置
// else-->
// 3.下一步是箱子且箱子下一步是目标
// 满足:箱子移到目标的位置,小人移到箱子位置,小人原来的位置变成路(即:空格),标记符记1
while (1) {
scanf("%c",&derection);
scanf("%c",&ch);//吸收\n
switch (derection) {
case'W':
case'w':
if (*(r-ROW)==' ') {
int temp = *(r-ROW);
*(r-ROW) = *r;
*r = temp;
r -=12;//小人的下一步是路则移动小人
}elseif (*(r-ROW)=='m' && *(r-ROW-ROW) ==' '){
int temp = *(r-ROW-ROW);
*(r-ROW-ROW)=*(r-ROW);
*(r-ROW) = *r;
*r = temp;//小人的下一步是箱子且箱子的下一步是路则移动箱子和小人
r -=12;//刷新小人位置
}elseif (*(r-ROW)=='m' && *(r-ROW-ROW) =='!'){
*(r-ROW-ROW) = *(r-ROW);
*(r-ROW) = *r;
*r =' ';
flag =1;//标记是否到达目的地
}
break;
case'S':
case's':
if (*(r+ROW)==' ') {
int temp = *(r+ROW);
*(r+ROW) = *r;
*r = temp;
r +=12;
}elseif (*(r+ROW)=='m' && *(r+ROW+ROW)==' '){
int temp = *(r+ROW+ROW);
*(r+ROW+ROW)=*(r+ROW);
*(r+ROW) = *r;
*r = temp;
r +=12;
}elseif (*(r+ROW)=='m' && *(r+ROW+ROW) =='!'){
*(r+ROW+ROW) = *(r+ROW);
*(r+ROW) = *r;
*r =' ';
flag =1;//标记是否到达目的地
}
break;
case'A':
case'a':
if (*(r-1)==' ') {
int temp = *(r-1);
*(r-1) = *r;
*r = temp;
r -=1;
}elseif (*(r-1)=='m' && *(r-1-1)==' '){
int temp = *(r-1-1);
*(r-1-1)=*(r-1);
*(r-1) = *r;
*r = temp;
r -=1;
}elseif (*(r+1)=='m' && *(r+1+1) =='!'){
*(r+1+1) = *(r+1);
*(r+1) = *r;
*r =' ';
flag =1;//标记是否到达目的地
}
break;
case'D':
case'd':
if (*(r+1)==' ') {
int temp = *(r+1);
*(r+1) = *r;
*r = temp;
r +=1;
}elseif (*(r+1)=='m' && *(r+1+1)==' '){
int temp = *(r+1+1);
*(r+1+1)=*(r+1);
*(r+1) = *r;
*r = temp;
r +=1;
}elseif (*(r-1)=='m' && *(r-1-1) =='!'){
*(r-1-1) = *(r-1);
*(r-1) = *r;
*r =' ';
flag =1;//标记是否到达目的地
}
break;
default:
printf("您已成功退出游戏!O(∩_∩)O谢谢!\n");
break;
}
//******** 刷新地图 **********
printMap(map);
//******** 是否成功 **********
if (flag ==1) {
printf("O(∩_∩)O YOU WIN!!!\n");
break;
}
}
return 0;
}
运行结果部分截图(R是小人,m是箱子,!是目标位置):
- 指针小应用:推箱子游戏
- 应用:推箱子游戏
- 应用:《推箱子》游戏思路
- 推箱子游戏代码
- 推箱子游戏代码
- 推箱子游戏
- 类【推箱子】游戏
- js推箱子游戏
- jq游戏----推箱子
- 推箱子游戏
- 推箱子游戏实现
- C 推箱子游戏
- 推箱子游戏
- 推箱子游戏
- 【网易游戏】推箱子
- 推箱子游戏
- 简易推箱子游戏
- 简易推箱子游戏
- 【Effective c++ 读书笔记】条款01 视 C++ 为一个语言联邦
- JAVA基础第五天
- java 6.24
- LintCode-k数和 II
- 基础了解
- 指针小应用:推箱子游戏
- stm32f4xx 加密
- Java基础(四)
- 键盘向右错位
- 集合总结
- [Java]学习笔记,随笔【一】
- file总结
- 批量产生ssh2项目中hibernate带注解的pojo类的快捷方法
- 1216: 斐波那契数列