From 2936c6b1208653e0fa8f6dc0ad191592f21f0832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=88=E8=90=BD=E5=A6=82=E9=A3=8E?= <3498996472@qq.com> Date: Sun, 24 Dec 2023 16:00:12 +0000 Subject: [PATCH] update report5.md. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 月落如风 <3498996472@qq.com> --- report5.md | 296 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 296 insertions(+) diff --git a/report5.md b/report5.md index 0d69c6e..ba4ad5c 100644 --- a/report5.md +++ b/report5.md @@ -12,3 +12,299 @@ 利用C语言三种基本控制结构、函数、结构体、数组、指针、文件等知识设计实现一个简单信息管理类系统,能实现主要功能,并具备一定的实用性、可靠性。 + + +## 问题:井字棋,英文名叫Tic-Tac-Toe,是一种在 3 * 3 格子上进行的连珠游戏,和五子棋类似,由于棋盘一般 +不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表 X 和 O 的两个游戏者轮 +流在格子里留下标记(一般来说先手者为 X),任意三个标记形成一条直线,可以是三条横线、三条竖线 +和两条对角线中的任意一种,则为获胜。(摘自百度百科) +编写一个程序让两个人玩井字棋游戏 + + + +### 1. 问题陈述 + +编写程序让两个人玩井字棋游戏。 + + +### 2. 输入、输出描述 + +- 输入:两个玩家交替落子的位置。 +- 输出:游戏结果 + +如用 1 到 9 标记落子位置: + +``` +1 2 3 +4 5 6 +7 8 9 +``` + +若两个玩家交替下子的序列(以 0 表示结束)为: + +``` +1 5 4 7 3 2 8 6 0 +``` + +则对应的对弈结果是: + +``` +X O X +X O O +O X 9 +``` + +游戏结果是:平局 +### 3. 演算示例 + +示例1:平局 +输入着法 1 5 4 7 3 2 8 6 0 ,游戏结果是: + +``` +X O X +X O O +O X 9 +``` + +即平局。 + +示例2:X胜 +输入着法 1 4 5 7 9 0 ,游戏结果是: + +``` +X 2 3 +O X 6 +O 8 X +``` + +即X胜 + +示例3: O胜 +输入着法 4 1 7 5 6 9 0,游戏结果是: + +``` +O 2 3 +X O X +X 8 O +``` + +即O胜 + +示例4:错误的位置 + +输入着法 4 1 3 4 6 9 0,游戏结果是: + +``` +O 2 X +O 5 X +7 8 O +``` + +即错误的位置 + +示例5:错误的输入 + +输入着法 4 1 3 10 6 9 0,游戏结果是: + +``` +O 2 X +X 5 O +7 8 X +``` + +即错误的输入 + +### 4. 算法设计 + +伪代码: + +``` +// 定义常量 +ROWS = 3 +COLS = 3 + +// 初始化棋盘 +initialize_board(board) + +// 定义玩家1和玩家2的标记 +player1 = 'X' +player2 = 'O' + +// 初始化落子次数和当前玩家 +moves = 0 +current_player = 1 + +// 定义落子序列 +moves_sequence = [1, 5, 4, 7, 3, 2, 8, 6, 0] +index = 0 + +// 游戏循环 +WHILE True DO + // 如果落子序列结束,退出循环 + IF moves_sequence[index] == 0 THEN + break + END IF + + // 获取当前落子位置 + position = moves_sequence[index] + row = (position - 1) / 3 + col = (position - 1) % 3 + + // 切换玩家 + IF current_player == 1 THEN + current_player = 2 + ELSE + current_player = 1 + END IF + + // 如果落子位置为空,落子并检查游戏结果 + IF board[row][col] is empty DO + IF current_player == 1 THEN + board[row][col] = player1 + ELSE + board[row][col] = player2 + moves = moves + 1 + END IF + IF + + // 检查玩家1是否获胜 + IF check_win(board, player1) is True THEN + 输出 "Player 1 wins!" + 打印棋盘 + 退出游戏 + // 检查玩家2是否获胜 + ELSE IF check_win(board, player2) is True THEN + 输出 "Player 2 wins!" + 打印棋盘 + 退出游戏 + // 如果棋盘已满,游戏结果为平局 + ELSE IF moves == ROWS * COLS THEN + 输出 "It's a draw!" + 打印棋盘 + 退出游戏 + ELSE + 输出 "Invalid position, please try again!" + END IF + index = index + 1 +``` + +程序代码: + +```c +#include + +#define ROWS 3 +#define COLS 3 + +// 初始化棋盘 +void initialize_board(char board[ROWS][COLS]) { + for (int i = 0; i < ROWS; i++) { + for (int j = 0; j < COLS; j++) { + board[i][j] = ' '; + } + } +} + +// 打印棋盘 +void print_board(char board[ROWS][COLS]) { + for (int i = 0; i < ROWS; i++) { + for (int j = 0; j < COLS; j++) { + printf("%c", board[i][j]); + if (j < COLS - 1) { + printf(" | "); + } + } + printf("\n"); + if (i < ROWS - 1) { + printf("---------\n"); + } + } +} + +// 检查是否有玩家获胜 +int check_win(char board[ROWS][COLS], char player) { + for (int i = 0; i < ROWS; i++) { + if (board[i][0] == player && board[i][1] == player && board[i][2] == player) { + return 1; + } + if (board[0][i] == player && board[1][i] == player && board[2][i] == player) { + return 1; + } + } + if ((board[0][0] == player && board[1][1] == player && board[2][2] == player) || + (board[0][2] == player && board[1][1] == player && board[2][0] == player)) { + return 1; + } + return 0; +} + +int main() { + char board[ROWS][COLS]; + char player1 = 'X'; + char player2 = 'O'; + int moves = 0; + int current_player = 1; + + // 初始化棋盘 + initialize_board(board); + + // 定义落子序列 + int moves_sequence[] = {1, 5, 4, 7, 3, 2, 8, 6, 0}; + int index = 0; + while (1) { + // 如果落子序列结束,退出循环 + if (moves_sequence[index] == 0) { + break; + } + + // 获取当前落子位置 + int position = moves_sequence[index]; + int row = (position - 1) / 3; + int col = (position - 1) % 3; + + // 切换玩家 + current_player = (current_player == 1) ? 2 : 1; + + // 如果落子位置为空,落子并检查游戏结果 + if (board[row][col] == ' ') { + if (current_player == 1) { + board[row][col] = player1; + } else { + board[row][col] = player2; + } + moves++; + + // 检查玩家1是否获胜 + if (check_win(board, player1)) { + printf("Player 1 wins!\n"); + print_board(board); + return 0; + } + // 检查玩家2是否获胜 + else if (check_win(board, player2)) { + printf("Player 2 wins!\n"); + print_board(board); + return 0; + } + // 如果棋盘已满,游戏结果为平局 + else if (moves == ROWS * COLS) { + printf("It's a draw!\n"); + print_board(board); + return 0; + } + } else { + printf("Invalid position, please try again!\n"); + } + + index++; + } + + return 0; +} +``` +### 5. 测试 +- 测试结果与演算示例一致,测试通过 + + +### 小结 +- 本题运用了函数,遍历等方法,使代码更加简洁易懂 \ No newline at end of file -- Gitee