⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 一个推箱子的游戏,编程思想很值得借鉴,对大家会很有帮助
💻 LST
📖 第 1 页 / 共 3 页
字号:
 269   1      }
 270          /**********************************************************
 271          *函数名:MapCreate() 
 272          *功  能:地图生成程序
 273          **********************************************************/
 274          void MapCreate()
 275          {
 276   1         uchar i;
 277   1         for (i=0;i<64;i++) //生成8X8的地图
 278   1         {
 279   2                      switch (Map[i])//获得地图上的图形数据
 280   2                      {       //将图形编号对应的数据写入显存
 281   3                              case 0: 
 282   3                                      WriteMemorizer(i,kong);//空
 283   3                                      break;
 284   3                              case 1:
 285   3                                      WriteMemorizer(i,qiang);//墙
 286   3                                      break;
 287   3                              case 2:
 288   3                                      WriteMemorizer(i,yuan);//圆
 289   3                                      break;
 290   3                              case 3:
 291   3                                      WriteMemorizer(i,xiangzi);//箱子
 292   3                                      break;
 293   3                              case 4:
 294   3                                      WriteMemorizer(i,lian);//脸
 295   3                                      break;
 296   3                              case 5:
 297   3                                      WriteMemorizer(i,shizi);//十字
 298   3                                      break;
 299   3                      }
 300   2         }
 301   1      }
 302          /**********************************************************
 303          *函数名:GameDisplay() 
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 6   

 304          *功  能:游戏图形显示程序(从左到右,从上到下)
 305          *  *point指向外部RAM存储的128X64的图片数据
 306          **********************************************************/
 307          void GameDisplay(uchar xdata *point)
 308          {
 309   1        uchar i,j;
 310   1        LCDWriteCommand(0x34);//扩充指令集
 311   1        LCDWriteCommand(0x36);//绘图显示开
 312   1        for (i=0;i<32;i++)    //写上半屏(32行)
 313   1        {
 314   2          LCDWriteCommand(0x80+i);//Y地址寄存器
 315   2              LCDWriteCommand(0x80);  //X地址(LCM自动加1)
 316   2              for (j=0;j<16;j++)//16x8列
 317   2              {                                                 //获得GamePic的首地址
 318   3                      LCDWriteData(*point);//写入一个字节图形数据
 319   3                      point++; //指向下一个图形字节
 320   3              }
 321   2        }
 322   1        for (i=0;i<32;i++) //写下半屏
 323   1        {
 324   2          LCDWriteCommand(0x80+i);//Y地址寄存器
 325   2              LCDWriteCommand(0x88);  //X地址(LCM自动加1)
 326   2              for (j=0;j<16;j++)//
 327   2              {
 328   3                      LCDWriteData(*point);//写入一个字节图形数据
 329   3                      point++;
 330   3              }
 331   2        }
 332   1      }
 333          /**********************************************************
 334          *函数名:ReadPosition()
 335          *功  能:读得娃娃脸的当前坐标位置
 336          *返  回:ReadPos
 337          **********************************************************/
 338          uchar ReadPosition()
 339          {
 340   1              uchar i;
 341   1              uchar ReadPos;    //定义变量存放娃娃脸的位置.
 342   1              for (i=0;i<64;i++)//地图数据是64个字节
 343   1              {                                 //逐个比较找出娃娃脸
 344   2                      if(Map[i]==4) //娃娃脸的编号是4
 345   2                      { 
 346   3                              ReadPos = i;//记录娃娃脸的坐标
 347   3                              break;      //找到娃娃脸就跳出循环
 348   3                      }
 349   2              }
 350   1              return (ReadPos); //返回娃娃脸当前位置
 351   1      }
 352          /**********************************************************
 353          *函数名:Readyuan()
 354          *功  能:读得圆形的坐标位置(箱子移动目的地)
 355          *在初次读入当前地图数据是,5(十字)也认为是圆,不然就出错,
 356          *推动十字形后就少一个圆了.
 357          **********************************************************/
 358          void Readyuan()
 359          {
 360   1         uchar i,j=0;
 361   1         for (i=0;i<64;i++)//地图数据是64个字节
 362   1         {                             //圆形的编号是2
 363   2                if (Map[i]==2||Map[i]==5) //找出圆形的位置
 364   2                {//在编地图的时候也用十字形.
 365   3                      yuanPos[j] = i;//存放圆形的位置
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 7   

 366   3                      j++;           //计数圆形的个数
 367   3                      yuanPos[6] = j;//存放圆形的个数
 368   3                }
 369   2         }
 370   1      }
 371          /**********************************************************
 372          *函数名:Refyuan()
 373          *功  能:刷新显示圆形(箱子移动目的地)
 374          **********************************************************/
 375          void Refyuan()
 376          {
 377   1         uchar i;      //yuanPos[6] 存放着圆形的个数(3--5个)
 378   1         for (i=0;i<yuanPos[6];i++)//根据圆的个数来判断
 379   1         {   //判断圆形的坐标位置是否为0(空),是就显示圆形
 380   2                 if(Map[yuanPos[i]]==0) Map[yuanPos[i]]=2;
 381   2         }
 382   1      }
 383          /**********************************************************
 384          *函数名:Next()
 385          *功  能:进入下一关
 386          **********************************************************/
 387          void Next()
 388          {  //圆形位置全变为十字形(5),说明推完了,过关
 389   1         if (Map[yuanPos[0]]==5&&Map[yuanPos[1]]==5&&Map[yuanPos[2]]==5)
 390   1         {//过关
 391   2                              guanka++; //进入下一关
 392   2                              if (guanka==20) guanka=0;//这里设置为20关
 393   2                              CopyMap(guanka);//复制地图数据
 394   2                              MapCreate();    //地图生成程序
 395   2                              GameDisplay(GamePic);  //游戏界面显示程序
 396   2                              Readyuan();     //复制当前关卡圆形坐标和个数
 397   2         }
 398   1      }
 399          /**********************************************************
 400          *函数名:UpMove()
 401          *功  能:娃娃脸向上移动
 402          *说  明:向上移动是-8 (8X8的数据间隔是8)
 403          *空(什么都不显示)=0,墙=1,圆=2,箱子=3,脸=4,十字=5
 404          **********************************************************/
 405          void UpMove()
 406          {
 407   1         uchar pos;
 408   1         pos = ReadPosition(); //获得娃娃脸的位置
 409   1         if (Map[pos-8]!=1)    //判断移动方向前面是否是墙
 410   1         {
 411   2               switch (Map[pos-8]) 
 412   2                {
 413   3                         case 0: //移动方向前面是空的执行这里
 414   3                                      Map[pos-8] = 4;//娃娃脸的新位置
 415   3                                      Map[pos] =0;   //清空娃娃脸位置
 416   3                                      break;
 417   3                         case 2: //是圆形执行这里
 418   3                                      Map[pos-8] = 4;//娃娃脸的新位置
 419   3                                      Map[pos] =0;   //清空娃娃脸位置
 420   3                                      break;
 421   3                         case 3: //移动方向前面是箱子执行这里
 422   3                                      //箱子的前面不是墙或箱子或十字就可以移动
 423   3                                      if (Map[pos-16]==0)
 424   3                                      {
 425   4                                              Map[pos-16]= 3;//显示箱子
 426   4                                              Map[pos-8] = 4;//娃娃脸的新位置
 427   4                                              Map[pos] = 0;  //清空娃娃脸位置
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 8   

 428   4                                      }
 429   3                                      else if (Map[pos-16]==2)
 430   3                                      {
 431   4                                              Map[pos-16]= 5;//显示十字形
 432   4                                              Map[pos-8] = 4;//娃娃脸的新位置
 433   4                                              Map[pos] = 0;  //清空娃娃脸位置
 434   4                                      }
 435   3                                      break;
 436   3                         case 5: //移动方向前面是十字执行这里
 437   3                                      //十字的前面不是墙或箱子或十字就可以移动
 438   3                                      if (Map[pos-16]==0)
 439   3                                      {
 440   4                                              Map[pos-16]= 3;//显示箱子
 441   4                                              Map[pos-8] = 4;//娃娃脸的新位置
 442   4                                              Map[pos] = 0;  //清空娃娃脸位置
 443   4                                      }
 444   3                                      else if (Map[pos-16]==2)
 445   3                                      {
 446   4                                              Map[pos-16]= 5;//显示十字形
 447   4                                              Map[pos-8] = 4;//娃娃脸的新位置
 448   4                                              Map[pos] = 0;  //清空娃娃脸位置
 449   4                                      }
 450   3                                      break;
 451   3                }
 452   2                Refyuan();    //刷新圆形
 453   2                MapCreate();  //刷新地图
 454   2            GameDisplay(GamePic);//显示游戏界面
 455   2                Next();       //判断是否满足进入下一关
 456   2         }
 457   1      }
 458          /**********************************************************
 459          *函数名:DownMove() 
 460          *功  能:娃娃脸向下移动 +8
 461          **********************************************************/
 462          void DownMove()
 463          {
 464   1         uchar pos;
 465   1         pos = ReadPosition(); //获得娃娃脸的位置
 466   1         if (Map[pos+8]!=1)    //判断移动方向前面是否是墙
 467   1         {
 468   2               switch (Map[pos+8]) //得到娃娃脸前面的图形
 469   2                {
 470   3                         case 0: //移动方向前面是空的执行这里
 471   3                                      Map[pos+8] = 4;//娃娃脸的新位置
 472   3                                      Map[pos] = 0;  //清空娃娃脸位置
 473   3                                      break;
 474   3                         case 2: //是圆形执行这里
 475   3                                      Map[pos+8] = 4;//娃娃脸的新位置
 476   3                                      Map[pos] = 0;  //清空娃娃脸位置
 477   3                                      break;
 478   3                         case 3: //移动方向前面是箱子执行这里
 479   3                         //箱子的前面不是墙或箱子或十字就可以移动
 480   3                                      if (Map[pos+16]==0)
 481   3                                      {
 482   4                                              Map[pos+16]= 3;//显示箱子
 483   4                                              Map[pos+8] = 4;//娃娃脸的新位置
 484   4                                              Map[pos] = 0;  //清空娃娃脸位置
 485   4                                      }
 486   3                                      else if(Map[pos+16]==2)
 487   3                                      {
 488   4                                              Map[pos+16]= 5;//显示十字形
 489   4                                              Map[pos+8] = 4;//娃娃脸的新位置
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 9   

 490   4                                              Map[pos] = 0;  //清空娃娃脸位置
 491   4                                      }
 492   3                                      break;
 493   3                         case 5: //移动方向前面是十字执行这里
 494   3                                      //十字的前面不是墙或箱子或十字就可以移动
 495   3                                      if (Map[pos+16]==0)
 496   3                                      {
 497   4                                              Map[pos+16]= 3;//显示箱子
 498   4                                              Map[pos+8] = 4;//娃娃脸的新位置
 499   4                                              Map[pos] = 0;  //清空娃娃脸位置
 500   4                                      }
 501   3                                      else if(Map[pos+16]==2)
 502   3                                      {
 503   4                                              Map[pos+16]= 5;//显示十字形
 504   4                                              Map[pos+8] = 4;//娃娃脸的新位置
 505   4                                              Map[pos] = 0;  //清空娃娃脸位置
 506   4                                      }
 507   3                                      break;
 508   3                }
 509   2                Refyuan();    //刷新圆形
 510   2                MapCreate();  //刷新地图
 511   2            GameDisplay(GamePic);//显示游戏界面
 512   2                Next();       //判断是否满足进入下一关
 513   2         }
 514   1      }
 515          /**********************************************************
 516          *函数名:LeftMove() 
 517          *功  能:娃娃脸向左移动 -1
 518          **********************************************************/
 519          void LeftMove()
 520          {
 521   1         uchar pos;
 522   1         pos = ReadPosition(); //获得娃娃脸的位置
 523   1         if (Map[pos-1]!=1)    //判断移动方向前面是否是墙
 524   1         {
 525   2                switch (Map[pos-1]) 
 526   2                {
 527   3                         case 0: //移动方向前面是空的执行这里
 528   3                                      Map[pos-1] = 4;//娃娃脸的新位置
 529   3                                      Map[pos] =0;   //清空娃娃脸位置
 530   3                                      break;
 531   3                         case 2: //是圆形执行这里
 532   3                                      Map[pos-1] = 4;//娃娃脸的新位置
 533   3                                      Map[pos] =0;   //清空娃娃脸位置
 534   3                                      break;
 535   3                         case 3: //移动方向前面是箱子执行这里
 536   3                                      //箱子的前面不是墙或箱子或十字就可以移动
 537   3                                      if (Map[pos-2]==0)
 538   3                                      {
 539   4                                              Map[pos-2]= 3;//显示箱子
 540   4                                              Map[pos-1]= 4;//娃娃脸的新位置
 541   4                                              Map[pos] = 0; //清空娃娃脸位置
 542   4                                      }
 543   3                                      else if (Map[pos-2]==2)
 544   3                                      {
 545   4                                          Map[pos-2]= 5; //显示十字形

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -