五子棋是一种双人对弈游戏,通过在棋盘上落子来争夺胜利。下面是一个简单的 C 语言实现五子棋游戏的示例代码。
c语言五子棋功能模块代码实现:
#include <stdio.h> #include <stdlib.h> #define BOARD_SIZE 15 enum chess_type {EMPTY, BLACK, WHITE}; // 定义枚举类型,表示棋子的种类:空、黑、白 enum game_state {PLAYING, BLACK_WIN, WHITE_WIN, DRAW}; // 定义枚举类型,表示游戏的状态:进行中、黑方胜利、白方胜利、平局 struct chessboard { enum chess_type board[BOARD_SIZE][BOARD_SIZE]; // 存储棋盘上每个位置的棋子种类 int current_player; // 当前玩家(BLACK 或 WHITE) int moves; // 记录已下棋子的数量 }; // 初始化棋盘 void init_chessboard(struct chessboard* cb) { int i, j; for (i = 0; i < BOARD_SIZE; i++) { for (j = 0; j < BOARD_SIZE; j++) { cb->board[i][j] = EMPTY; } } cb->current_player = BLACK; cb->moves = 0; } // 打印棋盘 void print_chessboard(struct chessboard* cb) { int i, j; printf(" "); for (i = 0; i < BOARD_SIZE; i++) { printf("%2d ", i); } printf("\n"); for (i = 0; i < BOARD_SIZE; i++) { printf("%2d ", i); for (j = 0; j < BOARD_SIZE; j++) { switch (cb->board[i][j]) { case EMPTY: printf(". "); break; case BLACK: printf("X "); break; case WHITE: printf("O "); break; } } printf("\n"); } } // 判断是否已有五子连珠 int check_win(struct chessboard* cb, int x, int y) { int i, j, count; enum chess_type current_chess = cb->board[x][y]; // 水平方向 count = 1; for (i = x + 1; i < BOARD_SIZE && cb->board[i][y] == current_chess; i++) { count++; } for (i = x - 1; i >= 0 && cb->board[i][y] == current_chess; i--) { count++; } if (count >= 5) { return 1; } // 垂直方向 count = 1; for (j = y + 1; j < BOARD_SIZE && cb->board[x][j] == current_chess; j++) { count++; } for (j = y - 1; j >= 0 && cb->board[x][j] == current_chess; j--) { count++; } if (count >= 5) { return 1; } // 左斜方向 count = 1; for (i =x + 1, j = y + 1; i < BOARD_SIZE && j < BOARD_SIZE && cb->board[i][j] == current_chess; i++, j++) { count++; } for (i = x - 1, j = y - 1; i >= 0 && j >= 0 && cb->board[i][j] == current_chess; i--, j--) { count++; } if (count >= 5) { return 1; } // 右斜方向 count = 1; for (i = x + 1, j = y - 1; i < BOARD_SIZE && j >= 0 && cb->board[i][j] == current_chess; i++, j--) { count++; } for (i = x - 1, j = y + 1; i >= 0 && j < BOARD_SIZE && cb->board[i][j] == current_chess; i--, j++) { count++; } if (count >= 5) { return 1; } return 0; }
// 落子操作 int place_chess(struct chessboard* cb, int x, int y) { if (cb->board[x][y] != EMPTY) { printf("该位置已有棋子!\n"); return 0; } cb->board[x][y] = cb->current_player; cb->moves++; if (check_win(cb, x, y)) { return 1; // 胜利 } if (cb->moves == BOARD_SIZE * BOARD_SIZE) { return 2; // 平局 } cb->current_player = (cb->current_player == BLACK ? WHITE : BLACK); return 0; // 继续游戏 } // 主函数 int main() { struct chessboard cb; init_chessboard(&cb); int x, y, result; while (1) { printf("%s方落子(格式:行 列,如“3 4”):", cb.current_player == BLACK ? "黑" : "白"); scanf("%d%d", &x, &y); result = place_chess(&cb, x, y); if (result == 1) { printf("%s方胜利!\n", cb.current_player == BLACK ? "白" : "黑"); break; } else if (result == 2) { printf("平局!\n"); break; } print_chessboard(&cb); } return 0; }
c语言五子棋功能模块代码说明:
1. 定义了 `chess_type` 和 `game_state` 两个枚举类型,分别表示棋子种类和游戏状态。
2. 定义了 `chessboard` 结构体,包含一个二维数组 `board` 存储棋盘上每个位置的棋子种类,以及当前玩家和已下棋子数量。
3. `init_chessboard` 函数用于初始化棋盘,将每个位置的棋子种类设为 `EMPTY`,当前玩家设为 `BLACK`,已下棋子数量设为 0。
4. `print_chessboard` 函数用于打印棋盘。
5.
check_win
函数用于判断当前玩家是否胜利。先判断横向、纵向和两个对角线方向上是否有连续的五个相同的棋子,如果有则返回 1,表示胜利。否则返回 0,表示游戏继续。 6. place_chess
函数用于落子操作。如果该位置已经有棋子,则返回 0,表示落子无效。否则在该位置落子,增加已下棋子数量,并判断是否胜利或者平局。如果胜利则返回 1,平局则返回 2,否则返回 0。
主函数中先初始化棋盘,然后循环落子,每次落子后打印棋盘,如果游戏结束则输出相应的结果并退出循环。
这个五子棋的实现比较简单,没有考虑太多的优化和算法,但可以基本满足游戏需求。
评论