黑马程序员技术交流社区
标题:
sokoban game 推箱子游戏代码,如意大师讲的,自己算是默写吧
[打印本页]
作者:
sunshine429
时间:
2016-1-23 12:58
标题:
sokoban game 推箱子游戏代码,如意大师讲的,自己算是默写吧
//
// main.c
// Sokoban game
//
// Created by Sunshine_yang on 1/23/16.
// Copyright (c) 2016 sunshine-429. All rights reserved.
//
#include <stdio.h>
#define ROW 10
#define COL 21
void printfMap(char arr[ROW][COL]);
void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY);
int main(int argc, const char * argv[]) {
// *********** 定义变量 ***********
// 定义地图 横为Y轴向右坐标增加 竖为X轴向下坐标增加
char map[ROW][COL] = {
"####################",
"#o ########### ",
"### x######### ####",
"### ###",
"### ######## ####",
"######### ####",
"############ ####",
"##### #####",
"##### # ",
"####################",
};
// 定义小人当前位置
int personX = 1;
int personY = 1;
// 定义小人下个位置
int perNextX = 1;
int perNextY = 1;
// 定义用户移动的方向
char direction;
// 定义路
char street = ' ';
// 定义箱子当前位置
int boxX = 2;
int boxY = 4;
// 定义箱子下个位置
int boxNextX = 2;
int boxNextY = 4;
//定义标记
char mark;
// *********** 打印地图 ***********
printfMap(map);
// *********** 输入指令 ***********
printf("请输入移动方向: w->up s->down a->left d->right q->quit\n");
// *********** 循环结构 ***********
while(1)
{
// 接收指令
scanf("%c", &direction);
//吸收回车
getchar();
// 判断指令
// 更新位置
perNextX = personX;
perNextY = personY;
switch(direction)
{
case 'w':
case 'W':
perNextX--;
break;
case 's':
case 'S':
perNextX++;
break;
case 'a':
case 'A':
perNextY--;
break;
case 'd':
case 'D':
perNextY++;
break;
case 'q':
case 'Q':
printf("Y确认,N取消:\n");
scanf("%c",&mark);
getchar();
switch(mark){
case 'y':
case 'Y':printf("程序正在退出。。。\n");
printf("程序已退出!\n");
return 0;
case 'n':
case 'N':
break;
}
}
// 判断小人的下一步是否为路,若为路,小人和路交换
if(map[perNextX][perNextY] == street)
{
exchange(map, personX,personY, perNextX,perNextY);
// 上面交换函数并没有改变小人的位置
personX = perNextX;
personY = perNextY;
//判断小人下个位置是箱子
}else if(map[perNextX][perNextY] == 'x')
{
//让箱子移动位置
boxNextX = boxX + (boxX - personX);
boxNextY = boxY + (boxY - personY);
// 判断箱子的下一步是不是路
if(map[boxNextX][boxNextY] == street)
{
// 交换箱子和路
exchange(map, boxX,boxY, boxNextX,boxNextY);
boxX = boxNextX;
boxY = boxNextY;
// 交换小人和箱子原来的位置
exchange(map, personX,personY, perNextX,perNextY);
personX = perNextX;
personY = perNextY;
}
}
// 打印地图
printfMap(map);
// 判断走出
if(boxY == COL-2)
{
printf("恭喜你成功逃脱!congratulations!\n");
return 0;
}
}
return 0;
}
/**
* 交换位置
*/
void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY)
{
char temp = arr[oldX][oldY];
arr[oldX][oldY] = arr[newX][newY];
arr[newX][newY] = temp;
}
/**
* 打印地图
*/
void printfMap(char arr[ROW][COL])
{
for(int i = 0; i < ROW; i++)
{
// 用%s是个小改进。字符数组用的""结尾有\0,
printf("%s\n", arr[i]);
}
}
复制代码
作者:
zp2161132
时间:
2016-1-27 00:18
我什么时候才能达到这个程度呢?
作者:
13631297627
时间:
2016-1-30 16:11
受教了,不错!!!
作者:
沐一风
时间:
2016-1-30 17:24
写代码写的还是很不错的啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2