Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 7 years ago

關於c++ ---井字遊戲判斷

請寫一個判斷井字遊戲勝負的程式。棋譜 (遊戲歷程) 存放在一個檔案中,請先從鍵盤讀取檔案的名字,檔案中依序會有井字遊戲棋盤的座標,由 A 先下,請判斷遊戲的結果是哪一方勝利。

檔案中座標皆為 0<=x, y<=2之整數, 棋盤座標如下圖:

00 | 10 | 20

_________

01 | 11 | 21

__________

02 | 12 | 22

檔案名稱不會超過64個字元 (char)

輸出結果

A won表示A贏

B won表示B贏

Tie表示平手

Error表示輸入有錯

測試資料

資料檔案 data1.txt

0 0

1 1

2 2

1 0

1 2

0 2

2 0

2 1

0 1

測試範例:

鍵盤輸入

data1.txt

輸出

Tie

小弟我本人非常不擅長c++

關於陣列什麼的都不太會用@@

可以請高手們指點一下嗎?

感謝~(盡量不要太複雜QQ)

2 Answers

Rating
  • Tai
    Lv 5
    7 years ago
    Favorite Answer

    #include <iostream>

    #include <fstream>

    #include <string>

    #include <stdlib.h> // system

    using namespace std;

    // 0: A win

    // 1: B win

    // 2: Tie

    // 3: Error

    // 4: continue

    int state(int b[3][3], int x, int y, int v, int i)

    {

    if ( b[y][x] != -1)

    return 3; // 原位置已經有值, 輸入錯誤 => Error

    else {

    b[y][x] = v;

    if (

    (b[y][0] == v && b[y][1] == v && b[y][2] == v) ||// 水平勝利條件

    (b[0][x] == v && b[1][x] == v && b[2][x] == v) ||// 垂直勝利條件

    (x==y && (b[0][0] == v && b[1][1]==v && b[2][2]==v)) ||// 對角勝利條件

    ((x+y)==2 && (b[0][2] == v && b[1][1]==v && b[2][0]==v)) )// 反對角勝利條件

    return v; // 任何一個條件勝利 => A or B win

    else if (i == 8)

    return 2; // 沒有輸贏, 九宮格下滿 => Tie

    else

    return 4; // 沒有輸贏, 九宮格還沒下滿

    }

    }

    int main()

    {

    char *rst[] = {"A won", "B won", "Tie", "Error"};

    char fname[64];

    cout << "filename:";

    cin >> fname;

    ifstream fs(fname);

    // 初始化井字遊戲棋盤

    int b[3][3];

    for (int y = 0; y < 3; ++y)

    for (int x = 0; x < 3; ++x)

    b[y][x] = -1;

    // player 依次為 0, 1, 0, 1, .. 可用 player=(player+1) & 1 達成

    for (int i = 0, player = 0; !fs.eof(); i++, player = (player+1) & 1)

    {

    int x, y, s;

    fs >> x >> y;

    if (4 > (s = state(b, x, y, player, i)) )

    {

    printf("%s\n", rst[s]);

    break;

    }

    }

    fs.close();

    system("pause");

    return 0;

    }

    2013-11-19 07:57:32 補充:

    感謝 p 大, 這樣是可以巧妙地精簡判斷式

    不過 s 為何要初始為 3 ?? 還不解

    2013-11-20 01:21:24 補充:

    目測 s = 3 沒必要吧. 反正 s=state() 先執行後再判斷 >=4

    喔,... 你是說 file 有錯, 一開始就 eof, 那至少出現個 Error

    恩, 的確, 我原式也沒有考慮到

  • 7 years ago

    // player 依次為 0, 1, 0, 1, .. 可用 player=!player達成

    int s,i;

    for (s = i = player = 0;

    !fs.eof() && fs>>x>>y && (s=...) >=4;

    ++i, player = !player);

    printf("%s\n", rst[s]);

    2013-11-19 06:22:39 補充:

    for(s=3, i=player=0;... // s needs to be inited to 3, sorry.

    2013-11-19 08:18:01 補充:

    真是奇異人. 妳自己的程式 怎返兒問我呢?

    2013-11-20 02:17:26 補充:

    是阿是啊!多想多有用

    這也是為甚要用for loop來集中loop的出入口與控制

Still have questions? Get your answers by asking now.