写c语言俄罗斯方块小游戏
下面是一个简单的C语言俄罗斯方块小游戏的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 10
#define HEIGHT 20
int board[HEIGHT][WIDTH] = {0};
int currentPiece[4][4] = {0};
int currentX = 0;
int currentY = 0;
void drawBoard();
void drawPiece();
void clearPiece();
void rotatePiece();
int checkCollision(int newX, int newY, int newPiece[4][4]);
int main() {
int gameOver = 0;
int key = 0;
// 设置控制台窗口大小
HWND console = GetConsoleWindow();
RECT r;
GetClientRect(console, &r);
MoveWindow(console, r.left, r.top, 400, 600, TRUE);
// 游戏循环
while (!gameOver) {
// 处理键盘输入
if (_kbhit()) {
key = _getch();
switch (key) {
case 'a':
if (!checkCollision(currentX - 1, currentY, currentPiece)) {
currentX--;
}
break;
case 'd':
if (!checkCollision(currentX + 1, currentY, currentPiece)) {
currentX++;
}
break;
case 's':
if (!checkCollision(currentX, currentY + 1, currentPiece)) {
currentY++;
}
break;
case 'w':
rotatePiece();
break;
case 'q':
gameOver = 1;
break;
}
}
// 清除当前方块
clearPiece();
// 更新方块位置
if (!checkCollision(currentX, currentY + 1, currentPiece)) {
currentY++;
} else {
// 固定方块到游戏板上
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (currentPiece[i][j] != 0) {
board[currentY + i][currentX + j] = 1;
}
}
}
// 消除满行
for (int i = HEIGHT - 1; i >= 0; i--) {
int rowFull = 1;
for (int j = 0; j < WIDTH; j++) {
if (board[i][j] == 0) {
rowFull = 0;
break;
}
}
if (rowFull) {
for (int k = i; k > 0; k--) {
for (int j = 0; j < WIDTH; j++) {
board[k][j] = board[k - 1][j];
}
}
i++;
}
}
// 生成新的方块
currentX = WIDTH / 2 - 2;
currentY = 0;
int pieceIndex = rand() % 7;
int pieces[7][4][4] = {
{{0,0,0,0},
{1,1,1,1},
{0,0,0,0},
{0,0,0,0}},
{{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,0,0,0},
{1,1,0,0},
{0,1,1,0},
{0,0,0,0}},
{{0,0,0,0},
{0,0,1,1},
{0,1,1,0},
{0,0,0,0}},
{{0,0,0,0},
{0,1,1,0},
{0,0,1,1},
{0,0,0,0}},
{{0,0,0,0},
{0,1,0,0},
{1,1,1,0},
{0,0,0,0}},
{{0,0,0,0},
{0,0,1,0},
{1,1,1,0},
{0,0,0,0}}
};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
currentPiece[i][j] = pieces[pieceIndex][i][j];
}
}
// 检查游戏结束
if (checkCollision(currentX, currentY, currentPiece)) {
gameOver = 1;
}
}
// 绘制游戏界面
drawBoard();
drawPiece();
// 控制帧率
Sleep(100);
}
printf("Game Over!\n");
return 0;
}
void drawBoard() {
system("cls");
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (board[i][j] == 1) {
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
}
void drawPiece() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (currentPiece[i][j] != 0) {
board[currentY + i][currentX + j] = 1;
}
}
}
}
void clearPiece() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (currentPiece[i][j] != 0) {
board[currentY + i][currentX + j] = 0;
}
}
}
}
void rotatePiece() {
int tempPiece[4][4] = {0};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
tempPiece[i][j] = currentPiece[i][j];
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
currentPiece[i][j] = tempPiece[3 - j][i];
}
}
if (checkCollision(currentX, currentY, currentPiece)) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
currentPiece[i][j] = tempPiece[i][j];
}
}
}
}
int checkCollision(int newX, int newY, int newPiece[4][4]) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (newPiece[i][j] != 0) {
if (newY + i >= HEIGHT || newX + j < 0 || newX + j >= WIDTH || board[newY + i][newX + j] == 1) {
return 1;
}
}
}
}
return 0;
}
这个示例代码使用了Windows系统的conio.h和windows.h头文件来实现控制台窗口和键盘输入的功能。在游戏循环中,根据键盘输入移动和旋转方块,并根据方块的位置判断是否发生碰撞。游戏结束时,输出"Game Over!"并结束程序的运行。
请注意,这只是一个简单的示例代码,并没有实现游戏的所有功能和特性。你可以根据自己的需求对代码进行修改和扩展
原文地址: https://www.cveoy.top/t/topic/hYQH 著作权归作者所有。请勿转载和采集!