【C語言】用C語言實現中國象棋


 
        

基於五子棋框架上的 象棋 小游戲

本游戲是上各種水課無聊時的產物。。。不參考現有游戲從零開始實現各項功能。

游戲配置:二維數組,循環系統,wasd基本移動,調整窗台的函數,以及富足的發呆時間。。

完整代碼

代碼已和五子棋整合在此鏈接中https://paste.ubuntu.com/p/HZBWXMWT8K/

github鏈接:https://github.com/404name/C-game

主體進展: (全部實現)

  1. o 搭建框架中                  

  2. o 實現全局指標移動

  3. o 實現中文(2個字符)同時移動

  4. o 實現象棋棋子取子與放回

  5. o 實現判斷回合

  6. o 實現后台判斷每一個棋子

  7. o 定義全局規則

  8. o 定義每一個棋子的規則

  9. o 調bug

 

<!--more-->

前言: 走迷宮 - 五子棋 -象棋

本游戲基於我之前做的   基於走迷宮的五子棋的游戲   之上,本質上都是靠基礎的知識點穿插而成的。

五子棋是只下棋,象棋是先取后下,並且取棋子后台要能識別它是哪方的哪個棋,並根據規

則能正確下落在合法的點上。並且下落后判斷游戲是否繼續。

解決問題過程

1.憑空搭建一個一模一樣的象棋棋盤模型

一步一步慢慢的敲與改進最后終於符合棋盤原樣。(一開始''\' 就是打不出本來要放棄這個布局,后來記起書上說過轉義符   )

2.實現取棋子和下棋

當我布置好棋盤,按好棋子,設置好移動距離調適時,一個驚人的現實擺在了我的面前——漢字占兩個字節。這個時候,愁苦之時,發現我實現五子棋單個字符移動的原理(設置temp儲存指針所在坐標狀態,不改變情況下顯示指針狀態,指針移開恢復temp原坐標原狀)只要設置兩個temp和2個指針狀態就能同時實現2個坐標的改變!!

ch = getch();
   if ( ch == 's')                     //下移
  {
       if( map[x+1][y]!= '-')
      {                                 //將要移動
           map[x][y] =temp;             //恢復移動前坐標狀態
           map[x][y+1] = temp1;
           x = x + 2;                 //移動
           temp = map[x][y];         //儲存新坐標狀態  
           temp1 = map[x][y+1];
           map[x][y] = turn;    //turn即鼠標指針(拿起棋子)的狀態
           map[x][y+1] = turn1;   //把鼠標指針狀態打印在新的坐標上    
      }      
  }                            //后續選擇移動   原坐標恢復,循環。
//后續選擇下棋   將turn給temp 下一次移動時map則存儲棋子並顯現。
3.實現后台判斷雙方次序,與下棋;

按下 “L” 則num++

第一次按下  先手方取棋    num = 1;第二次按下   先手方下棋  num = 2;

第三次按下  后手方取棋    num = 3; 第四次按下  后手方下棋 num = 4;

設置規律4次一循環即可判斷;

要是取了棋又放回呢?

  • printf 就是不允許悔棋。一開始我是這么想的,給自己找個理由偷懶。馬上就想到了這樣會某些特殊群體(馬,相)容易卡死導致棋局作廢。。

  • 被迫改進 取臨時坐標 與 新坐標比較,判斷放回則還是提醒下少悔棋,並num--回到上一步變成空鼠標狀態繼續選其他棋子。其實也蠻簡單實現。。

4.實現取棋子的識別與判斷是否可下棋(第一次沒考慮,直接拿我的士吃了我的將軍。。)

暴力循環判斷法。。

char check—1【8】【3】={"車","馬","象","士","將","炮","卒","+-"};    //這里的+-是棋盤上的空位
char check_—2【8】【3】={"俥","馬","相","仕","帥","軳","兵","+-"};

鼠標指針所在坐標的臨時temp(原坐標棋子)循環比較一波就知道了,並且提示“這不是你的棋子喔” ,使取對方棋子的舉動無效。再與后續規則合並可實現許多其他規則。

定義check函數判斷是下棋點位是空位與對方棋子在符合棋子規則走法情況下則可下吃。

這里說下這里的妙處

  • 定義函數可在14種棋子規則移動后調用判斷,縮短代碼量。

  • 二維數組儲存信息量是8,這里取棋時循環判斷是否為己方7位(即棋子),下棋時判斷是否是對方8位(即對方的棋子與空位)

5.定義每一個棋子的規則(傷腦筋的地方)(易到難)

每個棋子都是3個依次的判斷:

o 是否改變坐標(比較)

o 是否符合該棋子規則(下面介紹)

o 終點是否可下棋(調用上面說的check函數)

  • 車:保證走直線, x,y僅能改變一個值,並且for循環新坐標到原坐標中間是否全是空格,是則終點進入check函數,判斷可否執行。

  • 象:不能過河,那就簡單設定7個可移動坐標點位,且保證每次只移動一個田字。且兩次坐標中間坐標要為空格。

  • 士:同理“象”設定;

  • 將:同理“士”的設定;

  • 兵:河后只能向前,過河可前可左右

  • 馬:走日字,判斷走了2個單位的方向的正前方是否為空格。(判斷卡馬腳)

  • 炮:同理車的直線走法,若不跳躍則僅能走空格,若跳躍判斷中間僅一個棋子,且落點必須是對方棋子。

其實實現起來會發現你怎樣思考,都能用計算機取模擬出來,做出這個棋局規定很簡單,但能不能讓它高效的運行起來才是最困難的。最痛苦的還是debug過程,,因為這時候已經800多行了qwq。。。

還好思路沒錯,幾乎沒啥bug。

定義勝利規則

把 將 卡死在9個點位上,每次下棋后循環判斷它是否在,

不存在:   對方勝利

存在: 判斷是否對將

對將: 記錄其坐標與對方的 帥的坐標對比,若x方向對上了,且這條直線上是否都為空格,則上把誰下的棋則誰輸。

 

后續

不足之處

1.代碼不夠簡潔

2.不能簡單明了的區分雙方棋子。(嘗試了各種方法最后還是用簡體字與繁體字區分)

3.ing

收獲

1.看幾百行的代碼再也不頭暈了。

2.靈活運用c語言可以實現好多實例。

3.還要提升c語言的准確表達做到更精簡的寫代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM