三子棋(電腦非弱智版)

2021-09-23 05:58:11 字數 4017 閱讀 3074

3 判斷勝負

4. 結果

三子棋是很簡單的雙人遊戲,雙方在3x3的棋盤上輪流落子,當一條直線上出現三顆連續且相同的棋子時即獲勝。此程式讓玩家先落子,電腦在棋盤上隨機落子。遊戲結束時顯示勝負,玩家可以選擇是否繼續玩遊戲。

遊戲選單,選擇玩/不玩

列印棋盤

玩家落子

列印棋盤

電腦落子

列印棋盤

…顯示勝負

返回遊戲選單,選擇玩/不玩

1. 遊戲選單menu()

彈出遊戲選單選擇玩/不玩,選擇不玩,退出;選擇玩,進入遊戲,遊戲結束後,再次彈出讓玩家選擇。因為程式一開始就需要彈出,並且每次遊戲結束後再次彈出,可用do while來實現。

void

menu()

intmain()

}while

(input)

;system

("pause");

return0;

}

2. 遊戲函式game()

在這個函式中,需要實現遊戲的執行,包括列印棋盤,玩家落子,列印棋盤,電腦落子,列印棋盤…同時每次落完子後需要判段遊戲的勝負,如果分出勝負,顯示;沒有分出勝負繼續。

2.1 列印棋盤

//列印棋盤

printf

("\n");

for(j =

0; j < col; j++)}

printf

("\n");

}}在列印棋盤之需要先建立乙個board[3][3]的陣列,剛開始是陣列儲存的內容為空格『 』,用inic()函式實現。

void

inic

(char board[row]

[col]

,int row,

int col)

//給陣列初始化空格

}}

2.2 玩家落子

玩家落子其實就是選擇陣列中的乙個數,然後把它所儲存的『 』換成『 x』,電腦落子也是一樣只不過是換成『 0』。不過需要注意的是陣列是從[0][0]開始的,而玩家在棋盤落子時選擇的座標從1 1開始,另外在玩家和電腦落子前需要判斷,選擇的座標是否可以落子(如選擇座標外,或選的地方已經落過子了),在落子結束後判斷遊戲勝負。

void

playermove

(char board[row]

[col]

,int row,

int col)

else

printf

("無法在此下子,請重新選擇\n");

}}

落子後需要列印棋盤,同時判斷勝負。

2.3 電腦走

這裡電腦的走法是隨機的,只要滿足條件,在棋盤上隨意落子。讓電腦隨機生成x和y,給定範圍0-2;如果可以落子,修改『 』為『0』然後跳出迴圈,否則進行下一次迴圈。 注意:

x,y 需要放在while的裡面,如果放在外面,一旦隨機的位置不能落子,陷入死迴圈!另外在剛開時因為玩家只下了一次,電腦隨機的位置大概率不會與玩家相同,可以落子,玩家再次落子,電腦可能生成的隨機位置仍可以落子,但是一般兩次後即陷入死迴圈,電腦不再落子。

void

computermove

(char board[row]

[col]

,int row,

int col)

}}

上面的方法電腦採用的是隨機的走法,想要讓遊戲更有挑戰可以採用下面的寫法,以下電腦不再隨機落子,而是在落子前進行判斷,如果玩家已經有兩子在一條直線,電腦選擇堵,如果沒有,電腦會選擇較優的位置落子,電腦將會利於不敗。

2.3.1 電腦落子優化

讓電腦選擇更優位置落子,需要知道何為最優位置,這是對遊戲玩法的理解,三字棋是乙個簡單的遊戲,不論先落子還是後落子,只要走法正確 ,都可以利於不敗。

三子棋是乙個3x3的棋盤,一共有九個位置可以選擇,在這九個位置中哪些位置相對較好,為什麼呢?

最中心的位置:可以與橫豎斜共四條線上的棋子組成三子棋。

四個角上的位置:可以與橫豎斜共三條線上的棋子組成三子棋。

每天邊的中心位置:可以與橫豎共二條線上的棋子組成 三子棋。

在明白這個道理後,可以讓電腦落子時進行選擇

1 .判斷玩家再落一子是否勝利,如果是,電腦在此落子,堵。

2 .中心位置可否落子?

3 .四個角可否落子?

4 .四條邊的中心位置。

電腦在每次落子前依次進行這樣的判段,即可實現不敗。**如下:

void

computermove

(char board[row]

[col]

,int row,

int col)

else

board[x]

[y]=

' ';

//還原}}

}if(board[1]

[1]==

' ')

//如果中間可以落子,在中間落子

else

//如果四個角可以落子,在四個角上落子。}}

x =rand()

% row;

//四個邊的中間隨機落子,0—2

y =rand()

% col;

if(board[x]

[y]==

' ')}}

}

3 判斷勝負

判斷勝負只會出現四種情況,用iswin()函式來判斷返回值型別為char,返回『x』代表玩家贏,返回『0』代表電腦贏,返回『q』代表平局,返回『 』代表繼續。這裡判斷勝負的辦法很愚蠢,即對每一條直線進行判斷,橫豎斜一共八條,如果相同,將直線上任意元素返回。如果沒有分出勝負,接著判斷是否為平局,即沒有元素為『 』,若不是平均,繼續。

三子棋遊戲

首先介紹一下三子棋遊戲規則 這是乙個玩家和電腦對戰的三子棋遊戲 棋盤如上圖所示,三個棋子連在一起則勝利 下面就是用c語言實現的方法 建立棋盤 利用二維陣列來實現乙個棋盤,棋盤剛開始是沒有任何棋子的,將二維陣列所有元素初始化為空格即可 玩家下棋 玩家輸入棋盤中的對應座標來下棋,下棋時需要考慮輸入座標合...

三子棋遊戲

閒來無事,竟意外發現了三子棋遊戲,順便實現了這個過程,我們一起來看下。三子棋的實現需要的是五個函式,我用了initboard 初始化棋盤函式 display 列印棋盤函式 player 玩家 computer 電腦 check full 判斷棋盤是否已滿,從而判斷輸贏 game.h define c...

三子棋遊戲

遊戲部分思路 初始化棋盤 玩家下棋 輸出棋盤 判斷輸贏 電腦下棋 判斷輸贏 迴圈這部分,直到有人贏得比賽 效果圖 test,c原始檔 define crt secure no warnings include game.h void menu void game char win init boar...