C语言俄罗斯方块游戏代码示例 - 简单易懂的实现
#include <stdio.h>\n#include <stdlib.h>\n#include <conio.h>\n#include <windows.h>\n\n#define WIDTH 10\n#define HEIGHT 20\n\nint board[HEIGHT][WIDTH] = {0};\nint currentPiece[4][4] = {0};\nint currentX = 0;\nint currentY = 0;\n\nvoid drawBoard();\nvoid drawPiece();\nvoid clearPiece();\nvoid rotatePiece();\nint checkCollision(int newX, int newY, int newPiece[4][4]);\n\nint main() {\n int gameOver = 0;\n int key = 0;\n\n // 设置控制台窗口大小\n HWND console = GetConsoleWindow();\n RECT r;\n GetClientRect(console, &r);\n MoveWindow(console, r.left, r.top, 400, 600, TRUE);\n\n // 游戏循环\n while (!gameOver) {\n // 处理键盘输入\n if (_kbhit()) {\n key = _getch();\n switch (key) {\n case 'a':\n if (!checkCollision(currentX - 1, currentY, currentPiece)) {\n currentX--;\n }\n break;\n case 'd':\n if (!checkCollision(currentX + 1, currentY, currentPiece)) {\n currentX++;\n }\n break;\n case 's':\n if (!checkCollision(currentX, currentY + 1, currentPiece)) {\n currentY++;\n }\n break;\n case 'w':\n rotatePiece();\n break;\n case 'q':\n gameOver = 1;\n break;\n }\n }\n\n // 清除当前方块\n clearPiece();\n\n // 更新方块位置\n if (!checkCollision(currentX, currentY + 1, currentPiece)) {\n currentY++;\n } else {\n // 固定方块到游戏板上\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n if (currentPiece[i][j] != 0) {\n board[currentY + i][currentX + j] = 1;\n }\n }\n }\n\n // 消除满行\n for (int i = HEIGHT - 1; i >= 0; i--) {\n int rowFull = 1;\n for (int j = 0; j < WIDTH; j++) {\n if (board[i][j] == 0) {\n rowFull = 0;\n break;\n }\n }\n if (rowFull) {\n for (int k = i; k > 0; k--) {\n for (int j = 0; j < WIDTH; j++) {\n board[k][j] = board[k - 1][j];\n }\n }\n i++;\n }\n }\n\n // 生成新的方块\n currentX = WIDTH / 2 - 2;\n currentY = 0;\n int pieceIndex = rand() % 7;\n int pieces[7][4][4] = {\n {{0,0,0,0},\n {1,1,1,1},\n {0,0,0,0},\n {0,0,0,0}},\n\n {{0,0,0,0},\n {0,1,1,0},\n {0,1,1,0},\n {0,0,0,0}},\n\n {{0,0,0,0},\n {1,1,0,0},\n {0,1,1,0},\n {0,0,0,0}},\n\n {{0,0,0,0},\n {0,0,1,1},\n {0,1,1,0},\n {0,0,0,0}},\n\n {{0,0,0,0},\n {0,1,1,0},\n {0,0,1,1},\n {0,0,0,0}},\n\n {{0,0,0,0},\n {0,1,0,0},\n {1,1,1,0},\n {0,0,0,0}},\n\n {{0,0,0,0},\n {0,0,1,0},\n {1,1,1,0},\n {0,0,0,0}}\n };\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n currentPiece[i][j] = pieces[pieceIndex][i][j];\n }\n }\n\n // 检查游戏结束\n if (checkCollision(currentX, currentY, currentPiece)) {\n gameOver = 1;\n }\n }\n\n // 绘制游戏界面\n drawBoard();\n drawPiece();\n\n // 控制帧率\n Sleep(100);\n }\n\n printf("Game Over!\n");\n return 0;\n}\n\nvoid drawBoard() {\n system("cls");\n\n for (int i = 0; i < HEIGHT; i++) {\n for (int j = 0; j < WIDTH; j++) {\n if (board[i][j] == 1) {\n printf("*");\n } else {\n printf(" ");\n }\n }\n printf("\n");\n }\n}\n\nvoid drawPiece() {\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n if (currentPiece[i][j] != 0) {\n board[currentY + i][currentX + j] = 1;\n }\n }\n }\n}\n\nvoid clearPiece() {\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n if (currentPiece[i][j] != 0) {\n board[currentY + i][currentX + j] = 0;\n }\n }\n }\n}\n\nvoid rotatePiece() {\n int tempPiece[4][4] = {0};\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n tempPiece[i][j] = currentPiece[i][j];\n }\n }\n\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n currentPiece[i][j] = tempPiece[3 - j][i];\n }\n }\n\n if (checkCollision(currentX, currentY, currentPiece)) {\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n currentPiece[i][j] = tempPiece[i][j];\n }\n }\n }\n}\n\nint checkCollision(int newX, int newY, int newPiece[4][4]) {\n for (int i = 0; i < 4; i++) {\n for (int j = 0; j < 4; j++) {\n if (newPiece[i][j] != 0) {\n if (newY + i >= HEIGHT || newX + j < 0 || newX + j >= WIDTH || board[newY + i][newX + j] == 1) {\n return 1;\n }\n }\n }\n }\n return 0;\n
原文地址: https://www.cveoy.top/t/topic/pHXX 著作权归作者所有。请勿转载和采集!