📄 game.lst
字号:
C51 COMPILER V7.00 GAME 11/23/2009 14:38:57 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE GAME
OBJECT MODULE PLACED IN game.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE game.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <REG52.H>
2 #include "12864.h"
3 #include "asc.h"
4 #define uchar unsigned char
5 #define uint unsigned int
6 sbit P00 =P0^0;
7 sbit P01 =P0^1;
8 sbit P02 =P0^2;
9 sbit P03 =P0^3;
10 sbit P04 =P0^4;
11 #define RIGHT 1
12 #define LIFT 2
13 #define UP 3
14 #define DOWN 4
15 bit ESC=1; //开始 暂停标志位
16 bit START=1; //重新开始标志位
17 bit M_LEVEL=0; //显示难度标志位
18 bit hero=0; //完成游戏
19 unsigned char gamespeed=20;//游戏速度调节
20 unsigned char level=1; //难度
21 unsigned char code s[]="--ByTang";
22 unsigned char s1[]="1";
23 struct Food
24 {
25 uchar x;/*食物的横坐标*/
26 uchar y;/*食物的纵坐标*/
27 uchar yes;/*判断是否要出现食物的变量*/
28 }food;/*食物的结构体*/
29 struct Snake
30 {
31 uchar x[39];
32 uchar y[39];
33 uchar node;/*蛇的节数*/
34 uchar direction;/*蛇移动方向*/
35 uchar life;/* 蛇的生命,0活着,1死亡*/
36 }snake;
37 int rand(void){ int i; i = ((TH0<<8)|TL0)&0x7fff; return(i);} //随机数产生
38 void delay(unsigned char m) //10毫秒
39 {
40 1 unsigned char i,j,k;
41 1 while(m--)
42 1 for(i=5;i>0;i--)
43 1 for(j=4;j>0;j--)
44 1 for(k=248;k>0;k--);
45 1 }
46 /* 键扫描函数 */
47 void KeyScan()
48 {
49 1 P0=0xff;
50 1 if(P00==0)
51 1 if(snake.direction!=LIFT)
52 1 snake.direction=RIGHT;
53 1 if(P01==0)
54 1 if(snake.direction!=RIGHT)
55 1 snake.direction=LIFT;
C51 COMPILER V7.00 GAME 11/23/2009 14:38:57 PAGE 2
56 1 if(P02==0)
57 1 if(snake.direction!=DOWN)
58 1 snake.direction=UP;
59 1 if(P03==0)
60 1 if(snake.direction!=UP)
61 1 snake.direction=DOWN;
62 1 if(P04==0)
63 1 ESC=~ESC;
64 1 }
65 /*游戏结束*/
66 void GameOver(void)
67 {
68 1 ClearLCD();
69 1 hz_disp(3,25,4,youxijieshu,1);
70 1 snake.life=0;/*活着*/
71 1 snake.direction=1;/*方向往右*/
72 1 snake.x[0]=9;snake.y[0]=33;/*蛇头*/
73 1 snake.x[1]=6;snake.y[1]=33;
74 1 snake.node=2;/*节数*/
75 1 START=1;
76 1 }
77 void GamePlay(void)
78 {
79 1 uchar i;
80 1 while(1)
81 1 {
82 2 EA=1;
83 2 gamespeed=20;
84 2 level=1;
85 2 s1[0]='1';
86 2 while(ESC==0)
87 2 {
88 3 EA=1;
89 3 if(START==1) //重新开始否
90 3 {
91 4 ClearLCD();
92 4 hz_disp(3,40,2,nandu,1);
93 4 en_disp(3,80,1,Asc,s1,1);
94 4 delay(150);
95 4 ClearLCD();
96 4 Rect(5,5,123,60,1);
97 4 START=0;
98 4 }
99 3 if(snake.node%10==0 && food.yes==1) //加大难度
100 3 {
101 4 level+=1;
102 4 switch(level)
103 4 {
104 5 case 2:
105 5 s1[0]='2';
106 5 gamespeed=15;
107 5 break;
108 5 case 3:
109 5 s1[0]='3';
110 5 gamespeed=10;
111 5 break;
112 5 case 4:
113 5 s1[0]='4';
114 5 gamespeed=5;
115 5 break;
116 5 }
117 4 M_LEVEL=1;
C51 COMPILER V7.00 GAME 11/23/2009 14:38:57 PAGE 3
118 4 }
119 3 if(M_LEVEL==1) //加大难度显示
120 3 {
121 4 START=1;
122 4 M_LEVEL=0;
123 4 }
124 3 if(snake.node==39)
125 3 {
126 4 ESC=1;
127 4 hero=1;
128 4 break;
129 4 }
130 3 if(food.yes==1)/*需要出现新食物*/
131 3 {
132 4 food.x=rand()%114+6;
133 4 food.y=rand()%51+6;
134 4 while(food.x%3!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
135 4 food.x++;
136 4 while(food.y%3!=0)
137 4 food.y++;
138 4 food.yes=0;/*画面上有食物了*/
139 4 }
140 3 if(food.yes==0)/*画面上有食物了就要显示*/
141 3 {
142 4 RectArea(food.x,food.y,food.x+2,food.y+2,1);
143 4 }
144 3 for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
145 3 {
146 4 snake.x[i]=snake.x[i-1];
147 4 snake.y[i]=snake.y[i-1];
148 4 }
149 3 /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
150 3 switch(snake.direction)
151 3 {
152 4 case 1:snake.x[0]+=3;break;
153 4 case 2: snake.x[0]-=3;break;
154 4 case 3: snake.y[0]-=3;break;
155 4 case 4: snake.y[0]+=3;break;
156 4 }
157 3 for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -