一、簡介
井字棋是乙個很古老很簡單的遊戲,兩名玩家在乙個3x3的網格上畫上自己的圖示,每回合玩家只能選擇乙個格仔,率先將三個自己圖示連成一條直線的玩家獲勝(如果在九個格仔都被填充後仍沒有獲勝者,則判為平局。
本遊戲用unity的imgui實現。
二、實現效果
三、具體實現
1. 基本資料
private
int[
,] board =
newint[3
,3];
//棋盤,0、1、2分別代表空、玩家1佔據、玩家2佔據
private
int turn =0;
//0表示當前為玩家回合,1表示人機回合(用於人機模式)
private
int square_size = screen.width /10;
//乙個格仔的尺寸
private
int menu_width = screen.width /
5, menu_height = screen.width /10;
//主選單每乙個按鍵的寬度和高度
private
int mode =0;
//根據不同mode顯示不同場景
/* 0 主選單
1 玩家vs玩家
2 玩家vs人機
*/private
guistyle bigstyle, blackstyle;
//自定義字型格式
public
texture2d empty, icon1, icon2;
//不同玩家的圖示(圈圈和勾勾)
public
float timer;
//定時器,用於模擬人機的延遲
public
float default_timer =
0.5f
;//預設定時器,用於給timer賦值
2. 初始化
初始化的內容主要放在 start 函式中,這個函式在開始執行時執行。
timer = default_timer;
//大字型初始化
bigstyle =
newguistyle()
; bigstyle.normal.textcolor = color.white;
bigstyle.normal.background =
null
; bigstyle.fontsize =50;
//black
blackstyle =
newguistyle()
; blackstyle.normal.textcolor = color.black;
blackstyle.normal.background =
null
; blackstyle.fontsize =
50;
3. 實現ongui函式
ongui函式是使用imgui程式設計的關鍵函式,它在執行時的每幀執行一次,所以我們要讓這個函式幫我們畫出每一幀的內容。
void
ongui()
}
根據我們在基本資料中對mode(模式)的定義,ongui可以在不同mode下畫出相應的介面,分別是主選單、玩家vs玩家、玩家vs人機。
主選單的組成比較簡單,接下來主要介紹後兩種模式的實現。
4. 玩家vs玩家
在這個遊戲中有兩種move,一種是玩家move,另一種是人機move(用於人機模式),它們分別定義了玩家和人機的行為(即選擇哪乙個格仔進行填充)。在玩家vs玩家模式中顯然只有玩家move,所以playervsplayer()僅僅做了一件事情——呼叫playermove()。
前面我們介紹過turn這個變數,它表示「輪到誰落子了」,比如0代表等待玩家1落子,1代表等待玩家2落子,通過這個變數的值的切換,可以只用乙個函式playermove()同時模擬兩個玩家的move。
for
(int i =
0; i <3;
++i)
break
;case1:
//畫上玩家1的圖示
gui.
button
(new
rect
(screen.width /2+
(i -
1.5f
)* square_size, screen.height /2+
(j -
1.5f
)* square_size, square_size, square_size)
, icon1)
;break
;case2:
//畫上玩家2的圖示
gui.
button
(new
rect
(screen.width /2+
(i -
1.5f
)* square_size, screen.height /2+
(j -
1.5f
)* square_size, square_size, square_size)
, icon2)
;break;}
}}checkstate()
;
這段**很好懂,除了最後呼叫的checkstate函式,這是判定遊戲狀態的關鍵函式。
在遊戲進行過程中,程式需要判定什麼時候哪個玩家贏了,什麼時候兩個玩家都無法再落子了(即平局),甚至人機的走法也要根據下一步可能的狀態來決定(這部分後邊講)。這些邏輯都通過checkstate來實現。所以,checkstate主要做的事情是
判斷當前玩家是否勝利可以通過檢測每一行、每一列,以及對角線是否有三個相同圖示連在一起,如果存在,則判定該圖示對應的玩家勝利。
判斷是否平局更簡單了,如果當前所有格仔都被填充了,且沒有玩家勝利,則為平局。
5. 玩家vs人機
人機操作與玩家操作的不同在於人機需要通過演算法來選擇乙個合適的格仔進行填充。
這裡運用了乙個簡單的演算法,可以分為三輪:
6. 專案位址
github鏈結
python井字棋 用python井字棋
上篇文章 python 井字棋 文本版 上 電腦端下棋策略是隨機的,有哪些位置可下棋,就隨機選擇乙個位置 實際中是不存這麼傻的對手的,賦予電腦乙個正常的智商還是很有必要的 至少當對手下一步要贏了,我們應該馬上堵住哪個位置 如果電腦自己能贏了,那就應該下能夠贏的位置 如果雙方都贏不了,那就找乙個比較好...
C 實現井字棋遊戲
初步實現雙玩家輸入,操作遊戲 下一步將實現人機博弈 include lwww.cppcns.comt iostream using namespace std void player1 void 玩家1輸入 操作 函式 void player2 void 玩家2輸入 操作 函式 void game ...
井字棋遊戲
三連棋遊戲 兩人輪流在印有九格方盤上劃 或 o 字,誰先把三個同一記號排成橫線 直線 斜線,即是勝者 程式提供隨機演算法和智慧型演算法兩種ai,隨機演算法使用隨機數隨意選擇棋盤上的位置,智慧型演算法通過對每隔落子位置權重的計算,選取最優的落子點。include include include inc...