问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

哥们,能把推箱子的程序设计发给我没,感谢啊。。。

发布网友 发布时间:2022-05-02 19:23

我来回答

2个回答

热心网友 时间:2022-05-19 05:36

  推箱子游戏是一款很有趣味的游戏,其开发过程有一定的技巧和方法,其中涉及到软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置。二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示各定位,以及部分图形函数的使用。

  具体架构我不说了,直接上代码:

  1、程序预处理

  程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。其中加载头文件的代码如下:
  #include <dos.h>
  #include <stdio.h>
  #include <ctype.h>
  #include <conio.h>
  #include <bios.h>
  #include <alloc.h>

  2、初始化模块

  该模块主要用于对屏幕和关卡的初始化,初始化关卡时是调用画图模块中画图函数。该模块包括以下几个函数。
  (1) void init(),初始化屏幕的大小、显示方式、显示操作提示信息和版权信息。
  (2) winer *initStep1(),初始化游戏的第一关。
  (3) winer *initStep2(),初始化游戏的第二关。
  (4) winer *initStep3(),初始化游戏的第三关。
  (5) winer *initStep4(),初始化游戏的第四关。
  其中初始化屏幕函数的详细代码如下:
  void init()
  {
  int i,j;
  for(i=0;i<20;i++)
  for(j=0;j<20;j++)
  /*屏幕20*20范围内状态初始化为0,表示什么都没有*/
  status[i][j]=0;
  /*设置寄存器AX低位,80*25彩色方式显示*/
  _AL=3;
  /*设置寄存器AX高位*/
  _AH=0;
  geninterrupt(0x10);
  /*移动光标到指定位置输出屏幕信息*/
  gotoxy(41,4);
  printf(" --------- up");
  gotoxy(41,6);
  printf(" --------- down");
  gotoxy(41,8);
  printf(" --------- left");
  gotoxy(41,10);
  printf(" --------- right");
  gotoxy(40,12);
  printf("Space ----- reset");
  gotoxy(40,14);
  printf("Esc ------- quit");
  gotoxy(18,24);
  printf("CopyRight: 2008 LuoFuxing");
  gotoxy(40,4);
  _CX=01;
  _AH=0xa;
  _AL=24;
  geninterrupt(0x10);
  gotoxy(40,6);
  _CX=01;
  _AH=0xa;
  _AL=25;
  geninterrupt(0x10);
  gotoxy(40,8);
  _CX=01;
  _AH=0xa;
  _AL=27;
  geninterrupt(0x10);
  gotoxy(40,10);
  _CX=01;
  _AH=0xa;
  _AL=26;
  geninterrupt(0x10);
  }

  3、 画图模块

  该模块主要用于画图操作,包括画墙、画箱子、画目的地和画小人等。该模块包括以下几个函数。
  (1) void printWall(int x,int y),用于画墙。
  (2) void printBox(int x,int y),在空白地(非目的地)画箱子。
  (3) void printBoxDes(int x,int y),在目的地画箱子。
  (4) void printDestination(int x,int y),画目的地函数。
  (5) void printDestination1(int x,int y,winer **win,winer **pw),画目的地函数,并记录每个目的地的位置。
  (6) void printMan(int x,int y),画小人函数。
  其中画墙函数的代码如下:
  void printWall(int x,int y)
  {
  /*以黑色为背景画绿色墙,用小方块表示*/
  putoutChar(y-1,x-1,219,GREEN,BLACK);
  /*记录状态为墙*/
  status[x][y]='w';
  }

  4、 移动箱子模块

  该模块是实现箱子的移动。根据游戏规则,箱子可以在空地之间、目的地之间、空地和目的地之间来回移动,因此,实现本模块共有以下4个函数。
  (1) void moveBoxSpacetoSpace(int x,int y,char a),把箱子从空地移动到空地。
  (2) void moveBoxDestoSpace(int x,int y,char a),把箱子从目的地移动到空地。
  (3) void moveBoxSpacetoDes(int x,int y,char a),把箱子从空地移动到目的地。
  (4) void moveBoxDestoDes(int x,int y,char a),把箱子从目的地移动到目的地。
  其中从空地移动箱子到空地函数的详细代码如下:
  void moveBoxSpacetoSpace(int x,int y,char a)
  {
  switch(a)
  {
  /*如果按向上键*/
  case 'u':
  /*重设((x-1),y)位置的状态为0*/
  status[x-1][y]=0;
  /*清空(x,y)处原有的小人*/
  printf(" ");
  /*在((x-2),y)处重新画箱子*/
  printBox(x-2,y);
  /*在((x-1),y)处重新画小人*/
  printMan(x-1,y);
  /*重设((x-2),y)位置的状态为箱子*/
  status[x-2][y]='b';
  break;
  /*如果按向下键*/
  case 'd':
  status[x+1][y]=0;
  printf(" ");
  printBox(x+2,y);
  printMan(x+1,y);
  status[x+2][y]='b';
  break;
  /*如果按向左键*/
  case 'l':
  status[x][y-1]=0;
  printf(" ");
  printBox(x,y-2);
  printMan(x,y-1);
  status[x][y-2]='b';
  break;
  /*如果按向右键*/
  case 'r':
  status[x][y+1]=0;
  printf(" ");
  printBox(x,y+2);
  printMan(x,y+1);
  status[x][y+2]='b';
  break;
  default:
  break;
  }
  }

  5、 移动小人模块

  移动小人模块是本程序的核心模块,仅由move()函数来实现。Move()函数控制小人的移动,并调用画图模块、移动箱子模块中的函数来实现箱子的重画、移动等操作。其操作流程可参见图(三)。部分代码如下:
  void move(int x,int y,char a)
  {
  switch(a)
  {
  /*如果按向上键*/
  case 'u':
  /*如果(x-1,y)即小人的下一步状态为墙*/
  if(!judge(x-1,y))
  {
  /*则跳转到(y,x),并跳出循环*/
  gotoxy(y,x);
  break;
  }
  /*如果小人的下一步状态为目的地或者什么都没有*/
  else if(judge(x-1,y)==1||judge(x-1,y)==3)
  {
  /*如果当前状态为目的地*/
  if(judge(x,y)==3)
  {
  /*画目的地*/
  printDestination(x,y);
  /*在新位置重新画小人*/
  printMan(x-1,y);
  break;
  }
  /*如果下一步状态为0*/
  else
  {
  /*输出空字符,覆盖当前状态的小人*/
  printf(" ");
  /*在下一步重新画小人*/
  printMan(x-1,y);
  break;
  }
  }
  /*如果下一步状态是箱子*/
  else if(judge(x-1,y)==2)
  {
  /*如果下下一步为空*/
  if(judge(x-2,y)==1)
  {
  /*则将箱子从空地向上移动到空地*/
  moveBoxSpacetoSpace(x,y,'u');
  /*如果当前状态为目的地*/
  if(judge(x,y)==3)
  /*画目的地*/
  printDestination(x,y);
  gotoxy(y,x-1);
  }
  /*如果下下一步为目的地*/
  else if(judge(x-2,y)==3)
  {
  /*则将箱子从空地向上移动到目的地*/
  moveBoxSpacetoDes(x,y,'u');
  if(judge(x,y)==3)
  printDestination(x,y);
  gotoxy(y,x-1);
  }
  else
  gotoxy(y,x);
  break;
  }
  ……
  ……

  6、 功能控制模块

  功能控制模块包括屏幕输出功能、关卡重置功能和坐标位置状态的判断功能。该模块包括以下几个函数。
  (1) void putoutChar(int y,int x,char fc,char bc),在屏幕上指定的位置输出指定的字符。
  (2) int judge(int x,int y),判断位置(x,y)处的状态,状态值可参见“数据结构设计”部分。
  (3) void reset (int i),重置关卡。
  其中在屏幕上的指定位置输出指定的字符函数的代码如下:
  void putoutChar(int y,int x,char ch,char fc,char bc)
  {
  /*屏幕输出字符*/
  printScreen[(x*160)+(y<<1)+0]=ch;
  /*指定字符颜色fc,背景色bc*/
  printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc;
  }

  7、 主函数

  主函数实现整个程序的控制,其游戏操作流程可参见图(二)。详细代码如下:
  void main()
  {
  /*记录按下的键*/
  int key;
  int x;
  int y;
  /*记录未被推到目的地的箱子个数*/
  int s;
  /*记录已经过了几关*/
  int i=0;
  winer *win;
  winer *pw;
  /*设置寄存器AX低位*/
  _AL=3;
  /*设置寄存器AX高位*/
  _AH=0;
  geninterrupt(0x10);
  init();
  win=initStep1();
  do{
  /*设置AH,读取光标位置*/
  _AH=3;
  geninterrupt(0x10);
  /*读取光标所在的行,加1*/
  x=_DH+1;
  /*读取光标所在的列,加1*/
  y=_DL+1;
  /*bioskey(1)返回0,直到有键按下*/
  while(bioskey(1)==0);
  /*返回按下的键*/
  key=bioskey(0);
  switch(key)
  {
  /*如果按下向上键*/
  case 0x4800:
  move(x,y,'u');
  break;
  /*如果按下向下键*/
  case 0x5000:
  move(x,y,'d');
  break;
  /*如果按下向左键*/
  case 0x4b00:
  move(x,y,'l');
  break;
  /*如果按下向右键*/
  case 0x4d00:
  move(x,y,'r');
  break;
  /*如果按下空格键*/
  case 0x3920:
  reset(i);
  break;
  default:
  break;
  }
  s=0;
  pw=win;
  /*如果指针非空*/
  while(pw)
  {
  /*如果目的地的状态为m,不是i,表示还有箱子
  未被推到目的地,该关还未完成*/
  if(status[pw->x][pw->y]=='m')
  /*未被推到目的地的箱子数*/
  s++;
  /*判断下一个目的地的状态*/
  pw=pw->p;
  }
  /*该关完成*/
  if(s==0)
  {
  /*释放分配的空间*/
  free(win);
  gotoxy(15,20);
  printf("congratulate! You have done this step!");
  getch();
  i++;
  switch(i)
  {
  /*进入第二关*/
  case 1:
  init();
  win=initStep2();
  break;
  /*进入第三关*/
  case 2:
  init();
  win=initStep3();
  break;
  /*进入第四关*/
  case 3:
  init();
  win=initStep4();
  break;
  /*完成所有关*/
  case 4:
  gotoxy(15,21);
  printf("Congratulation! \n");
  gotoxy(15,22);
  printf("You have done all the steps, You are very clever!");
  /*设置键为Esc以便退出程序*/
  key=0x011b;
  /*按任意键结束*/
  getch();
  break;
  default:
  break;
  }
  }

  }while(key!=0x011b);
  _AL=3;
  _AH=0;
  geninterrupt(0x10);
  }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
邪灯是什么意思? 趣头条怎么解绑微信 趣头条APP解绑微信教程 趣头条怎么解绑微信号 趣头条怎样解除微信绑定 魔兽世界7.0古龙之陨怎么做 咸阳男子欲带孩子轻生被救回,成年人的生活有多不易? 陕西咸阳,一男子欲带孩子轻生被救回,轻生带孩子是什么操作? 我是帅哥,为什么还没有人追? 为什么我这么漂亮就是没有一个男人来追我 气死了? 人不在本地,怎么实名制 推箱子入门心得是? 推箱子这一关是不是死局啊? 推箱子游戏是不是可以看出你的智商? 人推箱子是平移现象吗 推箱子小游戏的原理是什么 2尺1的腰围是多少厘米 腰围二尺一等于多少厘米 营业执照变更经营范围需要什么资料 怀孕花胶炖鸡脚的做法 产后马上可以喝花胶鸡汤吗? 冰分子的形状是什么 急需答案 这个是考试用的 冰的融化与冰的形状有什么关系 形容贝加尔湖畔的各种冰的形状的成语有 冰的形状,体积。水蒸气的状态,形状,体积 现在考驾照还要刷学时吗?- 问一问 驾照学时要求 驾照打学时是什么意思? 现在考驾照还用刷学时吗 驾考学时一共多少个小时 驾考学时是什么意思 晏子春秋晏子谏景公告诉我们什么道理 驾驶证B证能开C车型吗? 现在汽车驾照B照能不能开C照的车? B照能驾驶C照吗? B级驾照与C级驾照有什么区别? 晏子谏景公废酒劝成功的原因 晏子谏景公,晏子认为景公与古之贤君不同在哪里?依据? 《晏子谏景公》的译文 爱情需要保鲜,如何让男人对你的爱更持久? B级驾照与C级驾照有什么区别 驾驶证a级b级c级各有什么区别?各自能开那些车?具体各有什么好处? 为什么杭州转塘车管所工作人员说洒水车上牌没有特种车辆这项? 洒水车,跑车,警车,中巴,货车,消防车,救护车,哪些属于工具车。 国家最新条例说吊车不是特种车辆? 知道一个人的微博和还有qq号,怎么看她抖音 能找到抖音号怎么搜 能找到抖音号怎么搜 抖音号记得不过密码忘了用来登录抖音号的新浪微博帐号和密码也忘了怎么办啊? 怎么用别人的找到他的抖音号? 怎么用别人的找到他的抖音?