用C++编写一段代码,实现俄罗斯方块游戏
时间: 2023-03-28 13:01:43 浏览: 59
很高兴回答你的问题。以下是用 C 语言编写的俄罗斯方块游戏的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 10
#define HEIGHT 20
int board[HEIGHT][WIDTH] = {};
int block[4][4] = {};
int blockType, blockRotation;
int blockX = 4, blockY = ;
int score = ;
void initBlock() {
int blocks[7][4][4] = {
{{,,,},
{1,1,1,1},
{,,,},
{,,,}},
{{,,,},
{,2,2,},
{,2,2,},
{,,,}},
{{,,,},
{,3,3,},
{3,3,,},
{,,,}},
{{,,,},
{,4,4,},
{,,4,4},
{,,,}},
{{,,,},
{,5,,},
{5,5,5,},
{,,,}},
{{,,,},
{,6,,},
{,6,6,},
{,,6,}},
{{,,,},
{,,7,},
{,7,7,7},
{,,,}}
};
blockType = rand() % 7;
blockRotation = rand() % 4;
for (int i = ; i < 4; i++) {
for (int j = ; j < 4; j++) {
block[i][j] = blocks[blockType][i][j];
}
}
}
void drawBlock(int x, int y, int rotation, int type) {
int temp[4][4] = {};
for (int i = ; i < 4; i++) {
for (int j = ; j < 4; j++) {
switch (rotation) {
case :
temp[i][j] = block[i][j];
break;
case 1:
temp[i][j] = block[3-j][i];
break;
case 2:
temp[i][j] = block[3-i][3-j];
break;
case 3:
temp[i][j] = block[j][3-i];
break;
}
}
}
for (int i = ; i < 4; i++) {
for (int j = ; j < 4; j++) {
if (temp[i][j] != ) {
board[y+i][x+j] = type;
}
}
}
}
void drawBoard() {
system("cls");
for (int i = ; i < HEIGHT; i++) {
for (int j = ; j < WIDTH; j++) {
if (board[i][j] == ) {
printf(" ");
} else if (board[i][j] == 8) {
printf("=");
} else {
printf("*");
}
}
printf("\n");
}
printf("Score: %d\n", score);
}
int checkCollision(int x, int y, int rotation) {
int temp[4][4] = {};
for (int i = ; i < 4; i++) {
for (int j = ; j < 4; j++) {
switch (rotation) {
case :
temp[i][j] = block[i][j];
break;
case 1:
temp[i][j] = block[3-j][i];
break;
case 2:
temp[i][j] = block[3-i][3-j];
break;
case 3:
temp[i][j] = block[j][3-i];
break;
}
}
}
for (int i = ; i < 4; i++) {
for (int j = ; j < 4; j++) {
if (temp[i][j] != && board[y+i][x+j] != ) {
return 1;
}
}
}
return ;
}
void clearLines() {
for (int i = HEIGHT-1; i >= ; i--) {
int full = 1;
for (int j = ; j < WIDTH; j++) {
if (board[i][j] == ) {
full = ;
break;
}
}
if (full) {
for (int j = i; j > ; j--) {
for (int k = ; k < WIDTH; k++) {
board[j][k] = board[j-1][k];
}
}
score += 10;
i++;
}
}
}
int main() {
srand(time(NULL));
initBlock();
while (1) {
drawBoard();
if (checkCollision(blockX, blockY+1, blockRotation)) {
drawBlock(blockX, blockY, blockRotation, 8);
clearLines();
blockX = 4;
blockY = ;
blockRotation = rand() % 4;
blockType = rand() % 7;
initBlock();
if (checkCollision(blockX, blockY, blockRotation)) {
break;
}
} else {
drawBlock(blockX, blockY, blockRotation, blockType+1);
Sleep(100);
drawBlock(blockX, blockY, blockRotation, );
blockY++;
}
if (_kbhit()) {
int key = _getch();
if (key == 'a' && !checkCollision(blockX-1, blockY, blockRotation)) {
blockX--;
}
if (key == 'd' && !checkCollision(blockX+1, blockY, blockRotation)) {
blockX++;
}
if (key == 'w') {
int newRotation = (blockRotation + 1) % 4;
if (!checkCollision(blockX, blockY, newRotation)) {
blockRotation = newRotation;
}
}
if (key == 's') {
while (!checkCollision(blockX, blockY+1, blockRotation)) {
blockY++;
}
}
}
}
drawBoard();
printf("Game over!\n");
printf("Your score is: %d\n", score);
return ;
}