C語言 三子棋的實現

2021-10-24 03:30:56 字數 4933 閱讀 5454

通過最近一段的學習,我掌握了c語言中的基本語法和語句,比如分支和迴圈語句、一維陣列和二維陣列、函式的建立和呼叫,為了更加靈活使用這些基礎知識,我決定用已學過的基礎知識編寫乙個三子棋小遊戲.

一、三子棋是什麼?

二、專案實現

三、總結

相比較三子棋,想必大家更加熟悉五子棋,但是他們的原理是一樣的。原理也比較簡單,就是兩個玩家執棋子在n*n的方格棋盤落子,哪個玩家落的棋子先連成一串(三子棋是三個為一串,五子棋是五個為一串),那麼該玩家就在該盤棋局獲得勝利。這裡的串可以是橫串,也可以是豎串,還可以是斜串。

原理介紹:

chess.h中包含整個專案所需要的標頭檔案和函式宣告以及所需要的巨集定義。

標頭檔案包括c語言常用的庫函式標頭檔案和產生隨機數所需要的time、stdlib標頭檔案。

巨集定義:

1)定義行數和列數:這是對棋盤的大小的定義。

2)定義落子:我們定義玩家執黑子,用『x』表示。電腦執白子,用『0』表示。

3)函式宣告:我依次宣告的函式有遊戲函式game、面板初始化函式initboard、面板顯示函式showboard、玩家落子函式playermove、電腦落子函式computermove、棋局輸贏判斷函式judgeresult。

**如下:

#ifndef _chess_h_

#define _chess_h_

#include

#include

#include

//使用一些常見的功能函式,如動態儲存分配。

//隨機數:生成不同的隨即數序列使用rand是要使用srand來為rand生成隨機數序列設定起始點

//也要用到#include

#include

//使用前時鐘做種子

#pragma warning(disable:4996)

#define row 3

#define col 3

#define black_piece 'x'

#define white_piece 'o'

void

game()

;void

initboard

(char board[

][col]

,int row,

int col)

;void

showboard

(char board[

][col]

,int row,

int col)

;int

playermove

(char board[

][col]

,int row,

int col)

;void

computermove

(char board[

][col]

,int row,

int col)

;char

judgeresult

(char board[

][col]

,int row,

int col)

;#endif

所實現功能介紹:

chess.h此部分**所實現的功能是c語言標頭檔案的呼叫和專案所用到的函式宣告。

原理介紹:

main.c是整個專案的主函式。因為**執行是順序執行,因此此部分**邏輯主要是運用了switch語句。根據玩家的意願執行不同的選擇執行不同的語句。其中定義了quit是為了更高效的執行while迴圈語句。

**如下:

#include

"chess.h"

void

menu()

intmain()

}system

("pause");

return0;

}

所實現功能介紹:

main.c其主要是提供專案執行的主邏輯,以及再執行不同語句的時候提供所呼叫函式的介面。

原理介紹:

chess.c中包含專案中所用到函式的實現。

棋盤初始化函式 initboard:通過遍歷二維陣列,將整個面板初始化。

電腦落子函式computermove:電腦落子利用產生的隨機數加判斷該位置是否為空進而確認是否落子。為防止該隨機值越界,我們讓電腦產生的隨機值對行數和列數進行取餘運算。

玩家落子函式playermove:因為我們設定的遊戲是三子棋,所以對玩家落子的座標限制在了3*3的棋盤內部了,如果輸入的座標超過此棋盤邊界遊戲會報錯。報錯的兩種情況如下:5.1)若玩家落子的位置不是空位置,則返回值為2,報錯提示資訊為位置已被占用。5.2)若玩家落子的地方為空,則可以成功落黑子『x』,否則返回值為1,即玩家輸入的座標越界,報錯提示資訊為輸入座標有誤。

判斷函式judgeresult:用for迴圈分別遍歷每一行每一列,主對角線,副對角線是否三子成串,如若三子成串,則返回其中任意一位置的棋子(『x』或者『0』)。若玩家和電腦落子完畢的情況下,棋盤還有空位置,則該盤棋局為平局。除此之外,則必有空位置還可以落子,則可進行下一步。

遊戲主函式game:

7.1)呼叫棋盤。

7.2)棋盤初始化

7.3)定義乙個落子返回值,以便後續玩家或電腦落子時的判斷。

7.4)種子產生隨機值,展示棋盤方便玩家落子。

7.5)利用while迴圈首先判斷玩家輸入的座標是否有效。若有效,則判斷輸贏,並返回對應得落子,若非平局也無勝負,也執行下一步-------電腦落子。

7.6)電腦落子完成後繼續進行棋局判斷,若無勝負,則繼續讓玩家落子,如此迴圈,直到賽出勝負或者平局,迴圈結束。

**如下:

#include

"chess.h"

void

initboard

(char board[

][col]

,int row,

int col)}}

void

showboard

(char board[

][col]

,int row,

int col)

printf

("|");

printf

("\n");

for(

int i =

0; i < row; i++

)printf

("-----------------\n");

}int

playermove

(char board[

][col]

,int row,

int col)

board[x -1]

[y -1]

= black_piece;

return0;

}return1;

//使用者輸入座標有誤

}//1)使用者贏----返回black_piece 'x'

//2)電腦贏----返回white_piece 'o'

//3)平局------返回『e』

//4)next------返回『n』

char

judgeresult

(char board[

][col]

,int row,

int col)

}for

(i =

0; i < col; i++)}

if(board[0]

[0]!=

' '&& board[1]

[1]&& board[1]

[1]== board[2]

[2])

if(board[0]

[2]!=

' '&& board[0]

[2]== board[1]

[1]&& board[1]

[1]== board[2]

[1])

for(i =

0; i < row; i++)}

}return

'e';

}void

computermove

(char board[

][col]

,int row,

int col)

//讓電腦隨機走,因為一開始各自絕對不會是滿的,

}printf

("computer ... done!\n");

sleep

(1000);

}void

game()

elseif(

2== type)

else

result =

judgeresult

(board, row, col);if

(result !=

'n')

computermove

(board, row, col)

; result =

judgeresult

(board, row, col);if

(result !=

'n')

}showboard

(board,row,col)

;switch

(result)

}

所實現功能介紹:

chess.c**塊所實現的是各個自定義函式的實現,其中最重要的一塊是game函式的實現,其涉及到的其他函式的呼叫和返回值比較多,需要細心思考裡面的內在邏輯,做到嚴絲合縫,環環相扣。

此次三子棋小專案所設計到的基礎知識雖然不多,但是對於前期學過知識的要求比較高,內在邏輯也比較嚴密,需要靜下心來耐心思考。從專案建立,到原始檔,標頭檔案新增,以及專案主邏輯實現,在標頭檔案宣告,專案呼叫函式的定義,每一步都是對自己所學知識的複習和提高,所謂的溫故而知新或許就是如此。細節決定成敗,此次專案有不少細節的地方值得思考和借鑑。

C語言三子棋實現

標頭檔案 ifndef game h define game h include time.h include stdlib.h include string.h include stdio.h define rows 3 define cols 3 void init board char arr...

C語言 三子棋的實現

include include include define row 3 define col 3 void initboard char board row col int row,int col 列印空格 void displayboard char board row col int row,...

C語言 三子棋

使用工具 vs2017 分為三部分 game.h 函式宣告 game.c 實現函式功能 test.c main函式 棋盤為3 3的矩陣 規則 1.每回合玩家與電腦只能放置一枚棋子 2.已有棋子的位置不能再放置棋子 3.若有一方的三枚棋子可連城一條直線,則勝利 4.若棋盤棋子已經布滿,但是雙方沒有一方...