切換
舊版
前往
大廳
主題

【Code】C++ 井字遊戲

| 2018-07-30 22:13:35 | 巴幣 1022 | 人氣 14394

  這是昨天有人問的怎麼寫三乘三井字遊戲,我用C++試寫一下,盡可能的都用基本語言跟直覺邏輯怕大家看不懂,也就是所謂最土的寫法哈哈。
  壓縮完大概七十行左右,註解剛剛也因為怕大家看不懂都補上去了。
  大概花了八十分鐘,因為比預計的一小時內收工還要久,所以沒有下次囉哈哈。


  設計上,就是會有一個判斷是否勝利的函式,跟棋子是否可以放在這裡的函式。
  控制上不是用滑鼠點擊,而是用數字鍵去點選,即:按7會在最左上角放入棋子,按3會在最右下角放入棋子,以此類推。

  因為是三乘三的小程式,所以判斷勝利與否用很傻的全圖掃查判斷,如果有人要把這個程式改成五子棋之類的,很遺憾是不如整個重寫的,怎麼寫就自己想或是看看小山的C#教學吧哈哈,我來寫大概要一兩小時吧?不幹。







以下是程式碼,語言C++,沒有偷藏直接複製貼上可用

#include<iostream>
using namespace std;
/*勝利判斷*/
bool winner(char map[3][3]){
    for(int i=0;i<3;i++) if(map[i][0]!=' '&&map[i][0]==map[i][1]&&map[i][1]==map[i][2]) return true;//列勝利判斷
    for(int i=0;i<3;i++) if(map[0][i]!=' '&&map[0][i]==map[1][i]&&map[1][i]==map[2][i]) return true;//行勝利判斷
    if(map[0][0]!=' '&&map[0][0]==map[1][1]&&map[1][1]==map[2][2]) return true;//左上右下斜勝利判斷
    if(map[0][2]!=' '&&map[0][2]==map[1][1]&&map[1][1]==map[2][0]) return true;//右上左下斜勝利判斷
    return false;//如果沒有勝利出現
}
/*判斷是否能在這個位置放置棋子*/
bool TFset(char Player,int Switch,char map[3][3]){
/*第一列 判斷*/
    if(Switch==7&&map[0][0]==' '){map[0][0]=Player; return true;}
    else if(Switch==8&&map[0][1]==' '){map[0][1]=Player; return true;}
    else if(Switch==9&&map[0][2]==' '){map[0][2]=Player; return true;}
/*第二列 判斷*/
    else if(Switch==4&&map[1][0]==' '){map[1][0]=Player; return true;}
    else if(Switch==5&&map[1][1]==' '){map[1][1]=Player; return true;}
    else if(Switch==6&&map[1][2]==' '){map[1][2]=Player; return true;}
/*第三列 判斷*/
    else if(Switch==1&&map[2][0]==' '){map[2][0]=Player; return true;}
    else if(Switch==2&&map[2][1]==' '){map[2][1]=Player; return true;}
    else if(Switch==3&&map[2][2]==' '){map[2][2]=Player; return true;}
/*錯誤提示*/
    else{ cout<<"按錯了啦 蛤啊你是目洨膩?"<<endl; return false;}
}
/*顯示閘*/
void show(char map[3][3]){
    for(int i=0;i<3;i++){
        cout<<" ---------"<<endl;
        for(int j=0;j<3;j++) { cout<<"|  "<<map[i][j]<<"  "; } cout<<"|"<<endl;
    }cout<<" ---------"<<endl;
}

int main(){
    char map[3][3]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};//空地圖
    char Player='O';//第一顆棋子為O  
    int Switch;//按下的數字鍵控制項
    
    show(map);//地圖顯示
    while(1){//遊戲無限迴圈
        cout<<"(按0退出,數字鍵比照九宮格)"<<endl;
        cin>>Switch;
        if(Switch==0) break;//如果輸入0,結束迴圈
        
        system("CLS");//清除畫面的系統字
        bool TFSet=TFset(Player, Switch, map);//判斷是否能夠放置棋子,並放進棋子
        show(map);//更新地圖顯示
    /*判斷是否有玩家獲勝*/
        if(winner(map)==true){//如果獲勝,輸出地圖與獲勝提示後結束迴圈
            cout<<Player<<" 贏了。\n";
            break;                    
        }
    /*判斷是否滿圖*/
        bool mapover=true;
        for(int i=0;i<3;i++)//搜尋全地圖
            for(int j=0;j<3;j++)
                if(map[i][j]==' ') mapover=false;//只要有一個是空的,地圖就不為滿  
                
        if(mapover==true){//如果滿圖,輸出滿圖提示後結束迴圈
            cout<<"滿圖,不分勝負。";
            break;
        }
    /*迴圈繼續,更替棋子*/
        if(TFSet==true){//如果方才放入棋子的選項有正常執行
            if(Player=='O') Player='X';//更替棋子
            else Player='O';            
        }
    }
}

建議用編譯器開來看,這樣看對眼睛和心靈都不好



註一:為什麼輸出成.exe檔,檔案會秒開之後秒關呢?
因為這是測試模組的啟動,如果是輸出成.exe檔檔案要長開不關,需要在最後一個括號前加入:

int main(){
   …
    system("pause");
}



註二:為什麼我的執行結果畫面會是黑底白字?梗的結果是白底藍字?
因為我有用系統字去更改,白底藍字的系統字如下,請加在『int main(){……}』內的某處:
int main(){
    system("color f9");
}



註三:那為什麼你不要直接把那些程式附在主程式內?傲嬌?
因為就算沒有美觀也沒有長開,那顆程式一樣還能動我就盡量壓短嘛,你才傲嬌。


執行結果畫面:



大概這個樣子。
送禮物贊助創作者 !
0
留言

創作回應

章魚茶
為什麼不貼去線上Codebook,我的眼睛好痛(X)
練啊,程式功力要練啊(搖晃)
回去寫個"1010!"來!(大誤)
2018-07-31 02:12:12
呃因為這樣方便外科系的人複製貼上?哎呀其實我也沒用過線上的編碼簿呢哈哈,唯一用過的只有臉書 Messenger 的Java提示色

對對程式功力要練啊,想林北八十分鐘寫圈圈叉叉,我的老師二十五分鐘內含講解,同樣用沒有提示的dev c可以收工2048,怪物啊你看看

不……全台灣大學資工系組語或機器碼打得溜的會超過七十個嗎…這樣要求外系也太過分了吧……
2018-07-31 16:43:56
話說回來我昨天搞懂台灣大公園大學是哪一間了,幹啊寫網文大概一年半,知道對方學校大概七八位,就有五六位是台灣大公園的,所以我說這是什麼觸擊率呀我說
2018-07-31 16:45:44
霜凋夜落
竟然直接用全圖掃嗎 也太暴力了吧(x
2018-07-31 06:01:22
喔不,我後來發現好像不管怎麼走都是需要全圖掃
只是說這個是三乘三,也就九顆操作八個勝利判斷,如果是五子棋用鍵盤遊戲,可能要就改寫一下輸入規則,並且勝利模組要改成全圖掃加上四位搜尋之類的,總而言之還是需要全圖掃呢唉
2018-07-31 16:48:13
章魚茶
那個觸及率啊……你業障太重(X)
我們系上可以順暢寫組語的……可能只有某些教授?
機器碼就別說了吧,那根本不同架構、不同指令集的CPU都長不一樣啊XD
2018-07-31 17:12:35
我也覺得這業障……搞清楚,你們學校這學期的活動海報有其中一張還是我操刀去畫的耶我說,明明我就是在南部念書啊= =
對阿對阿,那個東西根本就是另外一個等級的,排進課綱都不知道是不是在整學生= =

機器碼的話,我以前學過一個叫LC3不知道算不算,1011 001 010 之類的,我知道我打錯了畢竟我忘光了哈哈
2018-07-31 17:30:11
章魚茶
畫我們的活動海報OAO,難怪認識這麼多XDDD
組語我開學後某堂課好像會用到,不過我大概會寫一點,應該……還行?
2018-07-31 17:31:14
呃不,畫你們活動海報跟認識這麼多完全沒有關係,能認識這麼多真的只是湊巧,雖然我也覺得很扯= =

組語我以前學過,如果要寫也不是不行,不過可能要拿一本書這樣翻翻翻的寫,大概寫個燈號就要花六七小時吧哈哈
2018-07-31 19:41:42
你好,請問如果我要用成簡單的socket的sever、clint端,應該怎麼寫,不好意思剛學c想知道><''
2019-11-22 00:27:35
厄哈哈哈這個我也不知道耶?我是知道C++可以架,但我只有實做過一次,比較學藝不精不好意思
倒是如果要架即時伺服的話,你要不要參考一下node.js或是python django之類的,我自己覺得很不錯喔
不好意思沒幫上忙,我自己比較會演算法的問題,協定端比較手生這樣,有演算相關問題也歡迎討論喔
2019-11-22 19:29:36
追蹤 創作集

作者相關創作

更多創作