写一个简单的俄罗斯方块代码用c语言写
以下是一个简单的俄罗斯方块的代码示例:
#include <stdio.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;
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,1,0},
{0,0,1,0},
{0,0,0,0} },
{ {0,0,0,0},
{1,1,1,0},
{1,0,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},
{0,1,1,0},
{1,1,0,0},
{0,0,0,0} },
{ {0,0,0,0},
{0,0,1,0},
{1,1,1,0},
{0,0,0,0} }
};
void drawBoard() {
int i, j;
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
if (board[i][j] == 0) {
printf(" ");
}
else {
printf("■");
}
}
printf("\n");
}
}
int checkCollision() {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (currentPiece[i][j] && (currentX + j >= WIDTH || currentX + j < 0 || currentY + i >= HEIGHT || board[currentY + i][currentX + j])) {
return 1;
}
}
}
return 0;
}
void mergePiece() {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (currentPiece[i][j]) {
board[currentY + i][currentX + j] = 1;
}
}
}
}
void rotatePiece() {
int tempPiece[4][4];
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
tempPiece[i][j] = currentPiece[i][j];
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
currentPiece[i][j] = tempPiece[3 - j][i];
}
}
}
void clearLines() {
int i, j;
for (i = HEIGHT - 1; i >= 0; i--) {
int lineFull = 1;
for (j = 0; j < WIDTH; j++) {
if (board[i][j] == 0) {
lineFull = 0;
break;
}
}
if (lineFull) {
int k;
for (k = i; k > 0; k--) {
for (j = 0; j < WIDTH; j++) {
board[k][j] = board[k - 1][j];
}
}
for (j = 0; j < WIDTH; j++) {
board[0][j] = 0;
}
}
}
}
void newPiece() {
int randomPiece = rand() % 7;
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
currentPiece[i][j] = pieces[randomPiece][i][j];
}
}
currentX = WIDTH / 2 - 2;
currentY = 0;
}
int main() {
int gameOver = 0;
int i, j;
srand(time(NULL));
newPiece();
while (!gameOver) {
system("cls");
if (_kbhit()) {
char key = _getch();
switch (key) {
case 'a':
currentX--;
if (checkCollision()) {
currentX++;
}
break;
case 'd':
currentX++;
if (checkCollision()) {
currentX--;
}
break;
case 's':
currentY++;
if (checkCollision()) {
currentY--;
mergePiece();
clearLines();
newPiece();
if (checkCollision()) {
gameOver = 1;
}
}
break;
case 'w':
rotatePiece();
if (checkCollision()) {
rotatePiece();
rotatePiece();
rotatePiece();
}
break;
case 'q':
gameOver = 1;
break;
}
}
if (!checkCollision()) {
currentY++;
}
else {
currentY--;
mergePiece();
clearLines();
newPiece();
if (checkCollision()) {
gameOver = 1;
}
}
drawBoard();
Sleep(500);
}
printf("Game Over!\n");
return 0;
}
在这个代码中,使用了一个二维数组来表示俄罗斯方块的游戏板,每个方块用1表示,空白处用0表示。drawBoard()函数用于绘制游戏板。checkCollision()函数用于检查当前方块是否与游戏板或边界发生碰撞。mergePiece()函数用于将当前方块合并到游戏板上。rotatePiece()函数用于旋转当前方块。clearLines()函数用于消除满行。newPiece()函数用于生成新的方块。
在主函数main()中,使用_kbhit()和_getch()函数来获取玩家的键盘输入,根据输入移动方块或旋转方块。如果方块无法继续下落,将其合并到游戏板上并检查是否有满行需要消除,然后生成新的方块。如果新的方块无法放置在初始位置,则游戏结束
原文地址: http://www.cveoy.top/t/topic/ib7h 著作权归作者所有。请勿转载和采集!