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

📄 main.lst

📁 在AT89S52上写的一个扫雷程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 582   5         case 8:
 583   5         photo_disp(i, j, eight) ;break;/*显示一个eight的方块*/
 584   5      }
 585   4      break;
 586   4      }
 587   3      }}
 588   1       
 589   1      }
 590          
 591          /*------------------------------------------------------------*/
 592          /*                    画这个扫雷表格                            */
 593          /*------------------------------------------------------------*/
 594          void drawTable() small
 595          {
 596   1      int i,j;
 597   1      for(i=0;i<ROW;i++)
 598   1      for(j=0;j<COL;j++) drawBlock(i,j);
 599   1      }
 600          
 601          /*------------------------------------------------------------*/
 602          /*                    开始一个新游戏                            */
 603          /*------------------------------------------------------------*/
 604          void newGame() small
 605          {
 606   1      generateMine();
 607   1      pi = pj = 1;
 608   1      drawTable();
 609   1      }
 610          
 611          /*------------------------------------------------------------*/
 612          /*                  检查所有的雷是否都开了                     */
 613          /*------------------------------------------------------------*/
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 11  

 614          int checkWin()small
 615          {
 616   1      int i,j;
 617   1      for(i=0;i<ROW;i++){
 618   2      for(j=0;j<COL;j++){
 619   3      if(table[i][j] == 0 && flag[i][j] != OPEN) return 0;
 620   3      }
 621   2      }
 622   1      return 1;
 623   1      }
 624          
 625          /*------------------------------------------------------------*/
 626          /*                  询问是否要继续还是退出                     */
 627          /*------------------------------------------------------------*/
 628          int confirm(int res)small
 629          {
 630   1      if(res == 1) {    /*显示胜利界面,询问是否要继续*/
 631   2      bmp_disp(win);
 632   2      byte_disp(6,1,a);
 633   2      byte_disp(6,2,g);
 634   2      byte_disp(6,3,a);
 635   2      byte_disp(6,4,i);
 636   2      byte_disp(6,5,n);
 637   2      }
 638   1      
 639   1      else if(res == -1)
 640   1      { /*显示失败界面,询问是否要继续*/
 641   2      byte_disp(3,2,l);
 642   2      byte_disp(3,3,o);
 643   2      byte_disp(3,4,s);
 644   2      byte_disp(3,5,t);
 645   2      
 646   2      byte_disp(5,1,a);
 647   2      byte_disp(5,2,g);
 648   2      byte_disp(5,3,a);
 649   2      byte_disp(5,4,i);
 650   2      byte_disp(5,5,n);
 651   2      
 652   2      }
 653   1      
 654   1      else {              /*询问是否要退出*/
 655   2      byte_disp(3,2,e);
 656   2      byte_disp(3,3,x);
 657   2      byte_disp(3,4,i);
 658   2      byte_disp(3,5,t);
 659   2      
 660   2      byte_disp(5,1,a);
 661   2      byte_disp(5,2,g);
 662   2      byte_disp(5,3,a);
 663   2      byte_disp(5,4,i);
 664   2      byte_disp(5,5,n);
 665   2      
 666   2      }
 667   1      Delay400Ms();
 668   1      BF=0;
 669   1      
 670   1      while(1){			
 671   2      if (BF==1)
 672   2      { Decode(KeyV);break;}
 673   2      else				
 674   2      EA = 1;
 675   2      }
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 12  

 676   1      if(DisChar == 'Y' || DisChar == 'y') return 0;
 677   1      return 1;
 678   1      }
 679          
 680          /*------------------------------------------------------------*/
 681          /*                    向上移动                                */
 682          /*------------------------------------------------------------*/
 683          void moveUp(){
 684   1      if(pi>0){
 685   2      pi=pi-1;
 686   2      drawBlock(pi+1,pj);
 687   2      drawBlock(pi,pj);
 688   2      }
 689   1      
 690   1      /*------------------------------------------------------------*/
 691   1      /*                     向下移动                                */
 692   1      /*------------------------------------------------------------*/
 693   1      }
 694          void moveDown(){
 695   1      if(pi<ROW-1){
 696   2      pi=pi+1;
 697   2      drawBlock(pi-1,pj);
 698   2      drawBlock(pi,pj);
 699   2      }
 700   1      
 701   1      /*------------------------------------------------------------*/
 702   1      /*                     向左移动                                */
 703   1      /*------------------------------------------------------------*/
 704   1      }
 705          void moveLeft(){
 706   1      if(pj>0){
 707   2      pj=pj-1;
 708   2      drawBlock(pi,pj+1);
 709   2      drawBlock(pi,pj);
 710   2      }
 711   1      }
 712          
 713          /*------------------------------------------------------------*/
 714          /*                     向右移动                                */
 715          /*------------------------------------------------------------*/
 716          void moveRight(){
 717   1      if(pj<COL-1){
 718   2      pj=pj+1;
 719   2      drawBlock(pi,pj-1);
 720   2      drawBlock(pi,pj);
 721   2      }
 722   1      }
 723          
 724          /*------------------------------------------------------------*/
 725          /*                  标志方块有雷的转化程序                     */
 726          /*------------------------------------------------------------*/
 727          void flagBlock(int i,int j)small
 728          {
 729   1      if(flag[i][j] == FLAGED){
 730   2      flag[i][j] = UNFLAG;
 731   2      }
 732   1      else if(flag[i][j] == UNFLAG){
 733   2      flag[i][j] = FLAGED;
 734   2      }
 735   1      drawBlock(i,j);
 736   1      }
 737          
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 13  

 738          /*------------------------------------------------------------*/
 739          /*                  标志方块有疑问的转化程序                    */
 740          /*------------------------------------------------------------*/
 741          void questBlock(int i,int j)small
 742          {
 743   1      if(flag[i][j] == QUESTION){
 744   2      flag[i][j] = UNFLAG;
 745   2      }
 746   1      else {
 747   2      if(flag[i][j] == UNFLAG) flag[i][j] = QUESTION;
 748   2      }
 749   1      drawBlock(i,j);
 750   1      }
 751          
 752          /*------------------------------------------------------------*/
 753          /*                  扫雷(一个方块)                           */
 754          /*------------------------------------------------------------*/
 755          int openMine(int i,int j) small reentrant
 756          {
 757   1      int ii,jj,k;
 758   1      if(flag[i][j] == OPEN) return 0;
 759   1      if(table[i][j]){ /*meet a mine*/
 760   2      for(ii=0;ii<ROW;ii++){
 761   3      for(jj=0;jj<COL;jj++){
 762   4      if(table[ii][jj] && flag[ii][jj] == UNFLAG){
 763   5      flag[ii][jj] = EXPLOD;
 764   5      drawBlock(ii,jj);
 765   5      }
 766   4      }
 767   3      }
 768   2      return -1; /*lose the game*/
 769   2      }
 770   1      else{
 771   2      flag[i][j] = OPEN;
 772   2      drawBlock(i,j);
 773   2      if(num[i][j]==0){
 774   3      for(k=0;k<8;k++){
 775   4      int ni = i + di[k];
 776   4      int nj = j + dj[k];
 777   4      if(ni>=0 && ni< ROW && nj>=0 && nj<COL)
 778   4      openMine(ni,nj);
 779   4      }
 780   3      }
 781   2      return 0;
 782   2      }
 783   1      }
 784          
 785          /*------------------------------------------------------------*/
 786          /*                  自动扫雷                                  */
 787          /*------------------------------------------------------------*/
 788          int autoOpen(int i,int j) small
 789          {
 790   1      int k,c=0;
 791   1      int ni,nj;
 792   1      int ret=0;
 793   1      if(! (flag[i][j] == OPEN)) return 0;
 794   1      for(k=0;k<8;k++){
 795   2      ni = i + di[k];
 796   2      nj = j + dj[k];
 797   2      if(ni>=0 && ni< ROW && nj>=0 && nj<COL)
 798   2      if(flag[ni][nj] == FLAGED) c++;
 799   2      }
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 14  

 800   1      if(c == num[i][j]){
 801   2      for(k=0;k<8;k++){
 802   3      int ni = i + di[k];
 803   3      int nj = j + dj[k];
 804   3      if(ni>=0 && ni< ROW && nj>=0 && nj<COL)
 805   3      if(flag[ni][nj] == UNFLAG){
 806   4      if(openMine(ni,nj) == -1) ret = -1;
 807   4      }
 808   3      }
 809   2      }
 810   1      return ret;
 811   1      }
 812          
 813          
 814          
 815          
 816          /*----------main.c------------*/
 817          
 818          void main() small
 819          {
 820   1          int data	gameRes;
 821   1      	 unsigned char data	key;
 822   1          RS=0;  /*初始化LCD显示器和8255*/
 823   1          E=0;
 824   1          com8255=0x80;
 825   1          init_lcd();
 826   1          Clr_Scr();
 827   1          bmp_disp(cover);
 828   1              IT1 = 0; 
 829   1      	  EA = 1;
 830   1      	  EX1 = 1;
 831   1          while(1)
 832   1           {  if(BF) 
 833   2                {BF=0;break;}
 834   2            }
 835   1          bmp_disp(start);
 836   1      	 
 837   1      do {
 838   2      newGame();/*开始一个新游戏*/
 839   2      gameRes=0;
 840   2      /*当按键按下后主循环的处理过程*/
 841   2      do{
 842   3      key = getKey();
 843   3      if(key == 'e') break;
 844   3      switch(key){
 845   4      case 'p':/*ENTER: case SPACE:*/ gameRes = openMine(pi,pj);break;
 846   4      case 'w'/*UP*/: moveUp();break;
 847   4      case 's'/*DOWN*/: moveDown();break;
 848   4      case 'a':/*LEFT:*/ moveLeft();break;
 849   4      case 'd':/*RIGHT:*/ moveRight();break;
 850   4      case 'f':/*LOWERF: case UPPERF:*/ flagBlock(pi,pj);break;
 851   4      case 'o':/*LOWERA: case UPPERA:*/ gameRes = autoOpen(pi,pj);break;
 852   4      case 'q':/*LOWERQ:case UPPERQ:*/ questBlock(pi,pj);break;
 853   4      }
 854   3      if(checkWin()) gameRes = 1;
 855   3      }while(!gameRes);
 856   2      
 857   2      }while(!confirm(gameRes));
 858   1      Clr_Scr();
 859   1      while(1){;}
 860   1      }

C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 15  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   4858    ----
   CONSTANT SIZE    =   7932    ----
   XDATA SIZE       =    384    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     44      56
   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 + -