编写一个完整的五子棋游戏(Gomoku 或 Gobang)在C语言中是一个相对复杂的任务,因为它涉及到用户界面的处理、游戏逻辑的维护以及可能的AI对手设计。在这里,我将提供一个简化的版本,这个版本将使用控制台来接收用户输入,并仅支持两位玩家交替下棋。
程序结构概述
初始化棋盘:使用一个二维数组来表示棋盘,通常五子棋棋盘是15x15的。打印棋盘:根据棋盘数组的内容打印当前棋盘状态。玩家输入:获取玩家下棋的位置(行列号)。落子逻辑:检查输入的有效性(是否在棋盘范围内,该位置是否已被占用),并在有效时更新棋盘。检查胜利:每次落子后检查是否有玩家获胜。轮流下棋:通过循环让两位玩家轮流下棋,直到有玩家获胜或棋盘填满。示例代码
以下是一个简化的C语言五子棋游戏示例,不包括AI对手和复杂的用户输入验证(如输入非数字字符的处理):
#include <stdio.h> #include <stdbool.h> #include <math.h> #define BOARD_SIZE 15 // 棋盘,0表示空位,1表示玩家1的棋子,-1表示玩家2的棋子 int board[BOARD_SIZE][BOARD_SIZE] = {0}; // 打印棋盘 void printBoard() { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j] == 0) printf(". "); else if (board[i][j] == 1) printf("X "); else printf("O "); } printf("\n"); } } // 检查是否在棋盘范围内 bool isValidMove(int row, int col) { return row >= 0 && row < BOARD_SIZE && col >= 0 && col < BOARD_SIZE; } // 检查是否可以在该位置下棋 bool canPlace(int row, int col) { return isValidMove(row, col) && board[row][col] == 0; } // 检查是否有玩家获胜 bool checkWin(int row, int col, int player) { // 简化处理,仅检查行、列和两条对角线 // 完整检查需要额外添加四个方向的斜线检查 int count = 1; // 检查行 for (int i = 1; i < BOARD_SIZE; i++) { if (board[row][col+i] == player) count++; else break; if (count >= 5) return true; } count = 1; for (int i = 1; i < BOARD_SIZE; i++) { if (board[row][col-i] == player) count++; else break; if (count >= 5) return true; } // 检查列(略) // ... // 检查对角线(略) // ... return false; } // 玩家下棋 void placePiece(int row, int col, int player) { if (canPlace(row, col)) { board[row][col] = player; if (checkWin(row, col, player)) { printf("Game%d Winner \n", abs(player) + 1); } } else { printf("无效的位置,请重新输入。\n"); } } // 主函数 int main() { int turn = 1; // 玩家1开始 while (true) { printBoard(); int row, col; printf("Gamer %d (line ,0): ", abs(turn) + 1); scanf("%d %d", &row, &col); placePiece(row, col, turn); if (turn == 1) turn = -1; // 切换到玩家2 else turn = 1; // 切换回玩家1 // 这里可以添加检查棋盘是否填满的逻辑 } return 0; }