200行到300行C语言游戏代码
时间: 2023-08-18 11:38:46 浏览: 48
以下是一个简单的2048游戏的C语言代码,共计约300行:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 4
#define COLS 4
int score = 0; // 记录分数
void init_board(int board[][COLS]) { // 初始化棋盘
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
board[i][j] = 0;
}
}
srand((unsigned int)time(NULL)); // 设置随机数种子
int rand_row1 = rand() % ROWS; // 生成两个随机位置
int rand_col1 = rand() % COLS;
int rand_row2, rand_col2;
do {
rand_row2 = rand() % ROWS;
rand_col2 = rand() % COLS;
} while (rand_row1 == rand_row2 && rand_col1 == rand_col2); // 避免两个随机位置重复
board[rand_row1][rand_col1] = board[rand_row2][rand_col2] = 2; // 在两个随机位置上设置初始值
}
void print_board(int board[][COLS]) { // 打印棋盘
int i, j;
printf("Score: %d\n", score);
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%5d", board[i][j]);
}
printf("\n");
}
}
int is_full(int board[][COLS]) { // 判断棋盘是否已满
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (board[i][j] == 0) {
return 0; // 棋盘未满
}
}
}
return 1; // 棋盘已满
}
int move_left(int board[][COLS]) { // 向左移动
int i, j, k, moved = 0;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS - 1; j++) {
if (board[i][j] == 0) {
for (k = j + 1; k < COLS; k++) {
if (board[i][k] != 0) {
board[i][j] = board[i][k];
board[i][k] = 0;
moved = 1; // 标记有移动
break;
}
}
} else {
for (k = j + 1; k < COLS; k++) {
if (board[i][k] != 0) {
if (board[i][j] == board[i][k]) {
board[i][j] *= 2;
board[i][k] = 0;
score += board[i][j]; // 加分
moved = 1; // 标记有移动
}
break;
}
}
}
}
}
return moved; // 返回是否有移动
}
int move_right(int board[][COLS]) { // 向右移动
int i, j, k, moved = 0;
for (i = 0; i < ROWS; i++) {
for (j = COLS - 1; j > 0; j--) {
if (board[i][j] == 0) {
for (k = j - 1; k >= 0; k--) {
if (board[i][k] != 0) {
board[i][j] = board[i][k];
board[i][k] = 0;
moved = 1; // 标记有移动
break;
}
}
} else {
for (k = j - 1; k >= 0; k--) {
if (board[i][k] != 0) {
if (board[i][j] == board[i][k]) {
board[i][j] *= 2;
board[i][k] = 0;
score += board[i][j]; // 加分
moved = 1; // 标记有移动
}
break;
}
}
}
}
}
return moved; // 返回是否有移动
}
int move_up(int board[][COLS]) { // 向上移动
int i, j, k, moved = 0;
for (j = 0; j < COLS; j++) {
for (i = 0; i < ROWS - 1; i++) {
if (board[i][j] == 0) {
for (k = i + 1; k < ROWS; k++) {
if (board[k][j] != 0) {
board[i][j] = board[k][j];
board[k][j] = 0;
moved = 1; // 标记有移动
break;
}
}
} else {
for (k = i + 1; k < ROWS; k++) {
if (board[k][j] != 0) {
if (board[i][j] == board[k][j]) {
board[i][j] *= 2;
board[k][j] = 0;
score += board[i][j]; // 加分
moved = 1; // 标记有移动
}
break;
}
}
}
}
}
return moved; // 返回是否有移动
}
int move_down(int board[][COLS]) { // 向下移动
int i, j, k, moved = 0;
for (j = 0; j < COLS; j++) {
for (i = ROWS - 1; i > 0; i--) {
if (board[i][j] == 0) {
for (k = i - 1; k >= 0; k--) {
if (board[k][j] != 0) {
board[i][j] = board[k][j];
board[k][j] = 0;
moved = 1; // 标记有移动
break;
}
}
} else {
for (k = i - 1; k >= 0; k--) {
if (board[k][j] != 0) {
if (board[i][j] == board[k][j]) {
board[i][j] *= 2;
board[k][j] = 0;
score += board[i][j]; // 加分
moved = 1; // 标记有移动
}
break;
}
}
}
}
}
return moved; // 返回是否有移动
}
int is_game_over(int board[][COLS]) { // 判断游戏是否结束
int i, j, flag = 1;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (board[i][j] == 0 || (i > 0 && board[i][j] == board[i - 1][j]) || (i < ROWS - 1 && board[i][j] == board[i + 1][j]) || (j > 0 && board[i][j] == board[i][j - 1]) || (j < COLS - 1 && board[i][j] == board[i][j + 1])) {
flag = 0; // 只要有一个空位或相邻两个格子值相同,就不算游戏结束
}
}
}
return flag; // 如果所有格子都不符合条件,就算游戏结束
}
int main() {
int board[ROWS][COLS];
init_board(board);
while (1) {
system("cls"); // 清屏
print_board(board);
if (is_game_over(board)) {
printf("Game over!\n");
break;
}
if (is_full(board)) {
printf("Full board, no more moves!\n");
break;
}
char ch = getchar();
while (ch != 'a' && ch != 'd' && ch != 'w' && ch != 's') {
ch = getchar();
}
int moved = 0;
switch (ch) {
case 'a':
moved = move_left(board);
break;
case 'd':
moved = move_right(board);
break;
case 'w':
moved = move_up(board);
break;
case 's':
moved = move_down(board);
break;
}
if (moved) { // 如果有移动,就在空位上生成一个2或4
int i, j;
do {
i = rand() % ROWS;
j = rand() % COLS;
} while (board[i][j] != 0);
board[i][j] = (rand() % 2 + 1) * 2;
}
}
return 0;
}
```
这个代码实现了2048游戏的核心功能,包括初始化棋盘、打印棋盘、判断棋盘是否已满、向左/右/上/下移动、判断游戏是否结束等。你可以根据这个代码进行改进和扩展,实现更多的游戏功能。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)