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

📄 main.lst

📁 一个推箱子的游戏,编程思想很值得借鉴,对大家会很有帮助
💻 LST
📖 第 1 页 / 共 3 页
字号:
 546   4                                              Map[pos-1]= 4;//娃娃脸的新位置
 547   4                                              Map[pos] = 0; //清空娃娃脸位置
 548   4                                      }
 549   3                                      break;
 550   3                         case 5: //移动方向前面是十字执行这里
 551   3                                      //十字的前面不是墙或箱子或十字就可以移动
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 10  

 552   3                                      if (Map[pos-2]==0)
 553   3                                      {
 554   4                                              Map[pos-2]= 3;//显示箱子
 555   4                                              Map[pos-1]= 4;//娃娃脸的新位置
 556   4                                              Map[pos] = 0; //清空娃娃脸位置
 557   4                                      }
 558   3                                      else if (Map[pos-2]==2)
 559   3                                      {
 560   4                                          Map[pos-2]= 5;//显示十字形
 561   4                                              Map[pos-1]= 4;//娃娃脸的新位置
 562   4                                              Map[pos] = 0; //清空娃娃脸位置
 563   4                                      }
 564   3                                      break;
 565   3                }
 566   2            Refyuan();    //刷新圆形
 567   2                MapCreate();  //刷新地图
 568   2                GameDisplay(GamePic);//显示游戏界面
 569   2                Next();       //判断是否满足进入下一关
 570   2         }
 571   1      }
 572          /**********************************************************
 573          *函数名:RightMove() 
 574          *功  能:娃娃脸向右移动 +1
 575          **********************************************************/
 576          void RightMove()
 577          {
 578   1         uchar pos;
 579   1         pos = ReadPosition(); //获得娃娃脸的位置
 580   1         if (Map[pos+1]!=1)    //判断移动方向前面是否是墙
 581   1         {
 582   2                switch (Map[pos+1]) 
 583   2                {
 584   3                         case 0: //移动方向前面是空的执行这里
 585   3                                      Map[pos+1] = 4;//娃娃脸的新位置
 586   3                                      Map[pos] =0;   //清空娃娃脸位置
 587   3                                      break;
 588   3                         case 2: //是圆形执行这里
 589   3                                      Map[pos+1] = 4;//娃娃脸的新位置
 590   3                                      Map[pos] =0;   //清空娃娃脸位置
 591   3                                      break;
 592   3                         case 3: //移动方向前面是箱子执行这里
 593   3                                      //箱子的前面不是墙或箱子或十字就可以移动
 594   3                                      if (Map[pos+2]==0)
 595   3                                      {
 596   4                                              Map[pos+2]= 3;//显示箱子
 597   4                                              Map[pos+1]= 4;//娃娃脸的新位置
 598   4                                              Map[pos] = 0; //清空娃娃脸位置
 599   4                                      }
 600   3                                      else if(Map[pos+2]==2)
 601   3                                      {
 602   4                                              Map[pos+2]= 5;//显示十字形
 603   4                                              Map[pos+1]= 4;//娃娃脸的新位置
 604   4                                              Map[pos] = 0; //清空娃娃脸位置
 605   4                                      }
 606   3                                      break;
 607   3                         case 5: //移动方向前面是十字执行这里
 608   3                                      //十字形的前面不是墙或箱子或十字就可以移动
 609   3                                      if (Map[pos+2]==0)
 610   3                                      {
 611   4                                              Map[pos+2]= 3;//显示箱子
 612   4                                              Map[pos+1]= 4;//娃娃脸的新位置
 613   4                                              Map[pos] = 0; //清空娃娃脸位置
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 11  

 614   4                                      }
 615   3                                      else if(Map[pos+2]==2)
 616   3                                      {
 617   4                                              Map[pos+2]= 5;//显示十字形
 618   4                                              Map[pos+1]= 4;//娃娃脸的新位置
 619   4                                              Map[pos] = 0; //清空娃娃脸位置
 620   4                                      }
 621   3                                      break;
 622   3                }
 623   2         Refyuan();    //刷新圆形
 624   2         MapCreate();  //刷新地图
 625   2         GameDisplay(GamePic);//显示游戏界面
 626   2         Next();       //判断是否满足进入下一关
 627   2         }
 628   1      }
 629          /**********************************************************
 630          *延时400us
 631          **********************************************************/
 632          void Delay400us() //晶振=12MHz 延时时间=404us
 633           {                                //晶振=11.0592MHz 延时时间≈438us
 634   1              uchar i,j;        //总的延时时间=[(2*i)+1]*j+1+1
 635   1              for (j=4;j>0;j--) //j=2用12MHz,j=4 是24MHz晶振
 636   1                      for (i=100;i>0;i--);
 637   1       }
 638          /**********************************************************
 639          *函数名:Sound()
 640          *功  能:音效子程序
 641          **********************************************************/
 642          void Sound()
 643          {
 644   1       uchar i;
 645   1       for (i=40;i>0;i--)
 646   1       {
 647   2               Beep=~Beep;
 648   2               Delay400us();
 649   2       }
 650   1      }
 651          /**********************************************************
 652          *函数名:IR()
 653          *功  能:外中断遥控按键解码程序(108ms)
 654          **********************************************************/
 655          void IR() interrupt 0 
 656          {
 657   1        uchar i,k;
 658   1        EA = 0;                       //关外中断0
 659   1        if (P3_2==0)          //P3.2低电平继续
 660   1        {
 661   2              for (i=8;i>0;i--)       //循环检测10次,低电平引导信号干扰检测(9ms)
 662   2              {
 663   3                      Delay400us(); //延时438us
 664   3                      if (P3_2==1)  //低电平引导信号出现高电平就跳出
 665   3                      { 
 666   4                              EA = 1; //开外中断
 667   4                              return;
 668   4                      }
 669   3              }
 670   2              while(P3_2==0); //等待高电平引导信号到了.
 671   2              for (i=8;i>0;i--)  //循环检测10次,高电平引导信号干扰检测(4.5ms)
 672   2              {
 673   3                      Delay400us();
 674   3                      if (P3_2==0) //高电平引导信号出现低电平就跳出
 675   3                      { 
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 12  

 676   4                              EA = 1; //开外中断
 677   4                              return;
 678   4                      }
 679   3              }
 680   2              while(P3_2==1); //等待高电平引导信号结束.
 681   2              //接收4个字节的数据
 682   2              for (k=0;k<4;k++)                                                                                                   
 683   2              {
 684   3                      for (i=8;i>0;i--)  //8位数据
 685   3                      {
 686   4                              while(P3_2==0);         //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
 687   4                              Delay400us();
 688   4                              Delay400us();           //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
 689   4                              KeyCoding[k]>>= 1; //右移1位
 690   4                              if(P3_2==1)             //仍是1,最高位写入1,0跳过
 691   4                                      KeyCoding[k]|= 0x80;
 692   4                              while(P3_2==1);         //等待高电平结束
 693   4                      }
 694   3              }
 695   2              //比较地址码和地址反码,不同解码错误退出
 696   2              if (KeyCoding[0]!=~KeyCoding[1]&&KeyCoding[2]!=~KeyCoding[3])
 697   2              { 
 698   3                      EA = 1; //开外中断
 699   3                      return;
 700   3              }
 701   2        }
 702   1        //按键判断也可以放到这里
 703   1        Sound();      //解码成功声音提示.
 704   1        EA = 1;       //开外中断
 705   1      }
 706          /**********************************************************
 707          *函数名:LOGO()
 708          *功  能:开机画面
 709          **********************************************************/
 710          LOGO()
 711          {
 712   1        uchar i,j;
 713   1        LCDWriteCommand(0x30);//基本指令集
 714   1        LCDWriteCommand(0x80);//从第一行开始显示
 715   1        for (i=0;i<4;i++)
 716   1        {
 717   2                for (j=0;j<16;j++)
 718   2                {
 719   3                        LCDWriteData(logotab[i][j]);
 720   3                }
 721   2        }
 722   1      }
 723          /**********************************************************
 724          *函数名:Delay1S()
 725          *功  能:初始化
 726          **********************************************************/
 727          Delay1S(uchar n)
 728          {
 729   1        uchar i,j,k,l;
 730   1        for (l=n;l>0;l--)
 731   1        {
 732   2              for (i=100;i>0;i--)
 733   2              {
 734   3                      for (j=40;j>0;j--)
 735   3                              for (k=250;k>0;k--);
 736   3              }
 737   2        }
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 13  

 738   1      }
 739          /**********************************************************
 740          *函数名:Init(void)
 741          *功  能:初始化
 742          **********************************************************/
 743          void Init()
 744          {
 745   1              EA  = 1; //开总中断
 746   1              IT0 = 1; //外中断0边沿触发
 747   1              EX0 = 1; //开外中断0
 748   1      }
 749          /**********************************************************
 750          *函数名:main (void)
 751          *功能:主函数
 752          **********************************************************/
 753          void main (void)
 754          {
 755   1        uint i;
 756   1        Delay1S(1);//等待电源稳定
 757   1        LCDInit();   //液晶初始化程序
 758   1        for (i=1024;i>0;i--) GamePic[i] = 0;  //外部RAM清0
 759   1        LOGO(); //
 760   1        Delay1S(4);
 761   1        LCDWriteCommand(0x01);
 762   1        Delay400us();
 763   1        CopyMap(0);  //复制地图数据
 764   1        MapCreate(); //地图生成程序
 765   1        GameDisplay(GamePic);//游戏界面显示程序
 766   1        Readyuan();   //读得圆形的坐标位置和个数
 767   1        Init();          //
 768   1        while(1)
 769   1        {
 770   2               switch (KeyCoding[2])  //可以放到主程序的while(1)循环中.
 771   2              {//按键判断
 772   3                case  0x51:  //确定键
 773   3                              guanka++; //关卡选择(测试地图编辑的是否正确用的)
 774   3                              if (guanka==20) guanka=0;
 775   3                              CopyMap(guanka);  //复制地图数据
 776   3                              MapCreate();  //地图生成程序
 777   3                              GameDisplay(GamePic);//游戏界面显示程序
 778   3                              Readyuan();   //读圆形的坐标和数目
 779   3                              KeyCoding[2] = 0;
 780   3                              break;
 781   3                case  0x06:  //向上键
 782   3                              UpMove();
 783   3                              KeyCoding[2] = 0;
 784   3                              break;
 785   3                case  0x44:  //向下键
 786   3                              DownMove();
 787   3                              KeyCoding[2] = 0;
 788   3                              break;
 789   3                case  0x47:  //向左键
 790   3                              LeftMove();
 791   3                              KeyCoding[2] = 0;
 792   3                              break;
 793   3                case  0x40:  //向右键
 794   3                              RightMove();
 795   3                              KeyCoding[2] = 0;
 796   3                              break;
 797   3                case  0x02:  //第一次按进入设置,第二次退出设置状态
 798   3                              KeyCoding[2] = 0;
 799   3                              break;
C51 COMPILER V8.08   MAIN                                                                  06/15/2007 17:28:51 PAGE 14  

 800   3                case  0x07:  //系统设定键
 801   3                              KeyCoding[2] = 0;
 802   3                              break;
 803   3              }
 804   2        }
 805   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1656    ----
   CONSTANT SIZE    =   1524    ----
   XDATA SIZE       =     74    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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