c语言链表祖玛游戏代码
时间: 2023-10-13 11:15:20 浏览: 54
下面是一个简单的 C 语言链表祖玛游戏的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 5
#define COL 6
#define COLOR_NUM 3
typedef struct ball {
int color;
struct ball *next;
} Ball;
void init_board(int board[ROW][COL]) {
int i, j;
srand(time(NULL));
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
board[i][j] = rand() % COLOR_NUM;
}
}
}
void print_board(int board[ROW][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
Ball *create_ball(int color) {
Ball *ball = (Ball *)malloc(sizeof(Ball));
ball->color = color;
ball->next = NULL;
return ball;
}
void add_ball(Ball **head, int color) {
Ball *ball = create_ball(color);
if (*head == NULL) {
*head = ball;
} else {
Ball *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = ball;
}
}
void init_balls(Ball **head, int board[ROW][COL], int row, int col) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (i == row && j == col) {
continue;
}
add_ball(head, board[i][j]);
}
}
}
void print_balls(Ball *head) {
while (head != NULL) {
printf("%d ", head->color);
head = head->next;
}
printf("\n");
}
Ball *remove_balls(int board[ROW][COL], int row, int col) {
Ball *head = NULL;
int color = board[row][col];
int i, j;
// check left
for (i = col - 1; i >= 0; i--) {
if (board[row][i] != color) {
break;
}
}
if (col - i >= 3) {
for (j = i + 1; j <= col; j++) {
init_balls(&head, board, row, j);
board[row][j] = -1;
}
}
// check right
for (i = col + 1; i < COL; i++) {
if (board[row][i] != color) {
break;
}
}
if (i - col >= 3) {
for (j = col; j < i; j++) {
init_balls(&head, board, row, j);
board[row][j] = -1;
}
}
// check up
for (i = row - 1; i >= 0; i--) {
if (board[i][col] != color) {
break;
}
}
if (row - i >= 3) {
for (j = i + 1; j <= row; j++) {
init_balls(&head, board, j, col);
board[j][col] = -1;
}
}
// check down
for (i = row + 1; i < ROW; i++) {
if (board[i][col] != color) {
break;
}
}
if (i - row >= 3) {
for (j = row; j < i; j++) {
init_balls(&head, board, j, col);
board[j][col] = -1;
}
}
return head;
}
void drop_balls(int board[ROW][COL]) {
int i, j, k;
for (j = 0; j < COL; j++) {
for (i = ROW - 1; i >= 0; i--) {
if (board[i][j] == -1) {
for (k = i - 1; k >= 0; k--) {
if (board[k][j] != -1) {
board[i][j] = board[k][j];
board[k][j] = -1;
break;
}
}
if (k == -1) {
board[i][j] = rand() % COLOR_NUM;
}
}
}
}
}
int main() {
int board[ROW][COL];
Ball *balls = NULL;
int row, col;
init_board(board);
print_board(board);
while (1) {
printf("Input row and col: ");
scanf("%d %d", &row, &col);
if (row < 0 || row >= ROW || col < 0 || col >= COL) {
printf("Invalid input!\n");
continue;
}
if (board[row][col] == -1) {
printf("This ball has been removed!\n");
continue;
}
balls = remove_balls(board, row, col);
if (balls == NULL) {
printf("No balls can be removed!\n");
continue;
}
printf("Removed balls: ");
print_balls(balls);
free(balls);
drop_balls(board);
print_board(board);
}
return 0;
}
```
该代码使用了链表来存储被移除的小球,移除过程使用了递归函数,下落过程使用了嵌套循环。运行该代码可以与用户交互进行祖玛游戏。