vb俄罗斯方块程序代码
- 格式:doc
- 大小:81.50 KB
- 文档页数:16
俄罗斯方块最简单代码俄罗斯方块游戏一直是老少皆宜的休闲游戏之一,它不仅富有挑战性,而且还能让人们在消磨时间的同时,放松身心,享受游戏的快乐。
在这篇文章中,我们将介绍俄罗斯方块最简单的代码,在这里让大家一窥游戏编程的神秘面纱。
1. 游戏规则俄罗斯方块的游戏规则非常简单,玩家需要通过移动俄罗斯方块的形状,让它们在屏幕底部的平台上堆叠起来。
当一整行方块被填满时,该行将被清除并给玩家带来积分。
如果游戏区域被方块堆满,则游戏结束。
2. 编写代码俄罗斯方块的代码可以使用各种编程语言实现,本文将使用简单易用的Python进行演示。
代码实现需要安装Python的pygame模块,因此您需要先安装它。
以下是代码实现的主要部分:```pythonimport pygame, sysdef run_game():pygame.init()game_width, game_height = 300, 600screen = pygame.display.set_mode((game_width,game_height))pygame.display.set_caption("Tetris")while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()screen.fill((0, 0, 0))# 在这里添加游戏逻辑pygame.display.update()run_game()```以上代码展示了一个空白屏幕,并在屏幕标题中添加了“Tetris”游戏标题。
接下来,我们需要添加游戏逻辑。
3. 添加游戏逻辑在上方的主循环中,我们可以添加游戏逻辑。
为了使游戏逻辑尽可能简单,我们将使用一个简单的方块模型来代表俄罗斯方块。
```pythonclass Block:def __init__(self, color, width, height):self.color = colorself.width = widthself.height = heightdef draw(self, x, y, screen):pygame.draw.rect(screen, self.color, (x, y,self.width, self.height))```以上代码定义了一个Block类,其中包含方块的颜色、宽度和高度信息,并实现了一个draw()方法,用于在屏幕上绘制方块。
简单俄罗斯方块程序代码俄罗斯方块是一款非常经典的游戏,它需要玩家通过操作方块来消除行,随着游戏的深入,难度越来越大。
我们可以用Python语言来编写俄罗斯方块程序,它可以让我们体验到这个经典游戏的乐趣。
首先,我们需要导入相关的模块:```pythonimport pygameimport random```其中,pygame模块可以让我们创建图形化界面,random模块可以用于生成随机数,方便我们随机生成方块。
接下来,我们需要定义一些常量和变量:```python# 定义常量WIDTH = 480HEIGHT = 640CELL_SIZE = 30# 定义变量board = [[0] * 10 for i in range(20)]score = 0ticks = 0fall_speed = 60next_block = random.randint(0, 6)block_pos = (0, 3)current_block = None```这里定义了几个常量:游戏窗口的宽度和高度,单元格的大小。
同时,我们还需要一个二维数组board来表示游戏画面上的格子状态,score来表示当前得分,ticks表示已经落下的方块数量,fall_speed表示方块下落的速度,next_block表示下一个方块的类型,block_pos表示当前方块的位置,current_block则表示当前正在下落的方块。
接下来,我们需要定义一些函数来实现游戏的各种功能。
首先是绘制游戏画面的函数:```pythondef draw_game():screen.fill((0, 0, 0))# 绘制已经落下的方块for i in range(20):for j in range(10):if board[i][j] != 0:pygame.draw.rect(screen, (255, 255, 255),(j * CELL_SIZE, i * CELL_SIZE, CELL_SIZE, CELL_SIZE))# 绘制正在下落的方块if current_block:for i in range(4):for j in range(4):if current_block[i][j] != 0:pygame.draw.rect(screen, (255, 255, 255),((block_pos[1] + j) * CELL_SIZE, (block_pos[0] + i) * CELL_SIZE, CELL_SIZE, CELL_SIZE))# 绘制下一个方块draw_next_block()# 绘制得分font = pygame.font.SysFont('SimHei', 20)text = font.render('得分:%d' % score, True, (255, 255, 255))screen.blit(text, (10, 10))pygame.display.flip()```这个函数会首先清空画面,然后遍历board数组,绘制已经落下的方块。
俄罗斯⽅块代码1 #include<iostream>2 #include<string>3 #include<ctime>4 #include<cstdlib>5 #include<windows.h>6 #include<conio.h>78using namespace std;910int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };11int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };12int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };13int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };14int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };15int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };16int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };17int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };18int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };19int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };20int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };21int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };22int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };23int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };24int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };25int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };26int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };27int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };28int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };2930void initialWindow(HANDLE hOut);//初始化窗⼝31void initialPrint(HANDLE hOut);//初始化界⾯32void gotoXY(HANDLE hOut, int x, int y);//移动光标33void roundBlock(HANDLE hOut, int block[4][4]);//随机⽣成⽅块并打印到下⼀个⽅块位置34bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞35void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印⽅块36void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除⽅块37void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移38void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移39void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度40int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落41void myStop(HANDLE hOut, int block[4][4]);//游戏暂停42void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束43void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消⾏并更新分值 44int main()45 {46int map[21][12];47int blockA[4][4];//候选区的⽅块48int blockB[4][4];//下落中的⽅块49int positionX, positionY;//⽅块左上⾓的坐标50bool check;//检查⽅块还能不能下落51char key;//⽤来存储按键52int val;//⽤来控制下落速度53int fraction;//⽤来存储得分54int checkpoint;//⽤来存储关卡55int times;56 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄57 initialWindow(hOut);58 initial:59 gotoXY(hOut, 0, 0);60 initialPrint(hOut);61 check = true;62 val = 50;63 fraction = 0;64 checkpoint = 1;65 times = val;66for (int i = 0; i < 20; ++i)67 {68for (int j = 1; j < 11; ++j)69 {70 map[i][j] = 0;71 }72 }73for (int i = 0; i < 20; ++i)74 {75 map[i][0] = map[i][11] = 1;76 }77for (int i = 0; i < 12; ++i)78 {8182 srand((unsigned)time(NULL));83 roundBlock(hOut, blockA);84while (true)85 {86if (check)87 {88 eliminateRow(hOut, map, val, fraction, checkpoint);89 check = false;90 positionX = -3;91 positionY = 4;92if (collisionDetection(blockA, map, positionX, positionY))93 {94for (int i = 0; i < 4; ++i)95 {96for (int j = 0; j < 4; ++j)97 {98 blockB[i][j] = blockA[i][j];99 }100 }101 roundBlock(hOut, blockA);102 }103else104 {105 gameOver(hOut, blockA, map);106goto initial;107 }108 }109 printBlock(hOut, blockB, positionX, positionY);110if (_kbhit())111 {112 key = _getch();113switch (key)114 {115case72:116 myUp(hOut, blockB, map, positionX, positionY);117break;118case75:119 myLeft(hOut, blockB, map, positionX, positionY);120break;121case77:122 myRight(hOut, blockB, map, positionX, positionY);123break;124case80:125switch (myDown(hOut, blockB, map, positionX, positionY)) 126 {127case0:128 check = false;129break;130case1:131 check = true;132break;133case2:134 gameOver(hOut, blockB, map);135goto initial;136default:137break;138 }139break;140case32:141 myStop(hOut, blockA);142break;143case27:144 exit(0);145default:146break;147 }148 }149 Sleep(20);150if (0 == --times)151 {152switch (myDown(hOut, blockB, map, positionX, positionY)) 153 {154case0:155 check = false;156break;157case1:158 check = true;159break;160case2:161 gameOver(hOut, blockB, map);162goto initial;166 times = val;167 }168 }169 cin.get();170return0;171 }172173void initialWindow(HANDLE hOut)174 {175 SetConsoleTitle("俄罗斯⽅块");176 COORD size = { 80, 25 };177 SetConsoleScreenBufferSize(hOut, size);178 SMALL_RECT rc = { 0, 0, 79, 24 };179 SetConsoleWindowInfo(hOut, true, &rc);180 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };181 SetConsoleCursorInfo(hOut, &cursor_info);182 }183184void initialPrint(HANDLE hOut)185 {186 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); 187for (int i = 0; i < 20; ++i)188 {189 cout << "■■☆☆" << endl;190 }191 gotoXY(hOut, 26, 0);192 cout << "☆☆☆☆☆☆☆☆☆☆☆";193 gotoXY(hOut, 0, 20);194 cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";195 gotoXY(hOut, 26, 1);196 cout << "分数: ";197 gotoXY(hOut, 26, 2);198 cout << "关卡: ";199 gotoXY(hOut, 26, 4);200 cout << "下⼀⽅块:";201 gotoXY(hOut, 26, 9);202 cout << "操作⽅法:";203 gotoXY(hOut, 30, 11);204 cout << "↑:旋转↓:速降";205 gotoXY(hOut, 30, 12);206 cout << "→:右移←:左移";207 gotoXY(hOut, 30, 13);208 cout << "空格键:开始/暂停";209 gotoXY(hOut, 30, 14);210 cout << "Esc 键:退出";211 gotoXY(hOut, 26, 16);212 cout << "关于:";213 gotoXY(hOut, 30, 18);214 cout << "俄罗斯⽅块V1.0";215 gotoXY(hOut, 35, 19);216 cout << "作者:潘约尔";217 }218219void gotoXY(HANDLE hOut, int x, int y)220 {221 COORD pos;222 pos.X = x;223 pos.Y = y;224 SetConsoleCursorPosition(hOut, pos);225 }226227void roundBlock(HANDLE hOut, int block[4][4])228 {229 clearBlock(hOut, block, 5, 15);230switch (rand() % 19)231 {232case0:233for (int i = 0; i < 4; ++i)234 {235for (int j = 0; j < 4; ++j)236 {237 block[i][j] = block00[i][j];238 }239 }240break;241case1:242for (int i = 0; i < 4; ++i)243 {244for (int j = 0; j < 4; ++j)245 {246 block[i][j] = block01[i][j];250case2:251for (int i = 0; i < 4; ++i)252 {253for (int j = 0; j < 4; ++j)254 {255 block[i][j] = block02[i][j]; 256 }257 }258break;259case3:260for (int i = 0; i < 4; ++i)261 {262for (int j = 0; j < 4; ++j)263 {264 block[i][j] = block03[i][j]; 265 }266 }267break;268case4:269for (int i = 0; i < 4; ++i)270 {271for (int j = 0; j < 4; ++j)272 {273 block[i][j] = block04[i][j]; 274 }275 }276break;277case5:278for (int i = 0; i < 4; ++i)279 {280for (int j = 0; j < 4; ++j)281 {282 block[i][j] = block05[i][j]; 283 }284 }285break;286case6:287for (int i = 0; i < 4; ++i)288 {289for (int j = 0; j < 4; ++j)290 {291 block[i][j] = block06[i][j]; 292 }293 }294break;295case7:296for (int i = 0; i < 4; ++i)297 {298for (int j = 0; j < 4; ++j)299 {300 block[i][j] = block07[i][j]; 301 }302 }303break;304case8:305for (int i = 0; i < 4; ++i)306 {307for (int j = 0; j < 4; ++j)308 {309 block[i][j] = block08[i][j]; 310 }311 }312break;313case9:314for (int i = 0; i < 4; ++i)315 {316for (int j = 0; j < 4; ++j)317 {318 block[i][j] = block09[i][j]; 319 }320 }321break;322case10:323for (int i = 0; i < 4; ++i)324 {325for (int j = 0; j < 4; ++j)326 {327 block[i][j] = block10[i][j]; 328 }329 }330break;333 {334for (int j = 0; j < 4; ++j)335 {336 block[i][j] = block11[i][j];337 }338 }339break;340case12:341for (int i = 0; i < 4; ++i)342 {343for (int j = 0; j < 4; ++j)344 {345 block[i][j] = block12[i][j];346 }347 }348break;349case13:350for (int i = 0; i < 4; ++i)351 {352for (int j = 0; j < 4; ++j)353 {354 block[i][j] = block13[i][j];355 }356 }357break;358case14:359for (int i = 0; i < 4; ++i)360 {361for (int j = 0; j < 4; ++j)362 {363 block[i][j] = block14[i][j];364 }365 }366break;367case15:368for (int i = 0; i < 4; ++i)369 {370for (int j = 0; j < 4; ++j)371 {372 block[i][j] = block15[i][j];373 }374 }375break;376case16:377for (int i = 0; i < 4; ++i)378 {379for (int j = 0; j < 4; ++j)380 {381 block[i][j] = block16[i][j];382 }383 }384break;385case17:386for (int i = 0; i < 4; ++i)387 {388for (int j = 0; j < 4; ++j)389 {390 block[i][j] = block17[i][j];391 }392 }393break;394case18:395for (int i = 0; i < 4; ++i)396 {397for (int j = 0; j < 4; ++j)398 {399 block[i][j] = block18[i][j];400 }401 }402break;403default:404break;405 }406 printBlock(hOut, block, 5, 15);407 }408409bool collisionDetection(int block[4][4], int map[21][12], int x, int y) 410 {411for (int i = 0; i < 4; ++i)412 {413for (int j = 0; j < 4; ++j)414 {417return false;418 }419 }420 }421return true;422 }423424void printBlock(HANDLE hOut, int block[4][4], int x, int y)425 {426switch (block[0][0])427 {428case10:429case11:430 SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);431break;432case12:433case13:434case14:435case15:436 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); 437break;438case16:439case17:440case18:441case19:442 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); 443break;444case20:445case21:446case22:447case23:448 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);449break;450case24:451case25:452 SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);453break;454case26:455case27:456 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);457break;458case28:459 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);460break;461default:462break;463 }464for (int i = 0; i < 4; ++i)465 {466if (i + x >= 0)467 {468for (int j = 0; j < 4; ++j)469 {470if (block[i][j] == 1)471 {472473 gotoXY(hOut, 2 * (y + j), x + i);474 cout << "■";475 }476 }477 }478 }479 }480481void clearBlock(HANDLE hOut, int block[4][4], int x, int y)482 {483for (int i = 0; i < 4; ++i)484 {485if (i + x >= 0)486 {487for (int j = 0; j < 4; ++j)488 {489if (block[i][j] == 1)490 {491 gotoXY(hOut, 2 * (y + j), x + i);492 cout << "";493 }494 }495 }496 }497 }498501 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);502 gotoXY(hOut, 9, 8);503 cout << "GAME OVER";504 gotoXY(hOut, 8, 9);505 cout << "空格键:重来";506 gotoXY(hOut, 8, 10);507 cout << "ESC键:退出";508char key;509while (true)510 {511 key = _getch();512if (key == 32)513 {514return;515 }516if (key == 27)517 {518 exit(0);519 }520 }521 }522523int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)524 {525if (collisionDetection(block, map, x + 1, y))526 {527 clearBlock(hOut, block, x, y);528 ++x;529return0;530 }531if (x < 0)532 {533return2;534 }535for (int i = 0; i < 4; ++i)536 {537for (int j = 0; j < 4; ++j)538 {539if (block[i][j] == 1)540 {541 map[x + i][y + j] = 1;542 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); 543 gotoXY(hOut, 2 * (y + j), x + i);544 cout << "■";545 }546 }547 }548return1;549 }550551void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)552 {553if (collisionDetection(block, map, x, y - 1))554 {555 clearBlock(hOut, block, x, y);556 --y;557 }558 }559560void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)561 {562if (collisionDetection(block, map, x, y + 1))563 {564 clearBlock(hOut, block, x, y);565 ++y;566 }567 }568569void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)570 {571switch (block[0][0])572 {573case10:574if (collisionDetection(block01, map, x, y))575 {576 clearBlock(hOut, block, x, y);577for (int i = 0; i < 4; ++i)578 {579for (int j = 0; j < 4; ++j)580 {581 block[i][j] = block01[i][j];582 }586case11:587if (collisionDetection(block00, map, x, y))588 {589 clearBlock(hOut, block, x, y);590for (int i = 0; i < 4; ++i)591 {592for (int j = 0; j < 4; ++j)593 {594 block[i][j] = block00[i][j];595 }596 }597 }598else if (collisionDetection(block00, map, x, y - 1)) 599 {600 clearBlock(hOut, block, x, y);601for (int i = 0; i < 4; ++i)602 {603for (int j = 0; j < 4; ++j)604 {605 block[i][j] = block00[i][j];606 }607 }608 --y;609 }610else if (collisionDetection(block00, map, x, y + 1)) 611 {612 clearBlock(hOut, block, x, y);613for (int i = 0; i < 4; ++i)614 {615for (int j = 0; j < 4; ++j)616 {617 block[i][j] = block00[i][j];618 }619 }620 ++y;621 }622else if (collisionDetection(block00, map, x, y - 2)) 623 {624 clearBlock(hOut, block, x, y);625for (int i = 0; i < 4; ++i)626 {627for (int j = 0; j < 4; ++j)628 {629 block[i][j] = block00[i][j];630 }631 }632 y = y - 2;633 }634else if (collisionDetection(block00, map, x, y + 2)) 635 {636 clearBlock(hOut, block, x, y);637for (int i = 0; i < 4; ++i)638 {639for (int j = 0; j < 4; ++j)640 {641 block[i][j] = block00[i][j];642 }643 }644 y = y + 2;645 }646break;647case12:648if (collisionDetection(block03, map, x, y))649 {650 clearBlock(hOut, block, x, y);651for (int i = 0; i < 4; ++i)652 {653for (int j = 0; j < 4; ++j)654 {655 block[i][j] = block03[i][j];656 }657 }658 }659else if (collisionDetection(block03, map, x, y - 1)) 660 {661 clearBlock(hOut, block, x, y);662for (int i = 0; i < 4; ++i)663 {664for (int j = 0; j < 4; ++j)665 {666 block[i][j] = block03[i][j];671else if (collisionDetection(block03, map, x, y + 1)) 672 {673 clearBlock(hOut, block, x, y);674for (int i = 0; i < 4; ++i)675 {676for (int j = 0; j < 4; ++j)677 {678 block[i][j] = block03[i][j];679 }680 }681 ++y;682 }683break;684case13:685if (collisionDetection(block04, map, x, y))686 {687 clearBlock(hOut, block, x, y);688for (int i = 0; i < 4; ++i)689 {690for (int j = 0; j < 4; ++j)691 {692 block[i][j] = block04[i][j];693 }694 }695 }696else if (collisionDetection(block04, map, x, y - 1)) 697 {698 clearBlock(hOut, block, x, y);699for (int i = 0; i < 4; ++i)700 {701for (int j = 0; j < 4; ++j)702 {703 block[i][j] = block04[i][j];704 }705 }706 --y;707 }708else if (collisionDetection(block04, map, x, y + 1)) 709 {710 clearBlock(hOut, block, x, y);711for (int i = 0; i < 4; ++i)712 {713for (int j = 0; j < 4; ++j)714 {715 block[i][j] = block04[i][j];716 }717 }718 ++y;719 }720break;721case14:722if (collisionDetection(block05, map, x, y))723 {724 clearBlock(hOut, block, x, y);725for (int i = 0; i < 4; ++i)726 {727for (int j = 0; j < 4; ++j)728 {729 block[i][j] = block05[i][j];730 }731 }732 }733else if (collisionDetection(block05, map, x, y - 1)) 734 {735 clearBlock(hOut, block, x, y);736for (int i = 0; i < 4; ++i)737 {738for (int j = 0; j < 4; ++j)739 {740 block[i][j] = block05[i][j];741 }742 }743 --y;744 }745else if (collisionDetection(block05, map, x, y + 1)) 746 {747 clearBlock(hOut, block, x, y);748for (int i = 0; i < 4; ++i)749 {750for (int j = 0; j < 4; ++j)755 ++y;756 }757break;758case15:759if (collisionDetection(block02, map, x, y))760 {761 clearBlock(hOut, block, x, y);762for (int i = 0; i < 4; ++i)763 {764for (int j = 0; j < 4; ++j)765 {766 block[i][j] = block02[i][j];767 }768 }769 }770else if (collisionDetection(block02, map, x, y - 1)) 771 {772 clearBlock(hOut, block, x, y);773for (int i = 0; i < 4; ++i)774 {775for (int j = 0; j < 4; ++j)776 {777 block[i][j] = block02[i][j];778 }779 }780 --y;781 }782else if (collisionDetection(block02, map, x, y + 1)) 783 {784 clearBlock(hOut, block, x, y);785for (int i = 0; i < 4; ++i)786 {787for (int j = 0; j < 4; ++j)788 {789 block[i][j] = block02[i][j];790 }791 }792 ++y;793 }794break;795796case16:797if (collisionDetection(block07, map, x, y))798 {799 clearBlock(hOut, block, x, y);800for (int i = 0; i < 4; ++i)801 {802for (int j = 0; j < 4; ++j)803 {804 block[i][j] = block07[i][j];805 }806 }807 }808else if (collisionDetection(block07, map, x, y - 1)) 809 {810 clearBlock(hOut, block, x, y);811for (int i = 0; i < 4; ++i)812 {813for (int j = 0; j < 4; ++j)814 {815 block[i][j] = block07[i][j];816 }817 }818 --y;819 }820else if (collisionDetection(block07, map, x, y + 1)) 821 {822 clearBlock(hOut, block, x, y);823for (int i = 0; i < 4; ++i)824 {825for (int j = 0; j < 4; ++j)826 {827 block[i][j] = block07[i][j];828 }829 }830 ++y;831 }832break;833case17:834if (collisionDetection(block08, map, x, y))837for (int i = 0; i < 4; ++i)838 {839for (int j = 0; j < 4; ++j)840 {841 block[i][j] = block08[i][j];842 }843 }844 }845else if (collisionDetection(block08, map, x, y - 1)) 846 {847 clearBlock(hOut, block, x, y);848for (int i = 0; i < 4; ++i)849 {850for (int j = 0; j < 4; ++j)851 {852 block[i][j] = block08[i][j];853 }854 }855 --y;856 }857else if (collisionDetection(block08, map, x, y + 1)) 858 {859 clearBlock(hOut, block, x, y);860for (int i = 0; i < 4; ++i)861 {862for (int j = 0; j < 4; ++j)863 {864 block[i][j] = block08[i][j];865 }866 }867 ++y;868 }869break;870case18:871if (collisionDetection(block09, map, x, y))872 {873 clearBlock(hOut, block, x, y);874for (int i = 0; i < 4; ++i)875 {876for (int j = 0; j < 4; ++j)877 {878 block[i][j] = block09[i][j];879 }880 }881 }882else if (collisionDetection(block09, map, x, y - 1)) 883 {884 clearBlock(hOut, block, x, y);885for (int i = 0; i < 4; ++i)886 {887for (int j = 0; j < 4; ++j)888 {889 block[i][j] = block09[i][j];890 }891 }892 --y;893 }894else if (collisionDetection(block09, map, x, y + 1)) 895 {896 clearBlock(hOut, block, x, y);897for (int i = 0; i < 4; ++i)898 {899for (int j = 0; j < 4; ++j)900 {901 block[i][j] = block09[i][j];902 }903 }904 ++y;905 }906break;907case19:908if (collisionDetection(block06, map, x, y))909 {910 clearBlock(hOut, block, x, y);911for (int i = 0; i < 4; ++i)912 {913for (int j = 0; j < 4; ++j)914 {915 block[i][j] = block06[i][j];916 }921 clearBlock(hOut, block, x, y);922for (int i = 0; i < 4; ++i)923 {924for (int j = 0; j < 4; ++j)925 {926 block[i][j] = block06[i][j];927 }928 }929 --y;930 }931else if (collisionDetection(block06, map, x, y + 1)) 932 {933 clearBlock(hOut, block, x, y);934for (int i = 0; i < 4; ++i)935 {936for (int j = 0; j < 4; ++j)937 {938 block[i][j] = block06[i][j];939 }940 }941 ++y;942 }943break;944case20:945if (collisionDetection(block11, map, x, y))946 {947 clearBlock(hOut, block, x, y);948for (int i = 0; i < 4; ++i)949 {950for (int j = 0; j < 4; ++j)951 {952 block[i][j] = block11[i][j];953 }954 }955 }956else if (collisionDetection(block11, map, x, y - 1)) 957 {958 clearBlock(hOut, block, x, y);959for (int i = 0; i < 4; ++i)960 {961for (int j = 0; j < 4; ++j)962 {963 block[i][j] = block11[i][j];964 }965 }966 --y;967 }968else if (collisionDetection(block11, map, x, y + 1)) 969 {970 clearBlock(hOut, block, x, y);971for (int i = 0; i < 4; ++i)972 {973for (int j = 0; j < 4; ++j)974 {975 block[i][j] = block11[i][j];976 }977 }978 ++y;979 }980break;981case21:982if (collisionDetection(block12, map, x, y))983 {984 clearBlock(hOut, block, x, y);985for (int i = 0; i < 4; ++i)986 {987for (int j = 0; j < 4; ++j)988 {989 block[i][j] = block12[i][j];990 }991 }992 }993else if (collisionDetection(block12, map, x, y - 1)) 994 {995 clearBlock(hOut, block, x, y);996for (int i = 0; i < 4; ++i)997 {998for (int j = 0; j < 4; ++j)999 {1000 block[i][j] = block12[i][j];1005else if (collisionDetection(block12, map, x, y + 1)) 1006 {1007 clearBlock(hOut, block, x, y);1008for (int i = 0; i < 4; ++i)1009 {1010for (int j = 0; j < 4; ++j)1011 {1012 block[i][j] = block12[i][j];1013 }1014 }1015 ++y;1016 }1017break;1018case22:1019if (collisionDetection(block13, map, x, y))1020 {1021 clearBlock(hOut, block, x, y);1022for (int i = 0; i < 4; ++i)1023 {1024for (int j = 0; j < 4; ++j)1025 {1026 block[i][j] = block13[i][j];1027 }1028 }1029 }1030else if (collisionDetection(block13, map, x, y - 1)) 1031 {1032 clearBlock(hOut, block, x, y);1033for (int i = 0; i < 4; ++i)1034 {1035for (int j = 0; j < 4; ++j)1036 {1037 block[i][j] = block13[i][j];1038 }1039 }1040 --y;1041 }1042else if (collisionDetection(block13, map, x, y + 1)) 1043 {1044 clearBlock(hOut, block, x, y);1045for (int i = 0; i < 4; ++i)1046 {1047for (int j = 0; j < 4; ++j)1048 {1049 block[i][j] = block13[i][j];1050 }1051 }1052 ++y;1053 }1054break;1055case23:1056if (collisionDetection(block10, map, x, y))1057 {1058 clearBlock(hOut, block, x, y);1059for (int i = 0; i < 4; ++i)1060 {1061for (int j = 0; j < 4; ++j)1062 {1063 block[i][j] = block10[i][j];1064 }1065 }1066 }1067else if (collisionDetection(block10, map, x, y - 1)) 1068 {1069 clearBlock(hOut, block, x, y);1070for (int i = 0; i < 4; ++i)1071 {1072for (int j = 0; j < 4; ++j)1073 {1074 block[i][j] = block10[i][j];1075 }1076 }1077 --y;1078 }1079else if (collisionDetection(block10, map, x, y + 1)) 1080 {1081 clearBlock(hOut, block, x, y);1082for (int i = 0; i < 4; ++i)1083 {1084for (int j = 0; j < 4; ++j)1090 }1091break;1092case24:1093if (collisionDetection(block15, map, x, y))1094 {1095 clearBlock(hOut, block, x, y);1096for (int i = 0; i < 4; ++i)1097 {1098for (int j = 0; j < 4; ++j)1099 {1100 block[i][j] = block15[i][j];1101 }1102 }1103 }1104else if (collisionDetection(block15, map, x, y - 1)) 1105 {1106 clearBlock(hOut, block, x, y);1107for (int i = 0; i < 4; ++i)1108 {1109for (int j = 0; j < 4; ++j)1110 {1111 block[i][j] = block15[i][j];1112 }1113 }1114 --y;1115 }1116else if (collisionDetection(block15, map, x, y + 1)) 1117 {1118 clearBlock(hOut, block, x, y);1119for (int i = 0; i < 4; ++i)1120 {1121for (int j = 0; j < 4; ++j)1122 {1123 block[i][j] = block15[i][j];1124 }1125 }1126 ++y;1127 }1128break;1129case25:1130if (collisionDetection(block14, map, x, y))1131 {1132 clearBlock(hOut, block, x, y);1133for (int i = 0; i < 4; ++i)1134 {1135for (int j = 0; j < 4; ++j)1136 {1137 block[i][j] = block14[i][j];1138 }1139 }1140 }1141else if (collisionDetection(block14, map, x, y - 1)) 1142 {1143 clearBlock(hOut, block, x, y);1144for (int i = 0; i < 4; ++i)1145 {1146for (int j = 0; j < 4; ++j)1147 {1148 block[i][j] = block14[i][j];1149 }1150 }1151 --y;1152 }1153else if (collisionDetection(block14, map, x, y + 1)) 1154 {1155 clearBlock(hOut, block, x, y);1156for (int i = 0; i < 4; ++i)1157 {1158for (int j = 0; j < 4; ++j)1159 {1160 block[i][j] = block14[i][j];1161 }1162 }1163 ++y;1164 }1165break;1166case26:1167if (collisionDetection(block17, map, x, y))1168 {1174 block[i][j] = block17[i][j];1175 }1176 }1177 }1178else if (collisionDetection(block17, map, x, y - 1))1179 {1180 clearBlock(hOut, block, x, y);1181for (int i = 0; i < 4; ++i)1182 {1183for (int j = 0; j < 4; ++j)1184 {1185 block[i][j] = block17[i][j];1186 }1187 }1188 --y;1189 }1190else if (collisionDetection(block17, map, x, y + 1))1191 {1192 clearBlock(hOut, block, x, y);1193for (int i = 0; i < 4; ++i)1194 {1195for (int j = 0; j < 4; ++j)1196 {1197 block[i][j] = block17[i][j];1198 }1199 }1200 ++y;1201 }1202break;1203case27:1204if (collisionDetection(block16, map, x, y))1205 {1206 clearBlock(hOut, block, x, y);1207for (int i = 0; i < 4; ++i)1208 {1209for (int j = 0; j < 4; ++j)1210 {1211 block[i][j] = block16[i][j];1212 }1213 }1214 }1215else if (collisionDetection(block16, map, x, y - 1))1216 {1217 clearBlock(hOut, block, x, y);1218for (int i = 0; i < 4; ++i)1219 {1220for (int j = 0; j < 4; ++j)1221 {1222 block[i][j] = block16[i][j];1223 }1224 }1225 --y;1226 }1227else if (collisionDetection(block16, map, x, y + 1))1228 {1229 clearBlock(hOut, block, x, y);1230for (int i = 0; i < 4; ++i)1231 {1232for (int j = 0; j < 4; ++j)1233 {1234 block[i][j] = block16[i][j];1235 }1236 }1237 ++y;1238 }1239break;1240default:1241break;1242 }1243 }12441245void myStop(HANDLE hOut, int block[4][4])1246 {1247 clearBlock(hOut, block, 5, 15);1248 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); 1249 gotoXY(hOut, 30, 7);1250 cout << "游戏暂停";1251char key;1252while (true)。
基于python语言编写的俄罗斯方块源代码(以下代码均经过测试,可以直接运行)import pygameimport random# 定义方块的颜色和大小BLOCK_COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]BLOCK_SIZE = [10, 10]# 初始化Pygamepygame.init()# 设置游戏窗口的尺寸和标题screen_width = 800screen_height = 600screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("Russian Blocks")# 定义方块的类class Block:def __init__(self, x, y):self.x = xself.y = yself.color = BLOCK_COLORS[random.randint(0, len(BLOCK_COLORS)-1)]self.size = BLOCK_SIZE[random.randint(0, len(BLOCK_SIZE)-1)] def draw(self, screen):pygame.draw.rect(screen, self.color, (self.x, self.y, self.size, self.size)) def update(self):self.y += 1self.x = self.y * self.size + BLOCK_SIZE[random.randint(0, len(BLOCK_SIZE)-1)] # 创建一个新的方块new_block = Block(200, 0)# 主循环running = Truewhile running:# 处理事件for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 移动方块new_block.update()new_block.draw(screen)# 检查是否有新方块放置在顶部if new_block.x < new_block.size:# 把新方块放置在顶部new_block.y = random.randint(请注意,此代码只是一个简单的示例,可能需要更多的工作和技能才能实现完整的游戏。
俄罗斯方块python代码俄罗斯方块Python代码俄罗斯方块是一款经典的电子游戏,由前苏联科学家阿列克谢·帕基特诺夫于1984年创造。
这个游戏的目标是通过移动、旋转和摆放不同形状的方块,使它们在屏幕上形成完整的水平行,当一行被填满时,会消除并得到积分。
下面是一个使用Python编写的俄罗斯方块代码示例:```pythonimport pygameimport random# 方块的形状SHAPES = [[[1, 1, 1, 1]], # I形状[[1, 1], [1, 1]], # O形状[[1, 1, 0], [0, 1, 1]], # Z形状[[0, 1, 1], [1, 1, 0]], # S形状[[1, 1, 1], [0, 1, 0]], # T形状[[1, 1, 1], [0, 0, 1]], # L形状[[1, 1, 1], [1, 0, 0]] # J形状]# 初始化游戏界面def init_game():pygame.init()screen = pygame.display.set_mode((300, 600))pygame.display.set_caption("俄罗斯方块")return screen# 创建方块def create_block():shape = random.choice(SHAPES)return shape# 绘制方块def draw_block(screen, block, x, y):for i in range(len(block)):for j in range(len(block[i])):if block[i][j] == 1:pygame.draw.rect(screen, (255, 0, 0), (x + j * 30, y + i * 30, 30, 30))# 游戏主循环def main():screen = init_game()clock = pygame.time.Clock()x, y = 100, 0 # 方块的初始位置block = create_block() # 创建一个方块while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()returnkeys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:x -= 30if keys[pygame.K_RIGHT]:x += 30if keys[pygame.K_DOWN]:y += 30screen.fill((0, 0, 0)) # 清空屏幕draw_block(screen, block, x, y) # 绘制方块pygame.display.update()clock.tick(5) # 控制游戏帧率if __name__ == "__main__":main()```以上是一个简单的俄罗斯方块游戏的Python代码示例。
俄罗斯方块代码清单:#define MAXCOM 7 //部件数#define WIDE 13 //游戏区域宽#define HIGH 26 //高#define SIZE 12 //组成游戏区域的方格大小#define TOP 50 //游戏左上角坐标#define LEFT 50#define EASY 500 //游戏难度#define NORMAL 300#define HARD 200typedef struct tagComponet{int intComID; //部件的ID号int intDimension; //存储该部件所需的数组维数int* pintArray; //指向存储该部件的数组}Componet;class CRusBlockView : public CView{……private:int m_intComID; // 当前下落的部件int m_intState[HIGH][WIDE]; //当前状态Componet m_Componets[MAXCOM]; //所有部件的内部表示int m_intScore; //分数int m_intLevel;Componet m_CurrentCom; //当前的部件POINT ptIndex; //部件数组在全局数组中的索引// 产生一个新的部件void NewComponet(void);// 是否还可以下落bool CanDown(void);// 刷新函数void MyInvalidateRect(POINT ptStart, int intDimension);// 消去行void Disappear(void);// 判断游戏是否结束bool CheckFail(void);// 是否还可以旋转bool CanRotate(void);// 是否还可以左移bool CanLeft(void);// 是否还可以右移bool CanRight(void);//检查是否有足够的空位显示新的部件,否则游戏结束bool CanNew();};CRusBlockView::CRusBlockView(){// TODO: add construction code herefor (int i=0;i<HIGH;i++)for(int j=0;j<WIDE;j++)m_intState[i][j]=0;m_intLevel=NORMAL; //初始化难度srand((unsigned) time(NULL)); //初始化随机数m_intScore=0;m_CurrentCom.intComID=-1;m_CurrentCom.intDimension=0;m_CurrentCom.pintArray=NULL;//初始化7个部件//0:方块m_Componets[0].intComID=0;m_Componets[0].intDimension=2;m_Componets[0].pintArray=new int[4];for (i=0;i<4;i++)m_Componets[0].pintArray[i]=1; // 1 1// 1 1//1:-|m_Componets[1].intComID=1;m_Componets[1].intDimension=3;m_Componets[1].pintArray=new int[9];m_Componets[1].pintArray[0]=0;m_Componets[1].pintArray[1]=1;m_Componets[1].pintArray[2]=0; // 0 1 0m_Componets[1].pintArray[3]=1; // 1 1 1m_Componets[1].pintArray[4]=1; // 0 0 0m_Componets[1].pintArray[5]=1;m_Componets[1].pintArray[6]=0;m_Componets[1].pintArray[7]=0;m_Componets[1].pintArray[8]=0;//2m_Componets[2].intComID=2;m_Componets[2].intDimension=3;m_Componets[2].pintArray=new int[9];m_Componets[2].pintArray[0]=1;m_Componets[2].pintArray[1]=0;m_Componets[2].pintArray[2]=0; // 1 0 0 m_Componets[2].pintArray[3]=1; // 1 1 0 m_Componets[2].pintArray[4]=1; // 0 1 0 m_Componets[2].pintArray[5]=0;m_Componets[2].pintArray[6]=0;m_Componets[2].pintArray[7]=1;m_Componets[2].pintArray[8]=0;//3m_Componets[3].intComID=3;m_Componets[3].intDimension=3;m_Componets[3].pintArray=new int[9];m_Componets[3].pintArray[0]=0;m_Componets[3].pintArray[1]=0;m_Componets[3].pintArray[2]=1; // 0 0 1 m_Componets[3].pintArray[3]=0; // 0 1 1 m_Componets[3].pintArray[4]=1; // 0 1 0 m_Componets[3].pintArray[5]=1;m_Componets[3].pintArray[6]=0;m_Componets[3].pintArray[7]=1;m_Componets[3].pintArray[8]=0;//4m_Componets[4].intComID=4;m_Componets[4].intDimension=3;m_Componets[4].pintArray=new int[9];m_Componets[4].pintArray[0]=1;m_Componets[4].pintArray[1]=0;m_Componets[4].pintArray[2]=0; // 1 0 0 m_Componets[4].pintArray[3]=1; // 1 1 1 m_Componets[4].pintArray[4]=1; // 0 0 0 m_Componets[4].pintArray[5]=1;m_Componets[4].pintArray[6]=0;m_Componets[4].pintArray[7]=0;m_Componets[4].pintArray[8]=0;//5m_Componets[5].intComID=5;m_Componets[5].intDimension=3;m_Componets[5].pintArray=new int[9];m_Componets[5].pintArray[0]=0;m_Componets[5].pintArray[1]=0;m_Componets[5].pintArray[2]=1; // 0 0 1m_Componets[5].pintArray[3]=1; // 1 1 1m_Componets[5].pintArray[4]=1; // 0 0 0m_Componets[5].pintArray[5]=1;m_Componets[5].pintArray[6]=0;m_Componets[5].pintArray[7]=0;m_Componets[5].pintArray[8]=0;//6m_Componets[6].intComID=6;m_Componets[6].intDimension=4;m_Componets[6].pintArray=new int[16];m_Componets[6].pintArray[0]=0;m_Componets[6].pintArray[1]=1;m_Componets[6].pintArray[2]=0; // 0 1 0 0m_Componets[6].pintArray[3]=0; // 0 1 0 0m_Componets[6].pintArray[4]=0; // 0 1 0 0m_Componets[6].pintArray[5]=1; // 0 1 0 0 m_Componets[6].pintArray[6]=0;m_Componets[6].pintArray[7]=0;m_Componets[6].pintArray[8]=0;m_Componets[6].pintArray[9]=1;m_Componets[6].pintArray[10]=0;m_Componets[6].pintArray[11]=0;m_Componets[6].pintArray[12]=0;m_Componets[6].pintArray[13]=1;m_Componets[6].pintArray[14]=0;m_Componets[6].pintArray[15]=0;}CRusBlockView::~CRusBlockView(){//释放内存for(int i=0;i<MAXCOM;i++)delete [] m_Componets[i].pintArray;delete [] m_CurrentCom.pintArray;}void CRusBlockView::OnDraw(CDC* pDC){CRusBlockDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here//画游戏区域CBrush brushBK(RGB(135,197,255));CBrush* pbrushOld=pDC->SelectObject(&brushBK);pDC->Rectangle(LEFT-1,TOP-1,LEFT+WIDE*SIZE+1,TOP+HIGH*SIZE+1);//画不能移动的方块CBrush brushStick(RGB(127,127,127));pDC->SelectObject(&brushStick);for (int i=0;i<HIGH;i++)for(int j=0;j<WIDE;j++)if(m_intState[i][j]==1)pDC->Rectangle(LEFT+SIZE*j,TOP+SIZE*i,LEFT+SIZE*(j+1),TOP+SIZE*(i+1));//画下落的部件if(m_CurrentCom.intComID>=0){CBrush brushCom(RGB(0,255,0));pDC->SelectObject(&brushCom);int intDimension=m_CurrentCom.intDimension;for(int i=0;i<intDimension*intDimension;i++){if(m_CurrentCom.pintArray[i]==1){int m=ptIndex.x+i/intDimension; //找出部件对应整体数组中的位置int n=ptIndex.y+(i%intDimension);pDC->Rectangle(LEFT+SIZE*n,TOP+SIZE*m,LEFT+SIZE*(n+1),TOP+SIZE*(m+1));}}}//显示得分CString strOut;strOut.Format("得分%d",m_intScore);pDC->TextOut(LEFT+WIDE*SIZE+50,TOP+100,strOut);pDC->SelectObject(&pbrushOld);}void CRusBlockView::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultint intDimension=m_CurrentCom.intDimension;if(CanDown()) //可以下落{//擦除MyInvalidateRect(ptIndex,intDimension);//下落ptIndex.x++;//显示新位置上的部件MyInvalidateRect(ptIndex,intDimension);}else{for(int i=0;i<intDimension*intDimension;i++){if(m_CurrentCom.pintArray[i]==1){int m=ptIndex.x+i/intDimension; //找出部件对应整体数组中的位置int n=ptIndex.y+(i%intDimension);m_intState[m][n]=1;}}MyInvalidateRect(ptIndex,intDimension);Disappear(); //消去行if(CheckFail()) //游戏结束{m_CurrentCom.intComID=-1;KillTimer(1);MessageBox("Game Over!");}elseNewComponet(); //新部件}CView::OnTimer(nIDEvent);}void CRusBlockView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){// TODO: Add your message handler code here and/or call defaultint intDimension=m_CurrentCom.intDimension;switch(nChar) //left 37, right 39, up 38{case 37:if(CanLeft()){//擦除MyInvalidateRect(ptIndex,intDimension);//左移ptIndex.y--;//显示新位置上的部件MyInvalidateRect(ptIndex,intDimension);}break;case 39:if(CanRight()){//擦除MyInvalidateRect(ptIndex,intDimension);//右移ptIndex.y++;//显示新位置上的部件MyInvalidateRect(ptIndex,intDimension);}break;case 38:if(CanRotate()){//擦除MyInvalidateRect(ptIndex,intDimension);//转动int* pintNewCom=new int[intDimension*intDimension];for(int i=0;i<intDimension*intDimension;i++){intintR=intDimension*(intDimension-(i%intDimension)-1)+(i/intDimension);pintNewCom[i]=m_CurrentCom.pintArray[intR];}for(i=0;i<intDimension*intDimension;i++){m_CurrentCom.pintArray[i]=pintNewCom[i];}delete [] pintNewCom;//显示新位置上的部件MyInvalidateRect(ptIndex,intDimension);}break;}CView::OnKeyDown(nChar, nRepCnt, nFlags);}void CRusBlockView::NewComponet(void){int intComID=rand()%7; //产生随机数m_CurrentCom.intComID=intComID;int intDimension=m_Componets[intComID].intDimension;m_CurrentCom.intDimension=intDimension;delete [] m_CurrentCom.pintArray; //删除上一个部件的内存分配m_CurrentCom.pintArray=new int[intDimension*intDimension];//拷贝部件for(int i=0;i<intDimension*intDimension;i++)m_CurrentCom.pintArray[i]=m_Componets[intComID].pintArray[i];ptIndex.x=0;//行ptIndex.y=5;//列//检查是否有足够的空位显示新的部件,否则游戏结束if(CanNew()){//显示该部件MyInvalidateRect(ptIndex,intDimension);}else{m_CurrentCom.intComID=-1;KillTimer(1);MessageBox("Game Over!");}}bool CRusBlockView::CanDown(void){bool boolDown=true;POINT intNewIndex=ptIndex; //假设可以下落intNewIndex.x++;int intDimension=m_CurrentCom.intDimension;for(int i=0;i<intDimension*intDimension;i++){if(m_CurrentCom.pintArray[i]==1){int m=intNewIndex.x+i/intDimension; //找出部件对应整体数组中的位置int n=intNewIndex.y+(i%intDimension);if(m>=HIGH || m_intState[m][n]==1) //被挡住或出游戏区域boolDown=false;}}return boolDown;}// 可以左移bool CRusBlockView::CanLeft(void){bool boolLeft=true;int intDimension=m_CurrentCom.intDimension;POINT ptNewIndex=ptIndex; //假设可以左移ptNewIndex.y--;for(int i=0;i<intDimension*intDimension;i++){if(m_CurrentCom.pintArray[i]==1){int m=ptNewIndex.x+i/intDimension; //找出部件对应整体数组中的位置int n=ptNewIndex.y+(i%intDimension);if(n<0 || m_intState[m][n]==1) //被挡住或出游戏区域boolLeft=false;}}return boolLeft;}// 可以右移bool CRusBlockView::CanRight(void){bool boolRight=true;int intDimension=m_CurrentCom.intDimension;POINT ptNewIndex=ptIndex; //假设可以右移ptNewIndex.y++;for(int i=0;i<intDimension*intDimension;i++){if(m_CurrentCom.pintArray[i]==1){int m=ptNewIndex.x+i/intDimension; //找出部件对应整体数组中的位置int n=ptNewIndex.y+(i%intDimension);if(n>=WIDE || m_intState[m][n]==1) //被挡住或出游戏区域boolRight=false;}}return boolRight;}// 可以旋转bool CRusBlockView::CanRotate(void){bool boolRotate=true;int intDimension=m_CurrentCom.intDimension;POINT ptNewIndex=ptIndex;//假设可以转动//新的矩阵存储转动后的部件int* pintNewCom=new int[intDimension*intDimension];//顺时针转动并判断for(int i=0;i<intDimension*intDimension;i++){int intR=intDimension*(intDimension-(i%intDimension)-1)+(i/intDimension);pintNewCom[i]=m_CurrentCom.pintArray[intR];if(pintNewCom[i]==1){int m=ptNewIndex.x+i/intDimension; //找出部件对应整体数组中的位置int n=ptNewIndex.y+(i%intDimension);if(n<0 || m_intState[m][n]==1 || n>=WIDE || m>=HIGH) //被挡住或出游戏区域boolRotate=false;}}delete [] pintNewCom;return boolRotate;}// 可以产生新的部件bool CRusBlockView::CanNew(void){bool boolNew=true;int intDimension=m_CurrentCom.intDimension;POINT ptNewIndex=ptIndex; //假设可以for(int i=0;i<intDimension*intDimension;i++){if(m_CurrentCom.pintArray[i]==1){int m=ptNewIndex.x+i/intDimension; //找出部件对应整体数组中的位置int n=ptNewIndex.y+(i%intDimension);if(m_intState[m][n]==1) //被挡住boolNew=false;}}return boolNew;}//判断游戏是否结束bool CRusBlockView::CheckFail(void){bool boolEnd=false;for(int j=0;j<WIDE;j++)if(m_intState[0][j]==1)boolEnd=true;return boolEnd;}//消去行void CRusBlockView::Disappear(void){int intLine=0; //一次消去的行数for(int i=HIGH-1;i>=0;i--){bool boolLine=true;for(int j=0;j<WIDE;j++)if(m_intState[i][j]==0)boolLine=false;if(boolLine) //行可以消去{intLine++;//向下移动for(int m=i;m>0;m--)for(int n=0;n<WIDE;n++)m_intState[m][n]=m_intState[m-1][n];for(int n=0;n<WIDE;n++)m_intState[0][n]=0; //最顶层清除i++;}}if(intLine>0){m_intScore+=(intLine-1)*200+100;InvalidateRect(CRect(LEFT+WIDE*SIZE+50,TOP+100,LEFT+WIDE*SIZE+200,TOP+200));}InvalidateRect(CRect(LEFT,TOP,LEFT+WIDE*SIZE,TOP+HIGH*SIZE));}void CRusBlockView::OnGameStart(){// TODO: Add your command handler code herefor (int i=0;i<HIGH;i++)for(int j=0;j<WIDE;j++)m_intState[i][j]=0;m_intScore=0;Invalidate();NewComponet();SetTimer(1,m_intLevel,NULL);}void CRusBlockView::OnGameEnd(){// TODO: Add your command handler code hereKillTimer(1);}void CRusBlockView::OnLevelNormal(){// TODO: Add your command handler code herem_intLevel=NORMAL;}void CRusBlockView::OnLevelHard(){// TODO: Add your command handler code herem_intLevel=HARD;}void CRusBlockView::OnLevelEasy(){// TODO: Add your command handler code herem_intLevel=EASY;}//刷新函数void CRusBlockView::MyInvalidateRect(POINT ptStart, int intDimension) {//刷新了一个以ptStart为左上角,长度为intDimension的正方形区域,//同时注意判断了不要越出游戏区域int x1=LEFT+ptStart.y*SIZE;x1=x1>LEFT?x1:LEFT;int y1=TOP+ptStart.x*SIZE;y1=y1>TOP?y1:TOP;int x2=LEFT+(ptStart.y+intDimension)*SIZE;x2=x2>LEFT+WIDE*SIZE?LEFT+WIDE*SIZE:x2;int y2=TOP+(ptStart.x+intDimension)*SIZE;y2=y2>TOP+HIGH*SIZE?TOP+HIGH*SIZE:y2;InvalidateRect(CRect(x1,y1,x2,y2));// InvalidateRect(CRect(50,50,50+13*12,50+26*12));}。
using System;using System.Collections.Generic;using System.Windows.Forms;namespace Tetris{static class Program{///<summary>///应用程序的主入口点。
///</summary>[STAThread]static void Main(){//程序从这里开始Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new策略());}}}using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Tetris.logic;namespace Tetris{public partial class策略 : Form{private GamePalette m_GamePalette;public策略(){InitializeComponent();//显示的属性pbmainpalette pbnextpalette formmain的属性 }// Application.Run(new FormMain()); FormMain_Shown pbNextPalette_Paint pbMainPalette_Paintprivate void pbMainPalette_Paint(object sender,PaintEventArgs e){if (m_GamePalette != null){m_GamePalette.PaintPalette(e.Graphics);//背景设定为灰色}}private void pbNextPalette_Paint(object sender,PaintEventArgs e){if(m_GamePalette!=null)m_GamePalette.PaintNext(e.Graphics); //一开始就有一些图像信息如背景位图}private void策略_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.F2){if (m_GamePalette != null){m_GamePalette.m_Score = 0;m_GamePalette.Close();m_GamePalette = null;}TemplateArray array = new TemplateArray(); //private ArrayList m_List = new ArrayList();//m_List 为一个动态数组array.Add("0000001000011100000000000", Color.FromArgb(-128)); //get { return m_List.Count; }array.Add("0000000000111100000000000", Color.FromArgb(-65536));//m_List.Add(new BrickTemplate(code,color))array.Add("0000000110011000000000000", Color.FromArgb(-16711936));//array 含有m_list与Count信息地址(public)array.Add("0000000100011100000000000", Color.FromArgb(-4144960));array.Add("0000000100011000100000000", Color.FromArgb(-16776961));array.Add("0000000000011100100000000", Color.FromArgb(-65281));array.Add("0000001000011000110000000", Color.FromArgb(-8323073));m_GamePalette = new GamePalette( // public GamePalette()15,25,array,20,Color.Black,pbMainPalette.CreateGraphics(),pbNextPalette.CreateGraphics(),pictureBox1.CreateGraphics(),0,Color.White,false);m_GamePalette.PaintScore();m_GamePalette.InitRandomBrick();m_GamePalette.Start();}else{if (m_GamePalette == null || m_GamePalette.IsGameover)return;if (e.KeyCode == Keys.F3){if (m_GamePalette.IsRunning) m_GamePalette.Pause();elsem_GamePalette.Resume();}else if (e.KeyCode == Keys.Left)m_GamePalette.MoveLeft();else if (e.KeyCode == Keys.Right)m_GamePalette.MoveRight();else if (e.KeyCode == Keys.Down)m_GamePalette.DropDown();else if (e.KeyCode == Keys.Up)m_GamePalette.ContraRotate();else if (e.KeyCode == Keys.Space)m_GamePalette.ContraRotate();}}private void button1_Click(object sender, EventArgs e){m_GamePalette.ContraRotate();}private void button2_Click(object sender, EventArgs e){m_GamePalette.MoveLeft();}private void button3_Click(object sender, EventArgs e){m_GamePalette.MoveRight();}private void button4_Click(object sender, EventArgs e){m_GamePalette.MoveDown();}private void button5_Click(object sender, EventArgs e){}private void策略_Shown(object sender, EventArgs e){}private void pictureBox1_Paint(object sender, PaintEventArgs e){{if (m_GamePalette != null)m_GamePalette.PaintScore(); //一开始就有一些图像信息如背景位图 }}namespace Tetris{partial class策略{///<summary>///必需的设计器变量。
#include<stdio.h>#include<stdlib.h>#include<dos.h>#include<graphics.h> /*系统提供的头文件*/#define TIMER 0x1c /*定义时钟中断的中断号*/#define VK_LEFT 0x4b00/*左移键*/#define VK_RIGHT 0x4d00/*右移键*/#define VK_DOWN 0x5000 /*加速键*/#define VK_UP 0x4800 /*变形键*/#define VK_SPACE 0x3920 /*变形键*/#define VK_END 0x4f00 /*暂停键*/#define VK_ESC 0x011b#define VK_ENTER 0x1c0d#define BSIZE 16 /*方块的边长是16个象素*/#define MAX_SHAPE 19 /*总共有19种各形态的方块*/#define BOARD_WIDTH 10 /*游戏面板的宽度,以方块的宽度为单位*/#define BOARD_HEIGHT 20/*游戏面板的高度,以方块的宽度为单位*/#define BGCOLOR BLACK /*背景色*/#define FORECOLOR WHITE /*前景色*/#define FALSE 0#define TRUE 1#define EMPTY 0#define FILLED 1#define BOARD_LEFT_X 10 /*游戏面板左上角的横坐标*/#define BOARD_LEFT_Y 5 /*游戏面板左上角的纵坐标*//*定义全局变量*/extern int Gameboard[BOARD_WIDTH+2][BOARD_HEIGHT+2];extern int nCurrent_block_index ; /*当前下落的方块的索引号*/ extern int nNext_block_index ; /*下一个方块的索引号*/extern int nSpeed, nScore; /*速度和得分*/extern int nSpeedUpScore; /*第一次要加速需达到的分数*/extern int bAccel, bOver;extern int nOriginX, nOriginY;/*某一形状的原点的绝对坐标*/ extern unsigned int TimerCounter; /* 计时变量,每秒钟增加18 */struct block{int arrXY[8];int nColor;int nNext;}; /*保存某一形状信息的结构体*/typedef struct block BLOCK;extern BLOCK arrayBlock[19];void interrupt newtimer(void);void SetTimer(void interrupt(*IntProc)(void));void KillTimer();void InitializeGraph();void InitializeGameboard() ;void DrawSquare(int x, int y);void DrawBlock(int BlockIndex, int sx, int sy,int color); int IsConflict(int BlockIndex, int x, int y);void HandleLeft(int BlockIndex,int *x, int *y);void HandleRight(int BlockIndex,int *x, int *y);void HandleUp(int *BlockIndex,int *x, int *y);int HandleDown(int BlockIndex,int *x, int *y);int IsLineFull(int y);void KillLine(int y);int KillLines(int y);int IsGameOver();int GameOver();void StartGame();void ProcessInGame();void game();void win();void help();void design();void show_win();void main(){win();menu();}void help(){clrscr();help();textcolor(WHITE);gotoxy(20,4);cprintf("\xDB\xDB\xDB\xDB\xB2 HELP ABOUT THE Game \xB2\xDB\xDB\xDB\xDB"); gotoxy(4,6);cprintf(" [ 1 ] - Metamorphose : Press the left key square moves left "); gotoxy(30,8);cprintf("Press the left key square move to the right");gotoxy(30,10);cprintf("Press down key square accelerate whereabouts");gotoxy(4,12);cprintf(" [ 2 ] - Speed up : Press the button oblong rotating ");gotoxy(4,14);cprintf(" [ 3 ] - Game Start : Press Enter to button to start the game"); gotoxy(4,16);cprintf(" [ 4 ] - Game Over : Press the ESC key to quit the game");gotoxy(30,18);cprintf("YOU WANT TO BE HELPFUL");gotoxy(6,23);printf("Press any key to go to the MAIN MENU ........");getche();}menu(){int x;do{{clrscr();design();textcolor(WHITE);cprintf("\xDB\xDB\xDB\xDB\xB2 Tetris Game \xB2\xDB\xDB\xDB\xDB");gotoxy(3,4);cprintf("--------------------------------------------------------------------------");gotoxy(35,5);cprintf("MAIN MENU");gotoxy(26,8);cprintf(" 1 - New Game ");gotoxy(26,9);cprintf(" 2 - Rank ");gotoxy(26,10);cprintf(" 3 - HELP ");gotoxy(26,11);cprintf(" 4 - The Game Explain ");gotoxy(26,12);cprintf(" 5 - EXIT ");x=toupper(getch());switch(x){case '1':game();break;case '2':cprintf("At present there is no ranking");break;case '3':help();break;case '4':cprintf("This game by LuWenJun,ChenLong,QiWei jointly compiled,Deficiencies still please forgive me");break;case '5':exit(0);break;default:clrscr();design();gotoxy(17,12);printf("\a\xDB\xB2 WRONG ENTRY : PRESS ANY KEY AND TRY AGAIN"); getche();}}}while(x!='5');return x;}void win(){int i,graphdriver,graphmode,size,page;char s1[30],s2[30];graphdriver=DETECT;initgraph(&graphdriver,&graphmode,"c:\\turboc2");cleardevice();setbkcolor(BLUE);setviewport(40,40,600,440,1);setfillstyle(1,2);setcolor(YELLOW);rectangle(0,0,560,400);floodfill(50,50,14);rectangle(20,20,540,380);setfillstyle(1,13);floodfill(21,300,14);setcolor(BLACK);settextstyle(1,0,6);outtextxy(100,60,"Welcom You");setviewport(100,200,540,380,0);setcolor(14);setfillstyle(1,12);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100,14);sprintf(s1,"Let's our play Tetris Game!");setcolor(YELLOW);outtextxy(60,40,s1);sprintf(s2,"Press any key to play....");setcolor(1);settextstyle(4,0,3);outtextxy(110,80,s2);getch();closegraph();}void design(){int i;clrscr();textcolor(14);gotoxy(2,2);cprintf("\xC9");gotoxy(3,2);for(i=1;i<=74;i++)cprintf("\xCD");gotoxy(77,2);cprintf("\xBB");gotoxy(2,3);cprintf("\xBA");gotoxy(2,4);cprintf("\xBA");gotoxy(2,5);cprintf("\xBA");gotoxy(2,6);cprintf("\xBA");gotoxy(2,7);cprintf("\xBA");gotoxy(2,8);cprintf("\xB A");gotoxy(2,9);cprintf("\xBA");gotoxy(2,10);cprintf("\xBA");gotoxy(2,11);cprintf("\ xBA");gotoxy(2,12);cprintf("\xBA");gotoxy(2,13);cprintf("\xBA");gotoxy(2,14);cprintf("\xBA");gotoxy(2,15);cprintf(" \xBA");gotoxy(2,16);cprintf("\xBA");gotoxy(2,17);cprintf("\xBA");gotoxy(2,18);cprintf("\xBA");gotoxy(2,22);cprintf(" \xCC");gotoxy(2,19);cprintf("\xBA");gotoxy(2,20);cprintf("\xBA");gotoxy(2,21);cprintf(" \xBA");gotoxy(2,24);cprintf("\xC8");gotoxy(2,23);cprintf("\xBA");gotoxy(3,24);for(i=1;i<=74;i++)cprintf("\xCD");gotoxy(77,18);cprintf("\xBA");gotoxy(77,19);cprintf("\xBA");gotoxy(77,20);cprint f("\xBA");gotoxy(77,21);cprintf("\xBA");gotoxy(77,24);cprintf("\xBC");gotoxy(77,23);cprintf("\xBA");gotoxy(3,22);for(i=1;i<=74;i++)cprintf("\xCD");gotoxy(77,22);cprintf("\xB9");gotoxy(77,3);cprintf("\xBA");gotoxy(77,4);cprintf("\xBA");gotoxy(77,5);cprintf("\xBA");gotoxy(77,6);cprintf("\xBA");gotoxy(77,7);cprintf("\xBA");gotoxy(77,8);cprintf(" \xBA");gotoxy(77,9);cprintf("\xBA");gotoxy(77,10);cprintf("\xBA");gotoxy(77,11);cprintf ("\xBA");gotoxy(77,12);cprintf("\xBA");gotoxy(77,13);cprintf("\xBA");gotoxy(77,14);cprintf("\xBA");gotoxy(77,15);cprint f("\xBA");gotoxy(77,16);cprintf("\xBA");gotoxy(77,17);cprintf("\xBA");textcolor(RED);}void show_win(void){union REGS in, out;in.x.ax = 0x1;int86(0x33, &in, &out);}/*********************************************************** 函数原型:void InitializeGraph() * * 传入参数:无 ** 返回值:无 ** 函数功能:初始化进入图形模式***********************************************************/void InitializeGraph(){int gdriver = VGA, gmode=VGAHI, errorcode;/* 初始化图形模式*/initgraph(&gdriver, &gmode, "c:\\turboc2");/* 读取初始化结果 */errorcode = graphresult();if (errorcode != grOk) /* 错误发生 */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:");getch();exit(1); /* 返回错误码 */}}/*********************************************************** 函数原型:void InitializeGameboard() ** 传入参数:无** 返回值:无** 函数功能:初始化游戏面板以及下一形状提示框、计分框和难度框 ***********************************************************/void InitializeGameboard(){/* 绘制游戏面板(即游戏区域)*/setfillstyle(SOLID_FILL,BGCOLOR);bar(BSIZE*BOARD_LEFT_X,BSIZE*BOARD_LEFT_Y,BSIZE*(BOARD_LEFT_X+BOARD_WIDTH),BSIZE*(BOARD_LEFT_Y+BOARD_HEIGHT));setcolor(WHITE);rectangle(BSIZE*BOARD_LEFT_X,BSIZE*BOARD_LEFT_Y,BSIZE*(BOARD_LEFT_X+BOARD_WIDTH),BSIZE*(BOARD_LEFT_Y+BOARD_HEIGHT));/*绘制下一形状提示框*/setcolor(BLUE);settextjustify(CENTER_TEXT, BOTTOM_TEXT);outtextxy(BSIZE*(25+4), BSIZE*(5+1), "next");setfillstyle(SOLID_FILL, BGCOLOR);bar(BSIZE*(24.5+2), BSIZE*6, BSIZE*(24.5+2+5), BSIZE*(6+5));setcolor(YELLOW);rectangle(BSIZE*(24.5+2), BSIZE*6, BSIZE*(24.5+2+5), BSIZE*(6+5));/*绘制速度框*/setcolor(BLUE);settextjustify(CENTER_TEXT, BOTTOM_TEXT);outtextxy(BSIZE*(25+4), BSIZE*(12+1), "level");setfillstyle(SOLID_FILL, BGCOLOR);bar(BSIZE*25,BSIZE*13, BSIZE*(25+8), BSIZE*(13+1));setcolor(YELLOW);rectangle(BSIZE*25,BSIZE*13, BSIZE*(25+8), BSIZE*(13+1)); setcolor(RED);settextjustify(CENTER_TEXT, BOTTOM_TEXT);outtextxy(BSIZE*(25+4), BSIZE*(13+1), "0");/*绘制计分框*/setcolor(BLUE);settextjustify(CENTER_TEXT, BOTTOM_TEXT);outtextxy(BSIZE*(25+4), BSIZE*(19+1), "score");setfillstyle(SOLID_FILL, BGCOLOR);bar(BSIZE*25,BSIZE*20, BSIZE*(25+8), BSIZE*(20+1));setcolor(YELLOW);rectangle(BSIZE*25,BSIZE*20, BSIZE*(25+8), BSIZE*(20+1)); setcolor(RED);settextjustify(CENTER_TEXT, BOTTOM_TEXT);outtextxy(BSIZE*(25+4), BSIZE*(20+1), "0");}int Gameboard[BOARD_WIDTH+2][BOARD_HEIGHT+2];int nCurrent_block_index;/* 当前下落的方块的索引号*/int nNext_block_index ; /*下一个方块的索引号*/int nSpeed, nScore; /*速度和得分*/int nSpeedUpScore = 1000; /*第一次要加速需达到的分数*/int bAccel, bOver;int nOriginX=5, nOriginY=1;/*某一形状的原点的绝对坐标*/ BLOCK arrayBlock[19]={/*x1,y1,x2,y2,x3,y3,x4,y4, color, next*/{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1}, /* */{-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2}, /* # */{ 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3}, /* # */{-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0}, /* ## */{ 0,-2, 0,-1, 0, 0, 1,-2,MAGENTA, 5}, /* */{-1,-1,-1, 0, 0, 0, 1, 0,MAGENTA, 6}, /* ## */{ 0, 0, 1,-2, 1,-1, 1, 0,MAGENTA, 7}, /* # */{-1,-1, 0,-1, 1,-1, 1, 0,MAGENTA, 4}, /* # */{-1, 0, 0,-1, 0, 0, 1, 0,YELLOW, 9}, /* */{-1,-1, 0,-2, 0,-1, 0, 0,YELLOW, 10}, /* */{-1,-1, 0,-1, 0, 0, 1,-1,YELLOW, 11}, /* # */{ 0,-2, 0,-1, 0, 0, 1,-1,YELLOW, 8}, /* ### */{-1, 0, 0,-1, 0, 0, 1,-1, BROWN, 13}, /* ## */{ 0,-2, 0,-1, 1,-1, 1, 0, BROWN, 12}, /* ## */{-1,-1, 0,-1, 0, 0, 1, 0, WHITE, 15}, /* ## */{ 0,-1, 0, 0, 1,-2, 1,-1, WHITE, 14}, /* ## */{ 0,-3, 0,-2, 0,-1, 0, 0, RED, 17},/* # */{-1, 0, 0, 0, 1, 0, 2, 0, RED, 16},/* # *//* # *//* # */{ 0,-1, 0, 0, 1,-1, 1, 0, BLUE, 18},/* ## *//* ## */};/*********************************************************** 函数原型:void StartGame () ** 传入参数:无** 返回值:无 ** 函数功能:游戏开始时调用的函数,其中绘制界面需调用函数 ** InitializeGameboard(), 接下来需初始化游戏面板的 ** 各个方块和一些全局变量的初值 ***********************************************************/void StartGame(){int i,j;/*设置游戏面板中每个方块的初始值*/for(j=0;j<=BOARD_HEIGHT;j++)for(i=0;i<BOARD_WIDTH+2;i++){if(i==0 || i==BOARD_WIDTH+1)Gameboard[i][j] = FILLED;elseGameboard[i][j] = EMPTY;}for(i=0;i<BOARD_WIDTH+2;i++)Gameboard[i][BOARD_HEIGHT+1] = FILLED;InitializeGameboard();/*设置游戏变量的初值*/nNext_block_index = -1; /*游戏初始,没有下一个形状的索引号*/nSpeed = 0;nScore = 0;}/*********************************************************** 函数原型:void ProcessInGame() ** 传入参数:无** 返回值:无** 函数功能:核心函数,主要用于处理在游戏中的各种事件(如按下各种按键) ***********************************************************/void ProcessInGame(){int key;bioskey(0);randomize();while(1){if(nNext_block_index==-1){nCurrent_block_index = rand()%19;nNext_block_index = rand()%19;/*绘制下一个提示形状*/DrawBlock(nNext_block_index,19,6,arrayBlock[nNext_block_index].nColor );}else{nCurrent_block_index = nNext_block_index;DrawBlock(nNext_block_index, 19,6,BGCOLOR ); /* 消除原来的提示形状 */nNext_block_index = rand()%19;DrawBlock(nNext_block_index,19,6,arrayBlock[nNext_block_index].nColor ); /*绘制下一个提示形状 */}nOriginX=5, nOriginY=1;TimerCounter = 0;DrawBlock(nCurrent_block_index, nOriginX,nOriginY, arrayBlock[nCurrent_block_index].nColor );/*在面板内绘制当前形状*/while(1){if (bioskey(1))key=bioskey(0);else key=0;bAccel = FALSE;switch(key){case VK_LEFT: /* 左移 */HandleLeft(nCurrent_block_index,&nOriginX,&nOriginY );break;case VK_RIGHT: /* 右移 */HandleRight(nCurrent_block_index,&nOriginX,&nOriginY );break;case VK_UP: /* 旋转 */case VK_SPACE:HandleUp(&nCurrent_block_index, &nOriginX,&nOriginY);break;case VK_DOWN: /* 下落加速键 */bAccel=TRUE;break;case VK_END: /* 暂停*/bioskey(0);break;case VK_ESC: /* 退出游戏 */bOver=TRUE;return;}if(bAccel || TimerCounter>(20-nSpeed*2))if(HandleDown(nCurrent_block_index,&nOriginX,&nOriginY))break;if(bOver)return;}}}/*********************************************************** 函数原型:void main() ** 传入参数:无 ** 返回值:无 ** 函数功能:入口函数,包含俄罗斯方块程序的主流程 ***********************************************************/void game(){InitializeGraph();SetTimer(newtimer); /*设置新的时钟中断*/while(1){StartGame();ProcessInGame();if(GameOver())break;bOver = FALSE;}KillTimer();closegraph();}unsigned int TimerCounter=0; /* 计时变量,每秒钟增加18 *//*********************************************************** 函数原型:void interrupt (*oldtimer)(void) ** 传入参数:无** 返回值:无** 函数功能:指向原来时钟中断处理过程入口的中断处理函数指针(句柄) ***********************************************************/void interrupt (*oldtimer)(void);/*********************************************************** 函数原型:void interrupt newtimer(void) ** 传入参数:无 ** 返回值:无 ** 函数功能:新的时钟中断处理函数 ***********************************************************/void interrupt newtimer(void){(*oldtimer)();TimerCounter++;}/*********************************************************** 函数原型:void SetTimer(void interrupt(*)(void)) ** 传入参数:无 ** 返回值:无 ** 函数功能:设置新的时钟中断处理函数 ***********************************************************/void SetTimer(void interrupt(*IntProc)(void)){oldtimer=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();}/*********************************************************** 函数原型:void KillTimer() ** 传入参数:无 ** 返回值:无 ** 函数功能:恢复原先的时钟中断处理函数 ***********************************************************/void KillTimer(){disable();setvect(TIMER,oldtimer);enable();}/*********************************************************** 函数原型:void DrawSquare(int x, int y) ** 传入参数:游戏面板中的横坐标x,纵坐标y ** 返回值:无 ** 函数功能:在坐标(x, y)处绘制方块 ***********************************************************/void DrawSquare(int x, int y){if(y<1)return;bar(BSIZE*(x+9)+1,BSIZE*(y+4)+1,BSIZE*(x+10)-1,BSIZE*(y+5)-1);}/*********************************************************** 函数原型:void DrawBlock(int BlockIndex, int sx, int sy,int color) ** 传入参数:形状的索引BlockIndex,绝对横坐标x,绝对纵坐标y,颜色color ** 返回值:无** 函数功能:在坐标(sx, sy)处绘制颜色为color的形状***********************************************************/void DrawBlock(int BlockIndex, int sx, int sy,int color){int i,c;setfillstyle(SOLID_FILL, color);for(i=0;i<7;i+=2)DrawSquare(arrayBlock[BlockIndex].arrXY[i]+sx,arrayBlock[BlockIndex].arrXY[i+1]+sy);}/*********************************************************** 函数原型:int IsConflict(int BlockIndex, int x, int y) ** 传入参数:形状的索引BlockIndex,绝对横坐标x,绝对纵坐标y ** 返回值:无冲突返回0,有冲突返回1 ** 函数功能:判断形状是否能存在于坐标(x, y)处 * **********************************************************/int IsConflict(int BlockIndex, int x, int y){int i;for (i=0;i<=7;i++,i++){if (arrayBlock[BlockIndex].arrXY[i]+x<1 || arrayBlock[BlockIndex].arrXY[i]+x>10)return TRUE;if (arrayBlock[BlockIndex].arrXY[i+1]+y<1)continue;if(Gameboard[arrayBlock[BlockIndex].arrXY[i]+x][arrayBlock[BlockIndex].arrXY[i+1]+ y])return TRUE;}return FALSE;}/*********************************************************** 函数原型:int HandleLeft(int BlockIndex,int *x, int *y) * * 传入参数:形状的索引BlockIndex,绝对横坐标的指针*x,绝对纵坐标的 ** 指针*y ** 返回值:无** 函数功能:按下左方向键时的处理函数***********************************************************/void HandleLeft(int BlockIndex,int *x, int *y) /*按下左方向键时的处理函数*/{if(!IsConflict(BlockIndex,*x-1,*y)){DrawBlock(BlockIndex,*x,*y,BGCOLOR); /*擦除原先的形状*/(*x)--;DrawBlock(BlockIndex, *x, *y, arrayBlock[BlockIndex].nColor); /*绘制当前形状*/}}/*********************************************************** 函数原型:int HandleRight(int BlockIndex,int *x, int *y) ** 传入参数:形状的索引BlockIndex,绝对横坐标的指针*x,绝对纵坐标的 ** 指针*y ** 返回值:无** 函数功能:按下右方向键时的处理函数***********************************************************/void HandleRight(int BlockIndex,int *x, int *y)/*按下右方向键时的处理函数*/{if(!IsConflict(BlockIndex,*x+1,*y)){DrawBlock(BlockIndex,*x,*y,BGCOLOR); /*擦除原先的形状*/(*x)++;DrawBlock(BlockIndex, *x, *y, arrayBlock[BlockIndex].nColor); /*绘制当前形状*/}}/*********************************************************** 函数原型:int HandleUp(int BlockIndex,int *x, int *y) ** 传入参数:形状的索引BlockIndex,绝对横坐标的指针*x,绝对纵坐标的 ** 指针*y ** 返回值:无** 函数功能:按下上方向键(旋转键)时的处理函数***********************************************************/void HandleUp(int *BlockIndex,int *x, int *y) /*按下旋转键时的处理函数*/{int NextBlockIndex, i;static int arrayOffset[5]={0,-1,1,-2,2};NextBlockIndex = arrayBlock[*BlockIndex].nNext;for(i=0;i<5;i++)if(!IsConflict(NextBlockIndex, *x+arrayOffset[i],*y)){DrawBlock(*BlockIndex, *x, *y, BGCOLOR); /*擦除原先的形状*/*BlockIndex = arrayBlock[*BlockIndex].nNext;(*x) += arrayOffset[i];DrawBlock(*BlockIndex, *x, *y, arrayBlock[*BlockIndex].nColor); /*绘制当前形状*/}}/*********************************************************** 函数原型:int HandleDown(int BlockIndex,int *x, int *y) * * 传入参数:形状的索引BlockIndex,绝对横坐标的指针*x,绝对纵坐标的 ** 指针*y ** 返回值:仍在自由下落返回0,无法下落了返回1 ** 函数功能:按下向下方向键或自由下落时的处理函数***********************************************************/int HandleDown(int BlockIndex,int *x, int *y)/*按下下方向键或自由下落时的处理函数*/{char ScoreBuffer[10]={0},SpeedBuffer[10]={0};int i;int NumLinesKilled=0;/*if(TimerCounter>(20-nSpeed*2))*/{TimerCounter = 0; /*重置时钟中断*/if(!IsConflict(BlockIndex,*x,*y+1)) /*仍在下落*/{DrawBlock(BlockIndex,*x,*y,BGCOLOR); /*擦除原先的形状*/(*y)++;DrawBlock(BlockIndex, *x, *y, arrayBlock[BlockIndex].nColor); /*绘制当前形状*/return FALSE;/*仍在下落返回FALSE*/}else /*无法再下落了*/{DrawBlock(BlockIndex,*x,*y,FORECOLOR);for (i=0;i<=7;i++,i++){if ((*y)+arrayBlock[BlockIndex].arrXY[i+1]<1)continue;Gameboard[(*x)+arrayBlock[BlockIndex].arrXY[i]][(*y)+arrayBlock[BlockIndex].arrX Y[i+1]]=1;}NumLinesKilled = KillLines(*y);if(NumLinesKilled>0){switch(NumLinesKilled){case 1:nScore+=100;case 2:nScore+=300;case 3:nScore+=500;case 4:nScore+=800;}/*重绘计分框*/setfillstyle(SOLID_FILL,BLACK);bar(BSIZE*25,BSIZE*20, BSIZE*(25+8), BSIZE*(20+1));setcolor(YELLOW);rectangle(BSIZE*25,BSIZE*20, BSIZE*(25+8), BSIZE*(20+1));itoa(nScore,ScoreBuffer, 10);setcolor(RED);settextjustify(CENTER_TEXT, BOTTOM_TEXT);outtextxy(BSIZE*(25+4), BSIZE*(20+1), ScoreBuffer);if(nScore > nSpeedUpScore){nSpeed++;nSpeedUpScore+= nSpeed*1000;/*重绘速度框*/setfillstyle(SOLID_FILL,BLACK);bar(BSIZE*25,BSIZE*13, BSIZE*(25+8), BSIZE*(13+1));setcolor(YELLOW);rectangle(BSIZE*25,BSIZE*13, BSIZE*(25+8), BSIZE*(13+1)); itoa(nSpeed,SpeedBuffer,10);setcolor(YELLOW);settextjustify(CENTER_TEXT, BOTTOM_TEXT);outtextxy(BSIZE*(25+4), BSIZE*(13+1), SpeedBuffer);}if(IsGameOver())bOver = TRUE;return TRUE; /*下落到底返回TRUE*/}}}/*********************************************************** 函数原型:int IsLineFull(int y) ** 传入参数:纵坐标y ** 返回值:填满返回1,否则返回0 ** 函数功能:判断第y行是否已被填满***********************************************************/int IsLineFull(int y){int i;for(i=1;i<=10;i++)if(!Gameboard[i][y])return FALSE;return TRUE;}/*********************************************************** void KillLine(int y) ** 传入参数:纵坐标y ** 返回值:无 ** 函数功能:消去第y行***********************************************************/void KillLine(int y){int i,j;for(j=y;j>=2;j--)for(i=1;i<=10;i++){if(Gameboard[i][j]==Gameboard[i][j-1])continue;if(Gameboard[i][j-1]==FILLED){Gameboard[i][j]=FILLED;setfillstyle(SOLID_FILL,FORECOLOR);}else /*Gameboard[i][j-1]==EMPTY*/Gameboard[i][j] = EMPTY;setfillstyle(SOLID_FILL,BGCOLOR);}DrawSquare(i,j);}}/*********************************************************** 函数原型:int KillLines(int y) ** 传入参数:纵坐标y ** 返回值:消去的行数 ** 函数功能:消去第y行以及与第y行连续的上面被填满的行 ***********************************************************/int KillLines(int y){int i, j, LinesKilled=0;for(i=0;i<4;i++){while(IsLineFull(y)){KillLine(y);LinesKilled++;i++;}y--;if(y<1)break;}return LinesKilled;}/*********************************************************** 函数原型:int IsGameOver() ** 传入参数:无 ** 返回值:游戏结束返回1,否则返回0 ** 函数功能:判断游戏是否结束***********************************************************/int IsGameOver(){int i;for(i=1;i<=10;i++)if(Gameboard[i][1])return TRUE;return FALSE;}/*********************************************************** 函数原型:int GameOver() ** 传入参数:无** 返回值:退出游戏返回1,否则返回0 ** 函数功能:在界面上输出游戏结束信息,并根据用户按键选择决定是否退出游戏***********************************************************/int GameOver(){int key;settextjustify(CENTER_TEXT,TOP_TEXT);/* 输出游戏结束信息 */setcolor(RED);outtextxy(BSIZE*15,BSIZE*12,"Game Over");setcolor(GREEN);outtextxy(BSIZE*15,BSIZE*14,"Enter : New Game");outtextxy(BSIZE*15,BSIZE*15,"Esc : Exit");for(;;){while(!bioskey(1));key=bioskey(0);if (key==VK_ENTER)return FALSE; /* 按下回车键,重新开始游戏 */if (key==VK_ESC)return TRUE; /* 按下ESC键,退出游戏 */}}。
简单俄罗斯方块程序实现,只有88行代码在正式阅读本文之前,请你记得你应该用娱乐的心态来看,本代码所使用到的技巧,在工作了的人眼里会觉得很纠结,很蛋疼,很不可理喻,很丑,注意,是你蛋疼,不关我的事通常,写一个俄罗斯方块,往往动不动就几百行,甚至上千行,而这里只有88行正所谓头脑风暴,打破常规。
这里将使用很多不平常的手段来减少代码但为了能更通用,一份控制台版本的代码,同样是88行,直接复制到VC即可编译:#includechar gcText[] = " 1LJTSZ#";struct tetris {int _pool[16][32], (*pool)[32], tmap[8][4][16];int x, y, s, st, t;}gt;void trsInit() { int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802}, {39,305,114,562},{54,561},{99,306},{51,51},{-1}};int *p, i, j, b;for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];gt.pool =for (j = 0; j 0; --y) {for (x = 0; gt.pool[x][y] > 0; ++x);if (gt.pool[x][y] 0; --k)for (x = 0; gt.pool[x][0] >= 0; ++x)gt.pool[x][k] = gt.pool[x][k-1];}return1;}}trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); for (y = 1; gt.pool[0][y] >= 0; ++y,putchar(10)) {for (x = 0; gt.pool[x][0] >= 0; ++x) {putchar(gcText[gt.pool[x][y]]);}}trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 2);}}int main() {srand((unsigned)time(NULL));for (trsInit(); trsScene(); );return0; }---------------------------------------------------======================================华丽的分割线========================================以下是对代码的压缩方法进行分析首先,通常我们需要准备7种方块,4个方向的形状表,相当多的俄罗斯方块程序就是在开头写了这样一个很长的数组定义,有的光这个定义就直接超100行了,这个程序是怎么实现的呢?其实这个程序,同样是使用一个7*4*16的数组来保存这个形状表,但是,它没有直接初始化,见这个数组的定义:int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},{39,305,114,562},{54,561},{99,306},{51,51},{-1}};这个莫名其妙的数组的值是什么意思呢?其实很好猜的,我们尝试把这些数化为二进制:15 = 11114369 = 1000100010001合理地四位四位拆开,从低位到高位,从左到右,从上到下排列一下:11110000000000001000100010001000你终于发现,这就是长条方块的两个形状后面类似然后你会发现,这个数组并不完整,有的只定义了两个形状,有的是四个形状,没定义的数会默认置0的,这个怎么解释?看这个数组定义的下面第二行:for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];意思是找出这个数组为0的元素,用它前面的元素值填上即*p = p[-2]而数组中最后一个元素值-1起监督头的作用,用于让这个循环跳出虽然可以把这些常数全直接写在数组里,但常数太多显得不太好,就这样写了之后你看到这行代码:gt.pool =为什么定义两个pool呢?因为我们需要在原来的pool的界外用-1值填充,以便后面做碰撞检测减少不必要的代码但如果直接用原来的_pool,那每次访问都要加上一个偏移常数,不美观且显得代码长,就用另一个指针直接指向开始的位置然后,后面的三重循环就是解开那个位压缩数组以初始化gt.tmap数组,这个数组就是记录7*4种形状的数组再下面三行,就是初始化pool,游戏区为0,界外为-1而其中,i 0; --y)开始是消行计算你可能会奇怪这个y没有明显的初始值,直接就来一个--y,初始从哪里来?其实就在之前讲的输出绘画那个循环里,循环结束后,y的值一定是最后一行+1所以我们只要--y就得到最底下一行,因为消行计算,从下往上,只要一次就解决了,代码较少好了,现在解释之前说的,为什么不是从0,而是从1开始消行计算这里,每消除一行,最顶的一行就应该用0填充,但如果你因为这个多写一个for 循环就不值得了我们改成从1开始,那么把第0行的内容复制到第一行,就完成0填充了,就可以少写一个for好了,差不多接近尾声了,最后说说trsScene的返回值trsScene返回值的意思很简单,如果是1就继续循环,如果是0就退出所以你可以在代码里看到,当按下ESC(值为27)的时候才返回0而方块落下一个的时候,返回1,让主函数重新调用它,就能再次初始化当前控制块的位置和形状了,达到免除状态管理的代码的作用最后,在主循环除了初始化,只要华丽的一行for (trsInit(); trsScene(); ); 就可以玩这个游戏了看不懂?说明你也是个正常人看得懂?说明你已经脑殘了。
Option Explicit Option Base 0
Private blnGrid(0 To 19, 0 To 9) As Boolean '网格 Private lngColor(0 To 19, 0 To 9) As Long '网格绘制颜色 Private blnBlock(0 To 4, 0 To 3, 0 To 3, 0 To 3) As Boolean '五种方块的四种不同方位 Private blnStarted As Boolean '是否已开始玩
Dim intTypeCur As Integer '当前方块的类型 Dim lngColorCur As Long '当前方块的颜色
Dim intOrieCur As Integer '当前方块的方位 Dim intOrieNext As Integer '当前方块的下一个方位 Dim intXCur As Integer '当前方块的当前位置 Dim intYCur As Integer Dim intXNext As Integer '当前方块的下一个位置 Dim intYNext As Integer
Public intDownDistance As Integer '快速下降时的下降距离 Public blnClockWise As Boolean '方块旋转方向 Public blnShowNext As Boolean '是否显示下一个方块 Public blnScheme As Boolean '按键方案
Dim lngScore As Long '得分 Dim intTypeNew As Integer '下一个方块的类型 Dim lngColorNew As Long '下一个方块的颜色 Dim intOrieNew As Integer '下一个方块的方位 Dim lngHighScore As Long Dim blnRedraw As Boolean
Private Sub ShowBlock() '显示下落的方块 Dim i As Integer, j As Integer '去掉旧图象 For i = 0 To 3 If i + intYCur >= 0 And i + intYCur <= 19 Then '如果在大方框外,则不绘制 For j = 0 To 3 If j + intXCur >= 0 And j + intXCur <= 9 Then If (j + intXCur >= 0) And (j + intXCur <= 9) And (blnBlock(intTypeCur, intOrieCur, i, j)) And Not blnGrid(i + intYCur, j + intXCur) Then picGrid.Line ((j + intXCur) * 20 + 2, (i + intYCur) * 20 + 2)-((j + intXCur) * 20 + 19, (i + intYCur) * 20 + 19), vbBlack, B picGrid.Line ((j + intXCur) * 20 + 4, (i + intYCur) * 20 + 4)-((j + intXCur) * 20 + 17, (i + intYCur) * 20 + 17), vbWhite, BF End If End If Next End If Next '画新图象 For i = 0 To 3 If i + intYNext >= 0 And i + intYNext <= 19 Then '如果在大方框外,则不绘制 For j = 0 To 3 If (j + intXNext >= 0) And (j + intXNext <= 9) And (blnBlock(intTypeCur, intOrieNext, i, j)) Then picGrid.Line ((j + intXNext) * 20 + 2, (i + intYNext) * 20 + 2)-((j + intXNext) * 20 + 19, (i + intYNext) * 20 + 19), lngColorCur, B picGrid.Line ((j + intXNext) * 20 + 4, (i + intYNext) * 20 + 4)-((j + intXNext) * 20 + 17, (i + intYNext) * 20 + 17), lngColorCur, BF End If Next End If Next intYCur = intYNext intXCur = intXNext intOrieCur = intOrieNext End Sub
Private Sub Form_Activate() Dim i As Integer, j As Integer '绘制表格与已有的堆积方块 For i = 0 To 19 For j = 0 To 9 If blnGrid(i, j) Then picGrid.Line (j * 20 + 2, i * 20 + 2)-(j * 20 + 19, i * 20 + 19), lngColor(i, j), B picGrid.Line (j * 20 + 4, i * 20 + 4)-(j * 20 + 17, i * 20 + 17), lngColor(i, j), BF Else picGrid.Line (j * 20 + 2, i * 20 + 2)-(j * 20 + 19, i * 20 + 19), vbBlack, B picGrid.Line (j * 20 + 4, i * 20 + 4)-(j * 20 + 17, i * 20 + 17), vbWhite, BF End If Next Next '绘制“下一个”网块 For i = 0 To 3 For j = 0 To 3 picNext.Line (j * 20 + 2, i * 20 + 2)-(j * 20 + 19, i * 20 + 19), vbBlack, B Next Next
'初次启动时不显示下一个和移动方块 If blnStarted Then If blnShowNext Then For i = 0 To 3 For j = 0 To 3 If blnBlock(intTypeNew, intOrieNew, i, j) Then picNext.Line (j * 20 + 2, i * 20 + 2)-(j * 20 + 19, i * 20 + 19), lngColorNew, B picNext.Line (j * 20 + 4, i * 20 + 4)-(j * 20 + 17, i * 20 + 17), lngColorNew, BF Else picNext.Line (j * 20 + 2, i * 20 + 2)-(j * 20 + 19, i * 20 + 19), vbBlack, B picNext.Line (j * 20 + 4, i * 20 + 4)-(j * 20 + 17, i * 20 + 17), vbWhite, BF End If Next Next Else For i = 0 To 3 For j = 0 To 3 picNext.Line (j * 20 + 2, i * 20 + 2)-(j * 20 + 19, i * 20 + 19), vbBlack, B picNext.Line (j * 20 + 4, i * 20 + 4)-(j * 20 + 17, i * 20 + 17), vbWhite, BF Next Next End If
Call ShowBlock End If End Sub
Private Sub form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then If Not blnStarted Then Call lblStart_Click Exit Sub End If If Timer1.Enabled Then Timer1.Enabled = False lblstart.Caption = "继 续" Exit Sub Else Timer1.Enabled = True lblstart.Caption = "暂 停" Exit Sub End If End If If Not Timer1.Enabled Then Exit Sub If blnScheme Then Select Case KeyCode Case vbKeyLeft GoLeft Case vbKeyRight GoRight Case vbKeyUp Rotate Case vbKeyDown '加速下降 QuickDown End Select Else Select Case KeyCode Case Asc("A") GoLeft Case Asc("S") GoRight Case Asc("W") Rotate Case Asc("Z") '加速下降 QuickDown End Select End If Call ShowBlock End Sub
Private Sub Form_Unload(Cancel As Integer) Open App.Path & "\block.dat" For Output As 1 Write #1, intDownDistance, blnClockWise, blnShowNext, blnScheme, lngHighScore Close 1 End Sub