143 }
144 putimage(x,y,image+k);
145 }
146 }
147 isOver = true;
148 }
149
150 //随机产生2或者4;
151 void randIntNum()
152 {
153 bool haszero = false;
154 bool isOk=false;
155 srand((unsigned)time(NULL)); //随机函数种子
156 for (int i = 0; i < 4; i++)
157 {
158 for (int j = 0; j < 4; j++)
159 {
160 if (map[i][j] == 0)
161 {
162 haszero = true;
163 map[i][j] = (rand() % 3) * 2;
164 if (map[i][j] == 0)
165 {
166 continue;
167 }
168 isOk = true;
169 break;
170 }
171 }
172 if (isOk)
173 {
174 break;
175 }
176 }
177 if (!isOk)
178 {
179 isOk = false;
180 if (haszero)
181 {
182 for (int i = 0; i < 4; i++)
183 {
184 for (int j = 0; j < 4; j++)
185 {
186 if (map[i][j] == 0)
187 {
188 map[i][j] = 2;
189 isOk = true;
190 break;
191 }
192 }
193 if (isOk)
194 {
195 break;
196 }
197 }
198 }
199 }
200 for (int i = 0; i < 4; i++)//检测最后一步是否留有空位,若全满游戏结束
201 {
202 for (int j = 0; j < 4; j++)
203 {
204 if (map[i][j] == 0)
205 {
206 drawMap();
207 return;
208 }
209 }
210 }
211 for (int i = 0; i < 4; i++)//游戏失败则重置
212 {
213 for (int j = 0; j < 4; j++)
214 {
215 if (i==0&&j==0)
216 {
217 map[i][j] = 2;
218 continue;
219 }
220 map[i][j] = 0;
221 }
222 }
223 drawMap();
224 }
225
226 //按键响应
227 void keyDownAndDraw()
228 {
229 while (true)
230 {
231 char key = _getch();//接收用户按键
232 if (isOver)
233 {
234 isOver = false;
235 switch (key)
236 {
237 case 'W':
238 case'w':
239 case 72:
240 ChangeOnKeyDown(Up);
241 break;
242 case 'S':
243 case's':
244 case 80:
245 ChangeOnKeyDown(Down);
246 break;
247 case 'a':
248 case'A':
249 case 75:
250 ChangeOnKeyDown(Left);
251 break;
252 case 'D':
253 case'd':
254 case 77:
255 ChangeOnKeyDown(Right);
256 break;
257 default:
258 isOver = true;
259 break;
260 }
261 }
262 }
263 }
264 void ChangeOnKeyDown(direction Direction)
265 {
266 int Map[4][4] = { 0 };
267 bool CanMove;
268 switch (Direction)//将所有方向改为向左方向,并利用向左算法计算各个方向
269 {
270 case Up:
271 for (int i = 0; i < 4; i++)
272 {
273 for (int j = 0; j < 4; j++)
274 {
275 Map[j][i] = map[i][j];
276 }
277 }
278 break;
279 case Down:
280 for (int i = 0; i < 4; i++)
281 {
282 for (int j = 0; j < 4; j++)
283 {
284 Map[j][3-i] = map[i][j];
285 }
286 }
287 break;
288 case Left:
289 for (int i = 0; i < 4; i++)
290 {
291 for (int j = 0; j < 4; j++)
292 {
293 Map[i][j] = map[i][j];
294 }
295 }
296 break;
297 case Right:
298 for (int i = 0; i < 4; i++)
299 {
300 for (int j = 0; j < 4; j++)
301 {
302 Map[i][3-j] = map[i][j];
303 }
304 }
305 break;
306 default:
307 break;
308 }
309 //向左算法
310 CanMove=TurnLeft(Map);
311 //将向左改回各自方向
312 switch (Direction)
313 {
314 case Up:
315 for (int i = 0; i < 4; i++)
316 {
317 for (int j = 0; j < 4; j++)
318 {
319 map[j][i] =Map[i][j];
320 }
321 }
322 break;
323 case Down:
324 for (int i = 0; i < 4; i++)
325 {
326 for (int j = 0; j < 4; j++)
327 {
328 map[3-j][i] = Map[i][j];
329 }
330 }
331 break;
332 case Left:
333 for (int i = 0; i < 4; i++)
334 {
335 for (int j = 0; j < 4; j++)
336 {
337 map[i][j] = Map[i][j];
338 }
339 }
340 break;
341 case Right:
342 for (int i = 0; i < 4; i++)
343 {
344 for (int j = 0; j < 4; j++)
345 {
346 map[i][3-j] = Map[i][j];
347 }
348 }
349 break;
350 default:
351 break;
352 }
353 if (CanMove)
354 {
355 randIntNum();
356 drawMap();
357 }
358 else
359 {
|