全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2971
推到 Plurk!
推到 Facebook!

井字遊戲程式的問題

答題得分者是:hahalin
sawwewwe
一般會員


發表:6
回覆:10
積分:3
註冊:2004-06-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-14 16:20:49 IP:218.171.xxx.xxx 未訂閱
這是我載來的vC++井字遊戲程式,用意是在了解人家怎麼寫程式的,從中學習。可是遇到些自己不了解的地方。不懂的地方我有用中文注釋,希望懂井字遊戲的朋友能幫個忙為我解惑,謝謝...    //整個程式設true和false用意何在,是不是用來判斷9個方格是否已經有填上東西,還是每個地方意思不一樣 #include  #include using namespace std; int z=1; bool ba,bb,bc,bd,be,bf,bg,bh,bi; // these variables should be in the global scope // or else their symbol will not be saved char a,b,c,d,e,f,g,h,i; char syma,symb,symc; //function 1 int x_step() // x input { int step; do{ cout << "X's input: "; cin >> step; if (step>10)cout << "Invalid move."<9) ); return step; } //function 2 int y_step ()// y input { int step; do{ cout << "O's input: "; cin >> step; if (step>10)cout << "Invalid move."<9) ); return step; } //function3 bool valid(int step)// check repeat step { bool temp=false; switch (step) { case 1: temp=ba;break; case 2: temp=bb;break; case 3: temp=bc;break; case 4: temp=bd;break; case 5: temp=be;break; case 6: temp=bf;break; case 7: temp=bg;break; case 8: temp=bh;break; case 9: temp=bi;break; } return temp; } //function 4 bool win (int step) //collective function (display,check win) { bool wi; int turn; wi=false; turn=z%2; //find location & assign the symbol // if ((step<=9)&&(step>=1) ) switch (step) { case 1: { if (turn==0)a=symb; else a=symc;} ba=true;break; case 2: { if (turn==0)b=symb; else b=symc;} bb=true;break; case 3: { if (turn==0)c=symb; else c=symc;} bc=true;break; case 4: { if (turn==0)d=symb; else d=symc;} bd=true;break; case 5: { if (turn==0)e=symb; else e=symc;} be=true;break; case 6: { if (turn==0)f=symb; else f=symc;} bf=true;break; case 7: { if (turn==0)g=symb; else g=symc;} bg=true;break; case 8: { if (turn==0)h=symb; else h=symc;} bh=true;break; case 9: { if (turn==0)i=symb; else i=symc;} bi=true;break; } // display cout << a << "|"<< b <<"|"<< c <9 && !winner) cout << "Fair game."; else if (((z-1)%2)==0) cout<< "O wins.";//以下兩式判斷看不懂,自己思考的是當z=單數時"x"會獲勝可是和我想的相反 else if (((z-1)%2)!=0) cout<< "X wins."; }
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-14 17:55:12 IP:218.174.xxx.xxx 未訂閱
請記得要縮排,請參考  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=7326    根據您所提的疑惑用紅字表示,如有不足待高明者續    
#include 
#include     using namespace std;
int z=1;    bool ba,bb,bc,bd,be,bf,bg,bh,bi;
// these variables should be in the global scope
// or else their symbol will not be saved
char a,b,c,d,e,f,g,h,i;
char syma,symb,symc;    //function 1
int x_step() // x input    {        int step;      do{            cout << "X's input: ";   
        cin >> step;            if (step>10)cout << "Invalid move."<9) );
  return step;
}    //function 2
int y_step ()// y input    {        int step;      do{
        cout << "O's input: ";   
        cin >> step;            if (step>10)cout << "Invalid move."<9) );      return step;
}    //function3    bool valid(int step)// check repeat step
{        bool temp=false;
  switch (step)
  {
  case 1: temp=ba;break;
  case 2: temp=bb;break;
  case 3: temp=bc;break;
  case 4: temp=bd;break;
  case 5: temp=be;break;
  case 6: temp=bf;break;
  case 7: temp=bg;break;
  case 8: temp=bh;break;
  case 9: temp=bi;break;
}
return temp;
}    //function 4    bool win (int step)  //collective function (display,check win)    {        bool wi;
  int turn;      wi=false;      turn=z%2;      switch  (step)        
  {        
   case 1:        { if (turn==0)a=symb;   else a=symc;} ba=true;break;
   case 2:        { if (turn==0)b=symb;   else b=symc;} bb=true;break;
   case 3:        { if (turn==0)c=symb;   else c=symc;} bc=true;break;
   case 4:        { if (turn==0)d=symb;   else d=symc;} bd=true;break;
   case 5:        { if (turn==0)e=symb;   else e=symc;} be=true;break;
   case 6:        { if (turn==0)f=symb;   else f=symc;} bf=true;break;
   case 7:        { if (turn==0)g=symb;   else g=symc;} bg=true;break;
   case 8:        { if (turn==0)h=symb;   else h=symc;} bh=true;break;
   case 9:        { if (turn==0)i=symb;   else i=symc;} bi=true;break;
  }    // display
cout << a << "|"<< b <<"|"<< c < 這一段是判斷有沒有三個連成一線     else if  ( (d==e) && (e==f) && (e!=syma) ){cout  << "b";wi=true;}
else if  ( (g==h) && (h==i) && (g!=syma) ){cout  << "c";wi=true;}
else if  ( (a==d) && (d==g) && (d!=syma) ){cout  << "d";wi=true;}
else if  ( (b==e) && (e==h) && (e!=syma) ){cout  << "e";wi=true;}
else if  ( (c==f) && (f==i) && (f!=syma) ){cout  << "f";wi=true;}
else if  ( (a==e) && (e==i) && (e!=syma) ){cout  << "g";wi=true;}
else if  ( (c==e) && (e==g) && (g!=syma) ){cout  << "h";wi=true;}
else wi=false;    return wi;    }    //main program    void main()    {                            bool winner;
// initialize variables    syma=' ';
symb='O';
symc='X';
a = b = c = d = e = f = g = h = i = syma;
int xstep,ystep;
(ba,bb,bc,bd,be,bf,bg,bh,bi)=false;    winner=false;         while ( (!winner)&&(z<=9) )//不懂為什麼設!winner用意何在。以下的程式碼不太了解意思      while !winner 表示只要winner=false的前提下,也就是還沒有定勝負前,且z<=9都還要繼續遊戲          {        
        do{
                xstep=x_step();
        }while (valid(xstep) );/*不懂為什麼呼叫valid函數之後再做判斷,這樣要如何判斷。以及傳回值是true或false
                                          或者是ba,bb,bc....,什麼情況會跳出執行winner=win(xstep);這行程式*/             valid(xstep)判斷x方所下的格子必須在九宮格內也就是1(ba)到9(bi)
         winner=win(xstep) 表示 x每走一步就檢查x是否贏了 
        winner=win(xstep);
        z  ;            if ((!winner) && (z<=9) )            {        
                do ystep=y_step();
                while (valid(ystep) );                    winner=win(ystep);
                z  ;
        }        }    因為一定要走到z<=9,所以全部走完時z還會加一次為10
if (z>9 && !winner) cout << "Fair game."; 
全部可走格子都下完了且還沒有贏家表示平手
else if (((z-1)%2)==0) cout<< "O wins."; 
雙方累積次數為奇數,減一是因為z的初始值是1,因為是劃o的人先走,因此累積次數為奇數時是o贏    //以下兩式判斷看不懂,自己思考的是當z=單數時"x"會獲勝可是和我想的相反    雙方累積次數為偶數,表示x贏    else if (((z-1)%2)!=0) cout<< "X wins.";
}
發表人 - hahalin 於 2004/11/14 18:00:11 發表人 - hahalin 於 2004/11/14 20:40:00
sawwewwe
一般會員


發表:6
回覆:10
積分:3
註冊:2004-06-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-14 22:46:06 IP:218.171.xxx.xxx 未訂閱
關於!winner我還是轉不過來。while !winner 表示只要winner=false的前提下,也就是還沒有定勝負前,且z<=9都還要繼續遊戲 。那winner不是把它預設成false,再加上一個!。不等於false不就是true嗎?為什麼!winner代表winner=false。如果winner為true要怎麼解釋!winner,如果winner為false要怎麼解釋!winner,我都搞糊塗了,可以麻煩版主再幫我解惑一次嗎?謝謝...
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-14 23:22:21 IP:218.174.xxx.xxx 未訂閱
是的, not false 為 true && 是 and 的意思 z<=9 的範圍內 (z<=9) 也為 true true && true 為 true 執行條件就是 這兩個條件都為true的前提下執行while迴圈內的程式 如果有人贏 winner=true not true =false 則 判斷條件就不為 true 複習一下 while 以及 && ! 等邏輯運算元,自己畫個圖會比較好思考吧
sawwewwe
一般會員


發表:6
回覆:10
積分:3
註冊:2004-06-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-15 00:22:16 IP:218.171.xxx.xxx 未訂閱
void main()    {                        bool winner;
// initialize variables    syma=' ';
symb='O';
symc='X';
a = b = c = d = e = f = g = h = i = syma;
int xstep,ystep;
(ba,bb,bc,bd,be,bf,bg,bh,bi)=false;    winner=false;    while ( (!winner)&&(z<=9) )
{        
        do{
                xstep=x_step();
        }while (valid(xstep) );            winner=win(xstep);如果win(xstep)傳回來的是true那麼是不是代表底下if((!winner) && (z<=9))不會執行,因為winner現在是true而判斷條件!winner此時表示false,所以不會執行...            z  ;            if ((!winner) && (z<=9) )            {        
                do ystep=y_step();
                while (valid(ystep) );                    winner=win(ystep);
                z  ;
        }    }    if (z>9 && !winner) cout << "Fair game.";
else if (((z-1)%2)==0) cout<< "O wins.";
else if (((z-1)%2)!=0) cout<< "X wins.";
}
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-15 00:23:44 IP:218.174.xxx.xxx 未訂閱
是的
sawwewwe
一般會員


發表:6
回覆:10
積分:3
註冊:2004-06-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-15 00:33:51 IP:218.171.xxx.xxx 未訂閱
謝謝你的答覆 THX   ^0^    
系統時間:2017-12-14 20:55:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!