题目描述:实现井字棋游戏,实现一个3*3的棋盘,判断每一行每一列对角线中是否有连成线,即为赢。
算法分析:
初始化棋盘:在游戏开始时,需要初始化棋盘,使得所有格子都是空的。这可以通过遍历每个格子,并将其设置为空格来实现。时间复杂度为 O(ROWS * COLUMNS),即 O(9)。
打印棋盘:在每次落子后,都需要打印当前的棋盘状态。这可以通过遍历棋盘并打印每个格子的内容来实现。时间复杂度为 O(ROWS * COLUMNS),即 O(9)。
落子:在每次循环中,程序都会读入当前玩家的输入,然后在棋盘上落子。这可以通过输入的行和列下标来定位棋子的位置,并将棋子设置为当前玩家的棋子。时间复杂度为 O(1)。
检查胜负:在每次落子后,都需要检查是否有玩家获胜或平局。检查获胜可以通过遍历每一行、每一列和两条对角线,并检查是否有连成线的棋子来实现。检查平局可以通过遍历棋盘并检查是否有空格来实现。时间复杂度分别为 O(ROWS + COLUMNS + 2) 和 O(ROWS * COLUMNS),即 O(4) 和 O(9)。
总的来说,这个算法的时间复杂度为 O(ROWS * COLUMNS),即 O(9),因为主循环是无限循环,所以这个算法的时间复杂度实际上是游戏结束的时间复杂度。在游戏结束之前,可以有 ROWS * COLUMNS 次落子,每次落子都要打印一次棋盘,所以总的时间复杂度为 O((ROWS * COLUMNS) * (ROWS * COLUMNS)),即 O(81)。
游戏源码:
#include <stdio.h>
#include <stdbool.h>
#define ROWS 3
#define COLUMNS 3
char board[ROWS][COLUMNS]; // 棋盘
void initBoard()
{
for (int i = 0; i < ROWS; i++)
for (int j = 0; j < COLUMNS; j++)
board[i][j] = ' '; // 初始化棋盘为空
}
void printBoard()
{
printf("\n");
printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]);
}
bool isWin(char ch)
{
// 检查行
for (int i = 0; i < ROWS; i++)
if (board[i][0] == ch && board[i][1] == ch && board[i][2] == ch)
return true;
// 检查列
for (int j = 0; j < COLUMNS; j++)
if (board[0][j] == ch && board[1][j] == ch && board[2][j] == ch)
return true;
// 检查对角线
if (board[0][0] == ch && board[1][1] == ch && board[2][2] == ch)
return true;
if (board[0][2] == ch && board[1][1] == ch && board[2][0] == ch)
return true;
return false;
}
bool isDraw()
{
// 检查是否有空格
for (int i = 0; i < ROWS; i++)
for (int j = 0; j < COLUMNS; j++)
if (board[i][j] == ' ')
return false;
return true;
}
int main()
{
initBoard(); // 初始化棋盘
char currentPlayer = 'X'; // 当前玩家
while (true)
{
int row, column;
printBoard(); // 打印棋盘
printf("Player %c, enter the row and column: ", currentPlayer);
scanf("%d%d", &row, &column);
// 检查输入的行和列是否合法
if (row >= 0 && row < ROWS && column >= 0 && column < COLUMNS && board[row][column] == ' ')
{
board[row][column] = currentPlayer; // 在棋盘上落子
if (isWin(currentPlayer)) // 检查是否获胜
{
printf("Player %c wins!\n", currentPlayer);
break;
}
else if (isDraw()) // 检查是否平局
{
printf("It's a draw.\n");
break;
}
// 切换玩家
if (currentPlayer == 'X')
currentPlayer = 'O';
else
currentPlayer = 'X';
}
else
{
printf("Invalid move.\n");
}
}
return 0;
}