C语言 Linux版俄罗斯方块,C语言版俄罗斯方块源代码
《C語言版俄羅斯方塊源代碼》由會員分享,可在線閱讀,更多相關《C語言版俄羅斯方塊源代碼(22頁珍藏版)》請在人人文庫網上搜索。
1、include #include #include / 定義常量、枚舉量、結構體、全局變量/#define WIDTH 10 / 游戲區寬度#define HEIGHT 22 / 游戲區高度#define SIZE 20 / 每個游戲區單位的實際像素/ 定義操作類型enum CMDCMD_ROTATE, / 方塊旋轉CMD_LEFT, CMD_RIGHT, CMD_DOWN, / 方塊左、右、下移動CMD_SINK, / 方塊沉底CMD_QUIT / 退出游戲;/ 定義繪制方塊的方法enum DRAWSHOW, / 顯示方塊HIDE, / 隱藏方塊FIX / 固定方塊;/ 定義七種俄羅斯方塊s。
2、truct BLOCKWORD dir4; / 方塊的四個旋轉狀態COLORREF color; / 方塊的顏色 g_Blocks7 = 0x0F00, 0x4444, 0x0F00, 0x4444, RED, / I0x0660, 0x0660, 0x0660, 0x0660, BLUE, / 口0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA, / L0x2260, 0x0E20, 0x0644, 0x0470, YELLOW, / 反L0x0C60, 0x2640, 0x0C60, 0x2640, CYAN, / Z0x0360, 0x4620, 0x036。
3、0, 0x4620, GREEN, / 反Z0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN; / T/ 定義當前方塊、下一個方塊的信息struct BLOCKINFObyte id; / 方塊 IDchar x, y; / 方塊在游戲區中的坐標byte dir:2; / 方向 g_CurBlock, g_NextBlock;/ 定義游戲區BYTE g_WorldWIDTHHEIGHT = 0;/ 函數聲明void Init(); / 初始化游戲void Quit(); / 退出游戲void NewGame(); / 開始新游戲void GameOver(); / 結。
4、束游戲CMD GetCmd(); / 獲取控制命令void DispatchCmd(CMD _cmd); / 分發控制命令void NewBlock(); / 生成新的方塊bool CheckBlock(BLOCKINFO _block); / 檢測指定方塊是否可以放下void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW); / 畫方塊void OnRotate(); / 旋轉方塊void OnLeft(); / 左移方塊void OnRight(); / 右移方塊void OnDown(); / 下移方塊void OnSink(); / 沉底方。
5、塊/ 函數定義/ 主函數void main()Init();CMD c;while(true)c = GetCmd();DispatchCmd(c);/ 按退出時,顯示對話框咨詢用戶是否退出if (c = CMD_QUIT)HWND wnd = GetHWnd();if (MessageBox(wnd, _T(您要退出游戲嗎?), _T(提醒), MB_OKCANCEL | MB_ICONQUESTION) = IDOK)Quit();/ 初始化游戲void Init()initgraph(640, 480);srand(unsigned)time(NULL);/ 顯示操作說明setfont(。
6、14, 0, _T(宋體);outtextxy(20, 330, _T(操作說明);outtextxy(20, 350, _T(上:旋轉);outtextxy(20, 370, _T(左:左移);outtextxy(20, 390, _T(右:右移);outtextxy(20, 410, _T(下:下移);outtextxy(20, 430, _T(空格:沉底);outtextxy(20, 450, _T(ESC:退出);/ 設置坐標原點setorigin(220, 20);/ 繪制游戲區邊界rectangle(-1, -1, WIDTH * SIZE, HEIGHT * SIZE);rect。
7、angle(WIDTH + 1) * SIZE - 1, -1, (WIDTH + 5) * SIZE, 4 * SIZE);/ 開始新游戲NewGame();/ 退出游戲void Quit()closegraph();exit(0);/ 開始新游戲void NewGame()/ 清空游戲區setfillstyle(BLACK);bar(0, 0, WIDTH * SIZE - 1, HEIGHT * SIZE - 1);ZeroMemory(g_World, WIDTH * HEIGHT);/ 生成下一個方塊g_NextBlock.id = rand() % 7;g_NextBlock.di。
8、r = rand() % 4;g_NextBlock.x = WIDTH + 1;g_NextBlock.y = HEIGHT - 1;/ 獲取新方塊NewBlock();/ 結束游戲void GameOver()HWND wnd = GetHWnd();if (MessageBox(wnd, _T(游戲結束。n您想重新來一局嗎?), _T(游戲結束), MB_YESNO | MB_ICONQUESTION) = IDYES)NewGame();elseQuit();/ 獲取控制命令DWORD m_oldtime;CMD GetCmd()/ 獲取控制值while(true)/ 如果超時,自動下。
9、落一格DWORD newtime = GetTickCount();if (newtime - m_oldtime = 500)m_oldtime = newtime;return CMD_DOWN;/ 如果有按鍵,返回按鍵對應的功能if (kbhit()switch(getch()case w:case W: return CMD_ROTATE;case a:case A: return CMD_LEFT;case d:case D: return CMD_RIGHT;case s:case S: return CMD_DOWN;case 27: return CMD_QUIT;case :。
10、 return CMD_SINK;case 0:case 0xE0:switch(getch()case 72: return CMD_ROTATE;case 75: return CMD_LEFT;case 77: return CMD_RIGHT;case 80: return CMD_DOWN;/ 延時 (降低 CPU 占用率)Sleep(20);/ 分發控制命令void DispatchCmd(CMD _cmd)switch(_cmd)case CMD_ROTATE: OnRotate(); break;case CMD_LEFT: OnLeft(); break;case CMD_R。
11、IGHT: OnRight(); break;case CMD_DOWN: OnDown(); break;case CMD_SINK: OnSink(); break;case CMD_QUIT: break;/ 生成新的方塊void NewBlock()g_CurBlock.id = g_NextBlock.id, g_NextBlock.id = rand() % 7;g_CurBlock.dir = g_NextBlock.dir, g_NextBlock.dir = rand() % 4;g_CurBlock.x = (WIDTH - 4) / 2;g_CurBlock.y = HE。
12、IGHT + 2;/ 下移新方塊直到有局部顯示WORD c = g_Blocksg_CurBlock.id.dirg_CurBlock.dir;while(c & 0xF) = 0)g_CurBlock.y-;c = 4;/ 繪制新方塊DrawBlock(g_CurBlock);/ 繪制下一個方塊setfillstyle(BLACK);bar(WIDTH + 1) * SIZE, 0, (WIDTH + 5) * SIZE - 1, 4 * SIZE - 1);DrawBlock(g_NextBlock);/ 設置計時器,用于判斷自動下落m_oldtime = GetTickCount();/。
13、 畫方塊void DrawBlock(BLOCKINFO _block, DRAW _draw)WORD b = g_Blocks_block.id.dir_block.dir;int x, y;int color = BLACK;switch(_draw)case SHOW: color = g_Blocks_block.id.color; break;case HIDE: color = BLACK; break;case FIX: color = g_Blocks_block.id.color / 3; break;setfillstyle(color);for(int i=0; i= 。
14、WIDTH) | (y = HEIGHT) / 如果方塊的固定位置超出高度,結束游戲GameOver();return;elseg_Worldg_CurBlock.x + i % 4g_CurBlock.y - i / 4 = 1;b = max(g_CurBlock.y - 3, 0); y-)i = 0;for(x = 0; x WIDTH; x+)if (g_Worldxy = 1)i+;if (i = WIDTH)bRow = true;rowg_CurBlock.y - y = 1;setfillstyle(WHITE, DIAGCROSS2_FILL);bar(0, (HEIGHT。
15、 - y - 1) * SIZE + SIZE / 2 - 2, WIDTH * SIZE - 1, (HEIGHT - y - 1) * SIZE + SIZE / 2 + 2);if (bRow)/ 延時 200 毫秒Sleep(200);/ 擦掉剛才標記的行IMAGE img;for(i = 0; i 4; i+)if (rowi)for(y = g_CurBlock.y - i + 1; y HEIGHT; y+)for(x = 0; x WIDTH; x+)g_Worldxy - 1 = g_Worldxy;g_Worldxy = 0;getimage(&img, 0, 0, WIDTH * SIZE, (HEIGHT - (g_CurBlock.y - i + 1) * SIZE);putimage(0, SIZE, &img);/ 產生新方塊NewBlock(。
總結
以上是生活随笔為你收集整理的C语言 Linux版俄罗斯方块,C语言版俄罗斯方块源代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse源服务器未能找到,ecli
- 下一篇: error 1307 (HY000):F