📄 blockgame.lst
字号:
C51 COMPILER V7.06 BLOCKGAME 11/12/2008 09:12:21 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE BLOCKGAME
OBJECT MODULE PLACED IN BlockGame.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE BlockGame.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*-----------------------------------------------------------------俄罗斯方块游戏-*/
2 /*----------------------------------------------write by codekey, codekey@126.com-*/
3 /*-------------------------------------------------------------------------2008-3-*/
4 /*---------------------------------------------欢迎使用和修改,但需保留原作者信息-*/
5 /*--------------------------------------------------------------------------------*/
6 #include <reg52.h>
7 #include <stdlib.h>
8 #include <STRING.H>
9 #include "BlockGame.h"
10 /*--------------------------------------------------------------------------------*/
11 void InitGame( BLOCK_GAME* pGame )
12 {
13 1 UINT8 i;
14 1 /* 初始化游戏格子 */
15 1 for(i=0;i<GAME_GRID_ROW;i++){
16 2 pGame->GameGrid.Grid[i]=0xE007;
17 2 }
18 1 for(i=0;i<3;i++){
19 2 pGame->GameGrid.Grid[i]=0xFFFF;
20 2 pGame->GameGrid.Grid[GAME_GRID_ROW-i-1]=0xFFFF;
21 2 }
22 1 pGame->GameBlock.nNextBlockType=rand()%7;
23 1 }
24
25 BOOL NewGame( BLOCK_GAME* pGame )
26 {
27 1 InitGame(pGame);
28 1 NewBlock(pGame);
29 1 return 0;
30 1 }
31 void GameOver( BLOCK_GAME* pGame )
32 {
33 1 NewGame(pGame);
34 1 }
35
36 BOOL NewBlock( BLOCK_GAME* pGame )
37 {
38 1 static UINT8 gc=0;
39 1
40 1 pGame->GameBlock.nCurBlockType=pGame->GameBlock.nNextBlockType;
41 1 pGame->GameBlock.nCurBlockStatus=0;
42 1 pGame->GameBlock.nNextBlockType=rand()%7;
43 1 if(pGame->GameBlock.nNextBlockType==pGame->GameBlock.nCurBlockType)
44 1 pGame->GameBlock.nNextBlockType=(pGame->GameBlock.nNextBlockType+1)%7;
45 1 gc++;
46 1 if(gc>=6)
47 1 {
48 2 pGame->GameBlock.nNextBlockType=1;
49 2 gc=0;
50 2 }
51 1 // need a better algorithm or a better evaluating function
52 1 // to make cmputer to run as an expert.
53 1
54 1 pGame->GameBlock.nFirstBlockRow=GAME_FIRST_ROW-1;
55 1 pGame->GameBlock.nFirstBlockCol=(GAME_LAST_COL-GAME_FIRST_COL+1-4)/2+GAME_FIRST_COL;
C51 COMPILER V7.06 BLOCKGAME 11/12/2008 09:12:21 PAGE 2
56 1 BuildBlocks(pGame);
57 1 return BlockGridConsistent(pGame);
58 1 }
59
60 /* 判断方格是否可以容纳方块 */
61 BOOL BlockGridConsistent( BLOCK_GAME* pGame )
62 {
63 1 UINT8 i;
64 1 UINT16 tmp;
65 1 for(i=0;i<4;i++)
66 1 {
67 2 tmp=(pGame->GameBlock.BlocksInfo>>(i*4))&0x000F;
68 2 tmp=tmp<<pGame->GameBlock.nFirstBlockCol;
69 2 if( (pGame->GameGrid.Grid[i+pGame->GameBlock.nFirstBlockRow]&tmp)!=0x0 )
70 2 {
71 3 return 0;
72 3 }
73 2 }
74 1 return 1;
75 1 }
76 /* 生成方块 */
77 void BuildBlocks( BLOCK_GAME* pGame ) /*之所以采取这种方式,为了减少ram存储空间*/
78 {
79 1 switch(pGame->GameBlock.nCurBlockType)
80 1 {
81 2 case 0: /*一种状态*/
82 2 pGame->GameBlock.BlocksInfo=0x0660;
83 2 break;
84 2 case 1: /*两种状态*/
85 2 switch(pGame->GameBlock.nCurBlockStatus)
86 2 {
87 3 case 0:
88 3 case 2:
89 3 pGame->GameBlock.BlocksInfo=0x00F0;
90 3 break;
91 3 case 1:
92 3 case 3:
93 3 pGame->GameBlock.BlocksInfo=0x2222;
94 3 break;
95 3 }
96 2 break;
97 2 case 2: /*两种状态*/
98 2 switch(pGame->GameBlock.nCurBlockStatus)
99 2 {
100 3 case 0:
101 3 case 2:
102 3 pGame->GameBlock.BlocksInfo=0x4620;
103 3 break;
104 3 case 1:
105 3 case 3:
106 3 pGame->GameBlock.BlocksInfo=0x3600;
107 3 break;
108 3 }
109 2 break;
110 2 case 3: /*两种状态*/
111 2 switch(pGame->GameBlock.nCurBlockStatus)
112 2 {
113 3 case 0:
114 3 case 2:
115 3 pGame->GameBlock.BlocksInfo=0x2640;
116 3 break;
117 3 case 1:
C51 COMPILER V7.06 BLOCKGAME 11/12/2008 09:12:21 PAGE 3
118 3 case 3:
119 3 pGame->GameBlock.BlocksInfo=0x6300;
120 3 break;
121 3 }
122 2 break;
123 2 case 4: /*四种状态*/
124 2 switch(pGame->GameBlock.nCurBlockStatus)
125 2 {
126 3 case 0:
127 3 pGame->GameBlock.BlocksInfo=0x2260;
128 3 break;
129 3 case 1:
130 3 pGame->GameBlock.BlocksInfo=0x0710;
131 3 break;
132 3 case 2:
133 3 pGame->GameBlock.BlocksInfo=0x3220;
134 3 break;
135 3 case 3:
136 3 pGame->GameBlock.BlocksInfo=0x4700;
137 3 break;
138 3 }
139 2 break;
140 2 case 5: /*四种状态*/
141 2 switch(pGame->GameBlock.nCurBlockStatus)
142 2 {
143 3 case 0:
144 3 pGame->GameBlock.BlocksInfo=0x2230;
145 3 break;
146 3 case 1:
147 3 pGame->GameBlock.BlocksInfo=0x1700;
148 3 break;
149 3 case 2:
150 3 pGame->GameBlock.BlocksInfo=0x6220;
151 3 break;
152 3 case 3:
153 3 pGame->GameBlock.BlocksInfo=0x0740;
154 3 break;
155 3 }
156 2 break;
157 2 case 6: /*四种状态*/
158 2 switch(pGame->GameBlock.nCurBlockStatus)
159 2 {
160 3 case 0:
161 3 pGame->GameBlock.BlocksInfo=0x0720;
162 3 break;
163 3 case 1:
164 3 pGame->GameBlock.BlocksInfo=0x2320;
165 3 break;
166 3 case 2:
167 3 pGame->GameBlock.BlocksInfo=0x2700;
168 3 break;
169 3 case 3:
170 3 pGame->GameBlock.BlocksInfo=0x2620;
171 3 break;
172 3 }
173 2 break;
174 2 default: break;
175 2 }
176 1 }
177 /*--移动方块----------------*/
178 /* type = eMoveUp 上移 */
179 /* type = eMoveDown 下移 */
C51 COMPILER V7.06 BLOCKGAME 11/12/2008 09:12:21 PAGE 4
180 /* type = eMoveLeft 左移 */
181 /* type = eMoveRigh 右移 */
182 BOOL MoveBlock( BLOCK_GAME* pGame, UINT8 nMoveMode)
183 {
184 1 switch((enum eMoveMode)nMoveMode)
185 1 {
186 2 case eMoveUp:
187 2 pGame->GameBlock.nFirstBlockRow--;
188 2 break;
189 2 case eMoveDown:
190 2 pGame->GameBlock.nFirstBlockRow++;
191 2
192 2 break;
193 2 case eMoveRight:
194 2 pGame->GameBlock.nFirstBlockCol++;
195 2 break;
196 2 case eMoveLeft:
197 2 pGame->GameBlock.nFirstBlockCol--;
198 2 break;
199 2 case eMoveTurn:
200 2 pGame->GameBlock.nCurBlockStatus=(pGame->GameBlock.nCurBlockStatus+1)%4;
201 2 BuildBlocks(pGame);
202 2 break;
203 2 }
204 1 if(!BlockGridConsistent(pGame))
205 1 {
206 2 switch((enum eMoveMode)nMoveMode)
207 2 {
208 3 case eMoveUp:
209 3 pGame->GameBlock.nFirstBlockRow++;
210 3 break;
211 3 case eMoveDown:
212 3 pGame->GameBlock.nFirstBlockRow--;
213 3 break;
214 3 case eMoveLeft:
215 3 pGame->GameBlock.nFirstBlockCol++;
216 3 break;
217 3 case eMoveRight:
218 3 pGame->GameBlock.nFirstBlockCol--;
219 3 break;
220 3 case eMoveTurn:
221 3 pGame->GameBlock.nCurBlockStatus=(pGame->GameBlock.nCurBlockStatus-1+4)%4;
222 3 BuildBlocks(pGame);
223 3 break;
224 3 }
225 2 return 0;
226 2 }
227 1 return 1;
228 1 }
229
230 /* 扩展功能-旋转方块,尽可能保证旋转成功 */
231 BOOL TurnBlock( BLOCK_GAME* pGame )
232 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -