C语言实现井字棋游戏

题目描述:实现井字棋游戏,实现一个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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ACE .

有需要联系1940027346

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值