1 #include<graphics.h>
2 #include"time.h"
3 #include"math.h"
4 #include"string.h"
5 #include"stdlib.h"
6 #include"stdio.h"
7 #include"iostream.h"
8 #include<conio.h>
9 IMAGE img;
10 int tem();
11 int i2;
12 int X=13;
13 int Y=22;
14 int x=4;
15 int x_1;
16 int y_1;
17 int y=0;
18 int g_x;
19 int g_y;
20 int c;
21 int YN=0;
22 int BYN;
23 int news=1;
24 int begin;
25 int flge=1;
26 int downtime=300;
27 int luoji=0;
28 //int cls[13][22]={1};
29 int ql[4][4]={0};
30 int g_b_x;
31 int g_b_s;
32 int g_b_z;
33 int g_b_y;
34 int get_b_x[13]={0};
35 int get_g_s[13]={21,21,1,2,0,0};
36 int b[4][4]={0}; //某类方块的值
37 int a[13][22]={0};
38 int a1[13][22]={0};
39 int b1[4][4]={0}; //临时行列数列
40 int g_tple;
41 int g_tple1=2;
42 int score=0; //分数
43 int N; //关卡
44 int T1[13][22]={0};
45 int T[13][22]={0};//窗口行列数列
46 // int T[13][17]={0,1,1,1,0,0,1,0,1,0,1};
47 int up();
48 int b_b1();
49 int b1_b();
50 int b1_a1();
51 int bianjie();
52 int g1_nextblock();
53 int g_nextblock();
54 int a_T();
55 int aa1z();
56 int aa1y();
57 int a_a1();
58 int a1_a();
59 int T1_T();
60 int T_T1();
61 int run();
62 void showa();
63 int jiemian();
64 int b_a();
65 int clear();
66 int cleara();
67 int cleara1();
68 int movedown();
69 void get_fangxiang();
70 int get_b_4();
71 int get_g();
72 void Make_b();
73 void Make_T();
74 void clear_b();
75
76 int runing();
77 #define GAME_X 600
78 #define GAME_Y 700
79 int Block[][4] =
80 {
81 //田字形
82 {0, 0, 0, 0},
83 {0, 1, 1, 0},
84 {0, 1, 1, 0},
85 {0, 0, 0, 0},
86 //直线
87 {0, 0, 0, 0},
88 {1, 1, 1, 1},
89 {0, 0, 0, 0},
90 {0, 0, 0, 0},
91 //
92 {0, 0, 0, 0},
93 {1, 1, 1, 0},
94 {0, 1, 0, 0},
95 {0, 0, 0, 0},
96 //L
97 {0, 1, 0, 0},
98 {0, 1, 0, 0},
99 {0, 1, 1, 0},
100 {0, 0, 0, 0},
101 //
102 {0, 1, 0, 0},
103 {0, 1, 0, 0},
104 {1, 1, 0, 0},
105 {0, 0, 0, 0},
106 //
107 {0, 0, 1, 0},
108 {0, 1, 1, 0},
109 {0, 1, 0, 0},
110 {0, 0, 0, 0},
111 //
112 {0, 1, 0, 0},
113 {0, 1, 1, 0},
114 {0, 0, 1, 0},
115 {0, 0, 0, 0},
116 };
117 //char mycolor[7][7]={'RED','GREEN','YELLOW'};
118 /*for(int i=0;i<28;i++) {
119 for(int j=0;j<4;j++)
120 cout<<Block0[i][j];cout<<endl; } */
121 int init()
122 {
123 begin=1;N=1;
124 score=0;
125 return 0;
126 }
127
128 int jiemian() //主界面布局 (有全局变量GAME_X,GAME_Y
129 {
130 char mm[20]="下一块方块";
131 //int Y=700,X=600;
132 initgraph(GAME_X,GAME_Y);
133 //setlinecolor(255);
134 HWND hwnd=GetHWnd();
135 SetWindowText(hwnd,"俄罗斯方块1.0版@www.baidu.com/p/y123456789xx98 ");
136 for(int i=0;i<GAME_X;i++)
137 {
138 setlinecolor(BLACK);
139 line(i,0,i,699);
140 }
141 setlinecolor(BLUE);
142 line(39,9,39,671);
143 line(39,671,431,671);
144 line(431,9,431,671);
145 line(39,9,431,9);
146 line(440,10,590,10);
147 line(440,400,590,400);
148 line(440,10,440,400);
149 line(590,10,590,400);
150 setbkmode(TRANSPARENT);
151 settextcolor(RED);
152 outtextxy(450,40,mm);
153 line(440,220,590,220);
154 line(440,220,440,600);
155 line(440,600,590,600);
156 line(590,600,590,220);
157 outtextxy(450,230,"得分");
158 outtextxy(450,430,"关卡");
159 /*BeginBatchDraw();
160 for(i=0;i<13;i++)
161 for(int j=0;j<44;j++)
162 {
163 setlinecolor(RED);
164 fillrectangle(40+i*30,10+15*j,40+i*30,10+15*j);
165 } EndBatchDraw();
166 */return 0;
167 }
168 int g1_nextblock() //下一块方块存在b[][]数组中
169 {
170 for(int i1=0;i1<4;i1++){for(int j1=0;j1<4;j1++)
171 { b[i1][j1]=Block[g_tple1*4+i1][j1];}
172 }
173 return 0;
174 }
175 int g_nextblock() //随机产生下一块方块,放于b[4][4]中,且绘制右边(b)布局 显示得分和关卡
176 { setlinecolor(BLUE);IMAGE img;
177 //int g_tple=rand()%7;
178 int line=60,col=450; //g_tple为方块类型
179 for(int i1=0;i1<4;i1++){for(int j1=0;j1<4;j1++)
180 { int g_block=Block[g_tple*4+i1][j1]; //b[i1][j1]=Block[g_tple*4+i1][j1];
181 //b1[i1*4+j1]=Block[g_tple*4+i1][j1];
182 setfillcolor(RED); // int i3=100000; while(i3>0)i3--;
183 fillrectangle(col+j1*30,line+i1*30,col+j1*30+30*g_block,line+i1*30+30*g_block);}} //Sleep(500);
184 getimage( &img,450,60,120,120);
185 char g_score[10]={0};
186 sprintf(g_score,"%d",score);settextstyle(0,0,g_score); //得分
187 //sprintf(score, "%d", score);
188 outtextxy(500,230,g_score);
189 //N=score/2+1;
190 char g_N[10]={0};sprintf(g_N,"%d",N);settextstyle(0,0,g_N); //关卡
191 outtextxy(500,430,g_N);
192
193 /*
194 setfillcolor(BLACK);setlinecolor(BLACK);
195 fillrectangle(420,60,540,180);
196 */
197 return g_tple;
198 }
199 void clear_b() //清除b区域
200 {
201 setfillcolor(BLACK);setlinecolor(BLACK);
202 fillrectangle(450,60,570,180);
203 fillrectangle(500,230,570,300);
204 fillrectangle(500,430,570,500);
205
206 }
207
208
209 void showa() //根据a[13][22]数组绘制运行界面a
210 {
211 //int a[13][22]={1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,};
212 setfillcolor(RED);
213 setlinecolor(BLUE); BeginBatchDraw();
214 for(int l=0;l<13;l++){
215 for(int h=0;h<22;h++){
216 fillrectangle(40+l*30,10+h*30,40+l*30+30*a[l][h],10+h*30+30*a[l][h]);
217 }}EndBatchDraw();
218 //clear_b();//tem();
219 // Sleep(10);
220 // Make_b();
221 // return 0;
222 }
223
224 /*int tem() //临时测试
225 {
226 int tem1[100000]={0};
227 FILE *fp1;fp1=fopen("D://身份系统\\222.txt","a+");
228 //for(int i=0;i<13;i++){
229 for(int j=0;j<22;j++)
230 {tem1[j]=21;}
231 // }
232 fwrite(tem1,13,1,fp1);fclose(fp1);
233 return 0;
234 } */
235 int b1_a1() //在我的调用方式下:b1为下一个方块数据因为b_b1(),a1为A区域的下一状态
236 { if(x<0)x=0;if(x>9)x=9;
237 for(int l=0;l<4;l++)
238 for(int h=0;h<4;h++)
239 {
240 // b[h][l]=b1[h][l];
241 a1[x+l][y+h]=b1[h][l]; }
242 return 0;
243 }
244 int b_b1() //将下一块的数据暂存于b1[][]中
245 {
246 for(int l=0;l<4;l++)
247 for(int h=0;h<4;h++)
248 b1[l][h]=0;
249 for(l=0;l<4;l++)
250 for(int h=0;h<4;h++)
251 b1[h][l]=b[h][l];
252 return 0;
253 }
254
255 int b1_b() //调用下一块方块时将b1[][]数据给b[][]
256 {
257 for(int l=0;l<4;l++)
258 for(int h=0;h<4;h++)
259 b[l][h]=0;
260 for(l=0;l<4;l++)
261 for(int h=0;h<4;h++)
262 { //if(x<0)x=0;if(x>9)x=9;
263 b[h][l]=b1[h][l]; }
264 // a[x+l][y+h]=b[h][l]; }
265 return 0;
266 }
267 int up() //变形 每次图形在4*4矩阵中逆时针旋转(可考虑中心旋转)
268 {
269 for(int l=0;l<4;l++)
270 for(int h=0;h<4;h++)
271 b1[l][h]=0;
272 /* for(int i=0;i<4;i++)
273 for(int j=0;j<4;j++)
274 {
275 b[i][j]=b1[i][j];
276 }
277 */ for( int i=0;i<4;i++)
278 for(int j=0;j<4;j++)
279 {
280 b1[i][j]=b[j][3-i];
281 }
282 // for(l=0;l<4;l++) {
283 // for(int h=0;h<4;h++)
284 // a1[x+l][y+h]=b1[h][l]; }
285 // run();
286 /* for(l=0;l<4;l++)
287 for(int h=0;h<4;h++)
288 { if(x<0)x=0;if(x>9)x=9;
289 b[h][l]=b1[h][l];
290 a[x+l][y+h]=b[h][l]; }
291 */
292 //flge=0;
293 return 0;
294 }
295 void Make_b() //下一状态图
296 {
297 putimage(420,60,&img);
298 }
299 void Make_T() //类似于背景的A区域增加数据 和绘制
300 { // int a[13][22]={1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,};
301 BeginBatchDraw();
302 for(int l=0;l<13;l++){
303 for(int h=0;h<22;h++){
304 setfillcolor(RED);
305 setlinecolor(BLUE);
306 fillrectangle(40+l*30,10+h*30,40+l*30+30*T[l][h],10+h*30+30*T[l][h]);
307 }} EndBatchDraw();
308 // return 0;
309 }
310 int get_g() //获取g图形边界 与T[13][22]有关
311 {
312 /* get_g_s[13]=21;
313 for(int i=0;i<13;i++) {
314 for(int j=0;j<22;j++)
315 {
316 if(T[i][j]==1)
317 { get_g_s[i]=j;break;}
318 else
319 get_g_s[i]=21;
320
321 }
322 }
323 */ return 0;
324 }
325 int get_b_4() //获取b[][]图形在4*4矩阵中与各边的距离
326 { int g_b_x=0;
327 for(int l=0;l<4;l++){
328 for(int h=0;h<4;h++)
329 if(b[h][l]==1)
330 if(g_b_x<=h)
331 g_b_x=h;}
332 int g_b_z=3;
333 for(l=0;l<4;l++){
334 for(int h=3;h>=0;h--)
335 if(b[l][h]==1)
336 if(g_b_z>=h)
337 g_b_z=h;}
338 int g_b_y=0;
339 for(l=0;l<4;l++){
340 for(int h=0;h<4;h++)
341 if(b[l][h]==1)if(g_b_y<=h)
342 g_b_y=h;}
343 int g_b_s=3;
344 for(l=0;l<4;l++){
345 for(int h=3;h>=0;h--)
346 if(b[h][l]==1)
347 if(g_b_s>=h)
348 g_b_s=h;}
349 return 0;
350 }
351 int bianjie() //边界修正和判断
352 {
353 if((x+g_b_z)<0)x++;
354 if((y+g_b_x)>22)y--;
355 if((x+g_b_y)>10)x--;
356 else YN=1;
357 return 0;
358 }
359 int aa1y() //提前判断能右移动否
360 { BYN=1;
361 for(int i=0;i<22;i++){
362 if(a[12][i]==1)
363 { g_x=0;BYN=0;} }
364 /*for(i=0;i<13;i++) {
365 if(a[i][21]==1)
366 {g_y=0;YN=0;} }
367 */
368 return 0;
369 }
370
371 int aa1z() //能左移动否
372 { BYN=1;
373 for(int i=0;i<22;i++){
374 if(a[0][i]==1)
375 { g_x=0;BYN=0;} }
376 for(i=0;i<13;i++) {
377 if(a[i][21]==1)
378 {g_y=0;YN=0;} }
379
380 return 0;
381 }
382 int a_a1() //将操作后的a[][]数据存于a1[][]中,即a1为a的下一态
383 {
384 for(int l=0;l<13;l++) {
385 for(int h=0;h<22;h++)
386 a1[l][h]=0; }
387 /* for(int i=0;i<22;i++){
388 if(a[0][i]==1||a[21][i]==1)
389 { g_x=0;} YN=0; }
390 for(i=0;i<13;i++) {
391 if(a[21][i]==1)
392 {g_y=0;YN=0;}YN=0; }
393 */ for(l=0;l<13;l++) {
394 for(int h=0;h<22;h++)
395 { if(a[l][h]==1)
396 {a1[l+g_x][g_y+h]=a[l][h]; }
397 } }
398 return 0;
399 }
400 int a1_a() //正常状态下将a1[][](上一次的下一状态)数据转移给a[][]
401 {
402 for(int l=0;l<13;l++)
403 for(int h=0;h<22;h++)
404 a[l][h]=a1[l][h];
405 return 0;
406 }
407
408
409
410 int b_a() //将b方块传递到a[13][22]中,初始位置与x,y有关
411 { cleara();
412 for(int l=0;l<4;l++){ //g_x=0;
413 for(int h=0;h<4;h++)
414 //if(Block[g_tple*4+h][l]==1)
415 if(b[h][l]==1)
416 {
417 b1[h][l]=b[h][l];//g_x++;//Block[g_tple*4+h][l];
418 a[x+l][y+h]=b1[h][l];
419 }
420 //a[x+l][y+h]=Block[g_tple*4+h][l];
421 // tem();
422 }
423 return 0;
424 }
425 int cleara() //a[][]数组清零
426 {
427 for(int l=0;l<13;l++){
428 for(int h=0;h<22;h++)
429 {
430 a[l][h]=0;
431 }
432 }
433 return 0;
434 }
435 int cleara1() //a1[][]数组清零
436 {
437 for(int l=0;l<13;l++){
438 for(int h=0;h<22;h++)
439 {
440 a[l][h]=0;
441 }
442 }
443 return 0;
444 }
445
446 int clear() //重新绘制运行区域A
447 {BeginBatchDraw();
448 for(int i=0;i<13;i++){
449 for(int j=0;j<22;j++){
450 setfillcolor(BLACK);
451 setlinecolor(BLACK); //fillrectangle(41,11,429,699);
452 fillrectangle(40+i*30,10+j*30,40+i*30+30,10+j*30+30);
453 }} EndBatchDraw();
454 // fillrectangle(10,10,400,670);
455 return 0;
456 }
457 int run() //能否继续 下降
458 { YN=1;
459 for(int l=0;l<13;l++)
460 for(int h=0;h<22;h++)
461 if(T[l][h]==a1[l][h]&&T[l][h]==1)
462 { YN=0;goto loop1; }
463 else
464 YN=1;
465 loop1:;
466 return 0;
467 }
468 int movedown() //边界运算,能否在下降
469 { int i,YN=1;
470 for(i=0;i<13;i++)
471 {
472 if((get_g_s[i]-get_b_x[i])<=0)
473 {YN=0;break;}
474 else
475 YN=1; //YN=1能下降
476 }
477 return 0;
478 }
479 int a_T() //将a[13][22]->T[13][22]//T[13][22]为a[13][22]的上一个稳定状态初态为全零
480 {
481 for(int i=0;i<13;i++)
482 for(int j=0;j<22;j++)
483 {
484 T[i][j]=a[i][j];
485 }
486 flge=0;
487 return 0;
488 }
489
490 int T_T1() //将a[13][22]->T[13][22]//T[13][22]为a[13][22]的上一个稳定状态初态为全零
491 {
492 for(int i=0;i<13;i++)
493 for(int j=0;j<22;j++)
494 {
495 T1[i][j]=T[i][j];
496 }
497 flge=0;
498 return 0;
499 }
500
501 int T1_T() //将a[13][22]->T[13][22]//T[13][22]为a[13][22]的上一个稳定状态初态为全零
502 {
503 for(int i=0;i<13;i++)
504 for(int j=0;j<22;j++)
505 {
506 T1[i][j]=T1[i][j];
507 }
508 flge=0;
509 return 0;
510 }
511
512 void get_fangxiang()
513 { i2=0;
514 if(kbhit())
515 c=getch();
516 // return 0;
517 }
518
519 int runing()
520 {
521 return 0;
522 }
523
524
525
526 int main()
527 {
528
529 while(news){
530 int t[13][17]={0};
531 int g_t[4][4]={0};
532 jiemian();
533 init();
534 while(begin) //游戏结束
535 { x=4;
536 y=0;
537 YN=0;
538 srand(time(0));
539 g_tple=rand()%7;
540 clear_b();
541 // Sleep(100);
542 g1_nextblock();
543 g_nextblock(); YN=1;
544 flge=1; b_a();
545
546 IMAGE img; //加载的图片
547 loadimage(&img,"D:\\2017\\图形文件\\方形图\\7ed6e1d3572c11df653ea107602762d0f703c232.gif",50,70);
548 putimage(500,500,&img);
549 while(flge) //一个方块下落完成
550 {
551 /* x=4;
552 y=0;
553 YN=0;
554 g_tple=rand()%7;
555 clear_b();
556 Sleep(100); g_nextblock();
557 */ int z=1;
558 luoji=0;
559 fflush(stdin);
560 // Sleep(500);
561 g_y=1;y=y+g_y;
562
563 // while(z){
564 while(kbhit())
565 {
566 c=getch();//flushall; fflush(stdin);
567 if(c)
568 { while(c&&YN)
569 switch(c)
570 {
571 case 32:{c=getch();c=0;break;}
572 case 72:{
573 up();x_1=x;clear();cleara(); cleara1();b1_a1();run();if(y>18)YN=0;
574 if(YN==1)//fflush(stdin);
575 {
576 b1_b();b_a();
577 //a1_a();
578 // Make_T();showa();
579 }
580 if(YN==0)
581 {x=x_1;b_a();
582 //Make_T();showa();
583 }
584 c=0; //c=getch();
585 BeginBatchDraw();
586 Make_T();showa(); EndBatchDraw();
587 Sleep(0);//cleara();
588 break;}
589 case 77:{g_x=1;aa1y();a_a1();run();if(YN&&BYN){a_a1();a1_a();clear();BeginBatchDraw();showa();Make_T();EndBatchDraw();Sleep(0);x=x+g_x;}luoji=1;g_x=0;g_y=0;c=0;}break;
590 // case 77:{x++;bianjie();clear();showa();cleara();c=0;break;}
591 case 75:{g_x=-1;aa1z();a_a1();run();if(YN&&BYN){a_a1();a1_a();clear();BeginBatchDraw();showa();Make_T();EndBatchDraw();Sleep(0);x=x+g_x;}luoji=1;g_x=0;g_y=0;c=0;}break;
592 // case 75:{x--;run();if(YN){clear();bianjie();showa();cleara();}c=0;break;}
593 case 80:{g_y=1;aa1z();a_a1();run();if(YN){a_a1();a1_a();clear();BeginBatchDraw();showa();Make_T();EndBatchDraw();Sleep(0);y=y+g_y;}luoji=1;g_x=0;c=0;}break;
594 //case 80:{y++;run();if(YN){bianjie();clear();showa();cleara();}c=0;break;}
595 // case 32:Sleep(4000);
596 default:{c=0;break;}
597 }
598 }
599 }
600 clear();
601 // g_y=1;y=y+g_y;
602 a_a1();//a1_a();
603 run();aa1z();//a_a1();
604 if(YN==1)
605 {a1_a();BeginBatchDraw();Make_T();showa();EndBatchDraw();}
606 Sleep(downtime); //YN=0 一块下落完成
607 if(YN==0&&luoji==0)
608 {
609 for(int l=0;l<13;l++)
610 for(int h=0;h<22;h++)
611 { if(a[l][h]==1)
612 T[l][h]=a[l][h];
613 }
614 //b_a();
615 // showa();
616 BeginBatchDraw();Make_T();showa();EndBatchDraw();//Sleep(10);
617 flge=0;
618 //1 YN=1;// clear();
619 }
620 if(YN==0&&luoji==1)
621 {
622 for(int l=0;l<13;l++)
623 for(int h=0;h<22;h++)
624 { if(a[l][h]==1)
625 T[l][h]=a[l][h];
626 }
627 BeginBatchDraw();Make_T();showa();EndBatchDraw();//Sleep(100);
628 flge=0;
629 }
630 if(YN==0) //满行消除
631 { int i=0,k=0;//int T1[13][22]={0},T2[13][22]={0};
632 for(int h=0;h<22;h++)
633 { int i=0;int T1[13][22]={0},T2[13][22]={0};
634 for(int l=0;l<13;l++)
635 {if(T[l][h]==1)
636 {i++;if(i==13)
637 {score+=10; N=score/100+1; downtime=((N)<10)?(downtime-30*N):200; //分数关数下降速度控制
638 for(l=0;l<13;l++)T[l][h]=0;k=h;
639 for(int h=0;h<k;h++){for(int l=0;l<13;l++)T1[l][h+1]=T[l][h];}
640 for(h=k+1;h<22;h++){for(int l=0;l<13;l++)T2[l][h]=T[l][h];}
641 for(l=0;l<13;l++){for(int h=0;h<22;h++)T[l][h]=0;}
642 for(l=0;l<13;l++){for(int h=k+1;h<22;h++)T[l][h]=T2[l][h];}
643 for(l=0;l<13;l++){for(int h=0;h<k+1;h++)if(T1[l][h]==1)T[l][h]=T1[l][h];}
644 }
645 }
646 }
647 }
648
649 BeginBatchDraw();Make_T;EndBatchDraw();// Sleep(400);
650 g_tple1=g_tple;
651 flge=0; //方块已到底
652 for(int l=0;l<13;l++){if(T[l][0]==1||t[l][1]){
653 begin=0; news=0; }
654
655 }//游戏结束
656 }
657
658 }
659 }
660 cleara();a_T();BeginBatchDraw();Make_T();EndBatchDraw();//showa();
661 //setfillcolor(BLUE);setlinecolor(BLUE);
662 char news1[10]={"游戏结束:"};
663 char news2[15]={"按ESC退出:"};
664 char news3[10]={"其他继续:"};
665 settextstyle(0,0,news1);
666 settextstyle(0,0,news2);
667 settextstyle(0,0,news3);
668 outtextxy(450,260,news1);
669 outtextxy(450,290,news2);
670 outtextxy(450,320,news3); //Sleep(5000);
671 //while(kbhit())
672 //{
673 //getchar();
674 kbhit();
675 news=getch();
676 if(news==27)news=0;;
677 //}
678
679 }
680 return 0;
681 }