俄罗斯方块1.0版
Posted my——master
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了俄罗斯方块1.0版相关的知识,希望对你有一定的参考价值。
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 }
以上是关于俄罗斯方块1.0版的主要内容,如果未能解决你的问题,请参考以下文章