📄 main.lst
字号:
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 + -