C語言之三子棋的代碼實作
首先在開始執行一段代碼之前要剖析這個問題,不是上手就干,這樣會導致思維不夠縝密,代碼寫了好幾百航,一運行就崩潰了,我一般的解題程序是現畫圖,想出畫出想實作的程序,怎么實作,多種樣例,是否都能通過這個邏輯,
三子棋游戲其實也是如此(接下來是棋盤的思維實作程序)
1:首先需要一個棋盤,棋盤的大小,幾行幾列,該如何創建,
2:玩家如何落子,落子后位置是否正確,有沒有越界或者已經有棋子了,
3:你的對手電腦應該怎么下棋,
4:判斷輸贏,是你贏了,還是電腦,還是你們兩個不分上下的下滿的棋盤平局了,
5:如果我玩兒完一把不盡興應該怎么繼續,不能每次都運行代碼吧,
這是我們整個三子棋創建的程序和問題,接下來通過代碼和注釋來逐個解決,
首先我們需要創建兩個源檔案和一個頭檔案
分別是源檔案:game.c和prog.c,頭檔案game.h,
接下來上代碼:


接下來按照我的提示來看,
現看53行代碼,我們創建的ret就是來接收我們輸入的選項,
然后54行進入do while回圈里,
57行代碼是一個函式的呼叫,用menu這個函式來為我們列印一下游戲的選單,這個很簡單,
58行做一個提醒玩家該輸入選項,
59行進行輸入,
60行對玩家的輸入進行判斷進入switch陳述句中,輸入1,case 1為開始游戲,我們呼叫里面的函式來開始游戲,輸入0,進入case 0也就是終止游戲break結束switch陳述句后str為0,do while回圈也隨之結束,代碼結束,輸入非0,非1,則認定為輸入錯誤重新輸入,假如我現在執行了開始游戲,
我們來進入64行的game_go函式內,
上代碼:

這里看到的就是這個函式的實作,
13行我們創建一個二維陣列來創建我們棋盤的大小,行和列的ROW,COL是我們從我們開始創建的頭檔案中來進行呼叫的,

這就是我們的頭檔案的內容,我們把函式的宣告與define定義的變數還有庫函式呼叫需要的頭檔案都集中在這個位置更方便,代碼也更清晰,那兩個源檔案只需要在上面加上一個#include "game.h"即可不需要重復創建,
繼續看我們的game_go函式的呼叫,15行的函式用來初始化我們的棋盤這個很簡單,直接上代碼就可以,

然后我們繼續執行第16行的函式呼叫,這個函式用來列印我們的棋盤,


這就是棋盤的列印和代碼的實作,很簡單不做過多的解釋,自己跟著每一行代碼想一想畫一畫,動動手,你能學到更多,
我們已經解決了一開始的第1個與第5個問題接下來我們來繼續解決我們的問題,開始創建17行的while回圈,這里面就是我們的核心了,玩家和電腦輪流下棋與判斷輸贏等,
19行我們來現讓玩家下棋,創建函式來進行步驟,

x與y分別代表行與列,scanf來讓玩家輸入下子的位置,然后判斷下子位置是否越界,如果下子位置沒有越界在棋盤的大小之內,然后來判斷這個位置是不是沒有棋子,沒有棋子我們就為玩家來下上他的棋,*號就是玩家的棋子樣式,玩家下完棋了,該電腦下了,開始創建第26行電腦該怎么下,

這里用到rand庫函式來創建一個隨機下標,當然別忘了main函式里要加上第54行的代碼與game.h里面需要引頭檔案哦,然后磨上你的棋盤的行與列就不會產生越界的情況,下面的判斷就與玩家下棋的判斷一樣,看這個位置有沒有棋子,直到電腦找到一個沒有棋子的位置下子成功break跳出回圈,電腦棋子為#號,現在玩家下棋和電腦下棋我們都創建好了,第3個問題與第4個問題也都解決了,回到我們的game_go函式中繼續來完成我們的游戲,繼續game_go中第20和27行代碼是每次玩家下完棋和電腦下完棋再列印一下棋盤不能盲下啊對不對,21-25行與28-48行就是我們最后一個問題4的實作,我們先創建一個變數tmp來接收函式回傳的字符,如果是*代表玩家贏,如果是#代表電腦贏,如果是C代表平局,Q代表游戲繼續,接下來上代碼,

三子棋我們需要判斷每一行棋子是否相同或者每一列棋子是否相同還有兩個斜線棋子是否相同,如果相同直接回傳滿足條件的點上的字符即可進行判斷誰輸誰贏,繼續判斷棋盤是否還有沒下子的位置,如果有游戲繼續,如果滿了沒位置了游戲結束平局,游戲結束,三子棋的游戲代碼也就是這個程序,還有很多可以改良的地方,開動思維來動手改一改敲一敲,其實就跟簡單的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280987.html
標籤:其他
