黑马程序员技术交流社区

标题: C语言 应用:推箱子游戏代码实现 [打印本页]

作者: l5681065    时间: 2015-11-24 18:02
标题: C语言 应用:推箱子游戏代码实现
#include <stdio.h>
#include <stdlib.h>
#define kRows 10
#define kCols 11
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
/*
//1、定义变量,保存地图、位置信息

//2、打印地图

//3、提示玩法

//4、编写控制程序
*/
/*
打印地图
*/
void printMap(char map[kRows][kCols])
{
int i;
for(i=0;i<kRows;i++)
{
  printf("%s\n",map[i]);
}
}
/*
移动的函数
*/
void move1(char map[kRows][kCols],int oldX,int oldY,int newX,int newY)
{
char temp;
temp=map[oldX][oldY];
map[oldX][oldY]=map[newX][newY];
map[newX][newY]=temp;
}
int main(int argc, char *argv[]) {
//********* 定义变量 *********

//1、定义地图
char map[kRows][kCols]={
"##########",
"#0 ####  #",
"# X####  #",
"#        #",
"######   #",
"#  ####  #",
"#        #",
"#   ######",
"#         ",
"##########"
};
//定义变量保存位置信息
//定义小人、箱子当前位置信息
int personX =1;
int personY =1;
int boxX=2;
int boxY=2;
//小人、箱子将要移动的下一个位置信息
int personNextX=1;
int personNextY=1;
int boxNextX=2;
int boxNextY=2;
//定义变量接受用户输入的方向   
char direction=0;
//定义路的字符
char street=' ';
char box='X';

//********* 打印地图 *********

//2、打印一遍地图
printMap(map);
printf("请控制小人移动:w.上 s.下 a.左 d.右 \n");
//********* 编写循环控制程序 *********
int i=0;
while(1)
{
  
//3、接收用户输入的方向
  scanf("%c",&direction);
  getchar();
  
  //4、判断方向
  switch(direction)
  {
   case 'w':
   case 'W':
    personNextX--;
    break;
   case 's':
   case 'S':
    personNextX++;
    break;
   case 'a':
   case 'A':
    personNextY--;
    break;
   case 'd':
   case 'D':
    personNextY++;
    break;
   case 'q':
   case 'Q':   
    printf("程序已退出\n");
    return 0;   
  }
//5、根据用户输入的方9向 判断如何移动
//  先判断小人的下个位置是否是路
//   如果是路,先让小人移动  
//********* 判断模块 *********
  if(map[personNextX][personNextY]==street)
  {
   //移动
   //让小人和路进行交换
   
   move1(map,personX,personY,personNextX,personNextY);
   personX=personNextX;
   personY=personNextY;
  }
//  如果不是路
//   再次判断是否是箱子
//   如果是箱子,计算箱子的下一个位置
  else if(map[personNextX][personNextY]=='X'){
  

    boxNextX=boxX+(boxX-personX);
    boxNextY=boxY+(boxY-personY);
//   再次判断箱子的下一个位置是否是路
    if(map[boxNextX][boxNextY]==street)
    {
//    如何移动小人和箱子呢?
//    1)移动箱子到箱子的下一个位置
     move1(map,boxX,boxY,boxNextX,boxNextY);      
//    2)让小人移动到箱子的原来的位置   
     move1(map,personX,personY,boxX,boxY);
//    重新调整小人、箱子的位置
     personX=personNextX;
     personY=personNextY;
     boxX=boxNextX;
     boxY=boxNextY;
    }
  }
  //如果不是箱子,什么也不干
  //防穿墙
  else
  {
   personNextX=personX;
   personNextY=personY;
  }
   

   
  
//********* 重绘地图 *********
//6、重绘地图
  printMap(map);
  

//********* 判断是否走出来 *********
//7、箱子的位置等于9
  if(boxY==kCols-2)
  {
   printf("你出来了\n");
   break;
  }
  i++;
  printf("i=%d\n",i);
  
}

return 0;
}

作者: 陈光慧    时间: 2015-11-25 22:11
谢谢分享
作者: fenghun1991    时间: 2015-11-25 23:38
谢谢分享
作者: 木易延    时间: 2015-11-26 20:04
厉害                     




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2