3. 簡單的 3 乘 3 井字棋程式

# 只有當找到 winner 才可以提前 break,避免判斷到三個 "口" 連線。

int[,] board = new int[3, 3]; // 1: me
void print()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            Console.Write(board[i, j] == 0 ? "口" : board[i, j] == 1 ? "O" : "X");
        }
        Console.WriteLine();
    }
}

bool checkWin()
{
    int winner = 0;
    for (int i = 0; i < 3; i++)
    {
        if (board[0, i] == board[1, i] && board[1, i] == board[2, i])
        {
            winner = board[0, i];
            if (winner != 0) break; // !! 只有當找到winner才可以提前break,避免判斷到三個口連線。
        }
        if (board[i, 0] == board[i, 1] && board[i, 1] == board[i, 2])
        {
            winner = board[i, 0];
            if (winner != 0) break; // !! 只有當找到winner才可以提前break,避免判斷到三個口連線。
        }
    }
    if (board[0, 0] == board[1, 1] && board[1, 1] == board[2, 2])
    {
        winner = board[0, 0];
    }
    if (board[2, 0] == board[1, 1] && board[1, 1] == board[0, 2])
    {
        winner = board[2, 0];
    }
    if (winner != 0)
    {
        print();
        string s = winner == 1 ? "你O方" : "電腦X方";
        Console.WriteLine($"{s}勝利 再來一盤\n");
        board = new int[3, 3];
        return true;
    }
    else
    {
        bool empty = false;
        for (int i = 0; i < 9; i++)
        {
            if (board[i / 3, i % 3] == 0)
            {
                empty = true;
                break;
            }
        }

        if (!empty)
        {
            print();
            Console.WriteLine("雙方平手 再來一盤\n");
            board = new int[3, 3];
            return true;
        }
    }
    return false;
}

Console.WriteLine("你為O、電腦為X\n位置對應數字鍵盤\n");
while (true)
{
    print();

    Console.Write("輸入1~9(按0鍵結束):");
    int key = int.Parse(Console.ReadLine()) - 1;
    if (key == -1)
        break;
    if (board[2 - key / 3, key % 3] != 0)
    {
        Console.WriteLine("下的位置已有旗子");
        continue;
    }
    board[2 - key / 3, key % 3] = 1;

    if (checkWin()) continue;

    int k = new Random().Next(9);
    while (board[2 - k / 3, k % 3] != 0)
        k = new Random().Next(9);

    board[2 - k / 3, k % 3] = -1;
    if (checkWin()) continue;
}

Last updated