小游戏c语言编程代码100行
时间: 2023-08-01 17:06:15 浏览: 507
以下是一个简单的俄罗斯方块小游戏的 C 语言代码,共计约 100 行:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 10 // 游戏区域宽度
#define HEIGHT 20 // 游戏区域高度
// 方块类型
const int shapes[7][4][4] = {
{ {0,0,0,0}, {0,1,1,0}, {0,1,1,0}, {0,0,0,0} }, // O
{ {0,0,0,0}, {0,0,1,0}, {0,1,1,1}, {0,0,0,0} }, // L
{ {0,0,0,0}, {0,1,1,1}, {0,0,1,0}, {0,0,0,0} }, // J
{ {0,0,0,0}, {0,0,1,1}, {0,1,1,0}, {0,0,0,0} }, // Z
{ {0,0,0,0}, {0,1,1,0}, {0,0,1,1}, {0,0,0,0} }, // S
{ {0,0,0,0}, {0,1,1,1}, {0,0,1,0}, {0,0,0,0} }, // T
{ {0,0,0,0}, {0,0,0,0}, {0,1,1,1}, {0,0,1,0} } // I
};
// 游戏区域
int board[HEIGHT][WIDTH];
// 当前方块的位置和类型
int block_x, block_y, block_type;
// 下一个方块的类型
int next_type;
// 分数
int score;
// 初始化游戏区域
void init_board() {
int i, j;
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
board[i][j] = 0;
}
}
}
// 生成下一个方块
void generate_block() {
block_x = WIDTH / 2 - 1;
block_y = 0;
block_type = next_type;
next_type = rand() % 7;
}
// 检查当前方块是否合法
int check_block(int x, int y, int type) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (shapes[type][i][j] != 0) {
if (x + j < 0 || x + j >= WIDTH || y + i >= HEIGHT || (y + i >= 0 && board[y + i][x + j] != 0)) {
return 0;
}
}
}
}
return 1;
}
// 绘制游戏区域和下一个方块
void draw_board() {
int i, j, k;
system("cls"); // 清屏
printf("Score: %d\n", score);
printf("Next block:\n");
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (shapes[next_type][i][j] != 0) {
printf("[]");
} else {
printf(" ");
}
}
printf("\n");
}
printf("Game board:\n");
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
if (board[i][j] != 0) {
printf("[]");
} else {
printf(" ");
}
}
printf("\n");
}
}
// 绘制当前方块
void draw_block(int x, int y, int type) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (shapes[type][i][j] != 0) {
if (y + i >= 0) {
board[y + i][x + j] = type + 1;
}
}
}
}
}
// 消除满行
void clear_lines() {
int i, j, k, count;
for (i = HEIGHT - 1; i >= 0; i--) {
count = 0;
for (j = 0; j < WIDTH; j++) {
if (board[i][j] != 0) {
count++;
}
}
if (count == WIDTH) {
score += 10;
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;
}
i++; // 重新检查当前行
}
}
}
int main() {
int i, j, k;
char c;
srand(time(NULL)); // 随机数种子
init_board(); // 初始化游戏区域
next_type = rand() % 7; // 生成下一个方块
while (1) {
generate_block(); // 生成当前方块
if (!check_block(block_x, block_y, block_type)) { // 如果当前方块无法放置,游戏结束
printf("Game over! Your score is: %d\n", score);
break;
}
while (1) {
draw_board(); // 绘制游戏区域和下一个方块
draw_block(block_x, block_y, block_type); // 绘制当前方块
Sleep(500); // 暂停500ms
if (_kbhit()) { // 检测键盘输入
c = _getch();
if (c == 'a' && check_block(block_x - 1, block_y, block_type)) { // 向左移动
block_x--;
} else if (c == 'd' && check_block(block_x + 1, block_y, block_type)) { // 向右移动
block_x++;
} else if (c == 's' && check_block(block_x, block_y + 1, block_type)) { // 向下移动
block_y++;
} else if (c == 'w') { // 旋转
int old_type = block_type;
block_type = (block_type + 1) % 4;
if (!check_block(block_x, block_y, block_type)) {
block_type = old_type;
}
} else if (c == ' ') { // 直接落下
while (check_block(block_x, block_y + 1, block_type)) {
block_y++;
}
}
}
if (!check_block(block_x, block_y + 1, block_type)) { // 如果当前方块无法继续向下移动,固定方块并检查是否有满行
draw_block(block_x, block_y, block_type);
clear_lines();
break; // 生成下一个方块
}
for (i = 0; i < HEIGHT; i++) { // 清除当前方块
for (j = 0; j < WIDTH; j++) {
if (board[i][j] > 0) {
board[i][j] = board[i][j] - 1;
}
}
}
block_y++; // 向下移动当前方块
}
}
return 0;
}
```
这个小游戏的规则是:玩家需要控制不断下落的俄罗斯方块,让它们在游戏区域中堆叠起来。当一行被填满时,该行将被消除并得分。如果堆叠到的方块超出了游戏区域,游戏结束。玩家可以使用键盘上的方向键来控制方块的移动和旋转。
代码中使用了 Windows API 中的 Sleep 函数和 conio.h 库中的 _kbhit 和 _getch 函数来实现暂停和键盘输入检测。
阅读全文