国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

三子棋游戲設(shè)計(jì)及代碼實(shí)現(xiàn)

Ku_Andrew / 3152人閱讀

摘要:三子棋三子棋游戲介紹規(guī)則游戲設(shè)計(jì)思路代碼分析文件代碼分析。玩家下棋實(shí)現(xiàn)。三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋圈圈叉叉一條龍井字棋等。落子后打印棋盤以顯示。假設(shè)平局時判定輸贏的函數(shù)返回后面代碼實(shí)現(xiàn)時詳細(xì)講。

?三子棋游戲介紹

是黑白棋的一種。
三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。
將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了。但是,有很多時候會出現(xiàn)和棋的情況。

?規(guī)則?

如果兩個人都掌握了技巧,那么一般來說就是平(和)棋。一般來說,第二步下在中間最有利(因?yàn)榈谝徊讲荒軌蛳略谥虚g),下在角上次之,下在邊上再次之。最大的好處就是隨便找個地方就可以玩這個簡單而有趣的游戲了。

?游戲設(shè)計(jì)思路

  1. 首先需要一個菜單欄,供玩家選擇進(jìn)入游戲或者退出游戲。
  2. 這里提供選擇:
    • 進(jìn)入游戲
    1. 退出游戲

其他輸入 - 重新選擇(循環(huán)實(shí)現(xiàn))

在進(jìn)入游戲后:

將游戲的實(shí)現(xiàn)使用到的函數(shù)封裝在game.c文件中。

函數(shù)實(shí)現(xiàn)功能:

  1. 制作一個棋盤。

如下:

可通過函數(shù)中循環(huán)控制實(shí)現(xiàn)。

制作棋盤分為:

  • 將棋盤初始化。
  • 將棋盤打印在控制臺。
  1. 模擬下棋對戰(zhàn)過程:
  • 由玩家先手落子。

落子后打印棋盤以顯示。

  • 電腦自動隨機(jī)落子。

直到某一方勝利或者和棋。

  1. 判斷游戲輸贏情況。

通過行、列、對角線落子相同形式判別勝利。


因?yàn)橐粋€程序需要對實(shí)現(xiàn)功能的部分進(jìn)行封裝,所以我們在這里將整個程序分為3個文件:

  1. test.c文件 - 功能是實(shí)現(xiàn)進(jìn)入主頁面并實(shí)現(xiàn)調(diào)用各種函數(shù)。
  2. game.c文件 - 功能是實(shí)現(xiàn)各個函數(shù)的邏輯,這也是進(jìn)行封裝的目的:保留實(shí)現(xiàn)邏輯,只展示功能實(shí)現(xiàn)。
  3. game.h文件 - 功能是存放預(yù)編譯指令、聲明指令、全局變量等等。


?代碼分析?

?1. test.c文件代碼分析。

?開始游戲。

游戲開始時,要確保4點(diǎn):

  1. 玩家輸入1 - 進(jìn)入游戲。
  2. 玩家輸入0 - 退出游戲。
  3. 玩家輸入其他 - 重新輸入。
  4. 游戲結(jié)束后可以再次進(jìn)行選擇是否繼續(xù)游戲。
int main(){	int input = 0;	do	{		menu();		printf("請選擇:>");		scanf("%d", &input);		switch (input)		{		case 1:			game();			break;		case 0:			printf("您已退出游戲。/n");			break;		default:			printf("選擇錯誤,請重新輸入。/n");			break;		}	} while (input);		return 0;}

?菜單顯示。

這里只需要打印一個簡易菜單即可,如果有前端知識可以設(shè)計(jì)出更好的界面。

void menu(){	printf("**********************************/n");	printf("************  1.play  ************/n");	printf("************  0.exit  ************/n");	printf("**********************************/n");}

實(shí)現(xiàn)代碼效果:

  1. 玩家輸入1:

  1. 玩家輸入0:


3. 玩家輸入其他:

上面展示了玩家輸入0,1,其他時的不同效果。

如輸入其他時,會通過循環(huán)一直輸入,直到輸入(0/1)時,進(jìn)入游戲或者退出游戲。

?進(jìn)入游戲。

在進(jìn)入游戲后,需要通過對不同的函數(shù)進(jìn)行封裝實(shí)現(xiàn),完成我們想要的功能:

  1. 初始化棋盤。
  2. 實(shí)現(xiàn)打印棋盤的函數(shù)。
  3. 人機(jī)循環(huán)對弈直到分出結(jié)果。

第三點(diǎn)需要注意:

因?yàn)椴恢朗裁磿r候分出結(jié)果,所以需要在每一次下完棋之后進(jìn)行判斷是否分出結(jié)果。

結(jié)果的可能有4種:

  1. 玩家贏。 – 假設(shè)玩家棋子為 ‘ * ’;
  2. 電腦贏。 – 假設(shè)電腦棋子為 ‘ # ’;
  3. 平局。 – 假設(shè)平局時判定輸贏的函數(shù)返回 ‘ C ’;
    (后面代碼實(shí)現(xiàn)時詳細(xì)講。)
  4. 游戲繼續(xù)。 – 假設(shè)函數(shù)返回 ‘ Q ’。
    (即棋盤未被填滿且尚未分出勝負(fù))
void game(){	//三子棋過程	char board[ROW][COL]; //棋盤數(shù)組	//初始化棋盤 - board的元素全都給空格	InitBoard(board, ROW, COL);	//打印棋盤	DisplayBoard(board, ROW, COL);	//下棋	char ret = 0;	while (1)	{		PlayerMove(board, ROW, COL);		DisplayBoard(board, ROW, COL);		ret = IsWin(board, ROW, COL);		if (ret != "C")		{			break;		}		ComputerMove(board, ROW, COL);		DisplayBoard(board, ROW, COL);		ret = IsWin(board, ROW, COL);		if (ret != "C")		{			break;		}	}	if (ret == "*")	{		printf("玩家贏/n");	}	else if (ret == "#")	{		printf("電腦贏/n");	}	else	{		printf("平局/n");	}}

這里將不同函數(shù)實(shí)現(xiàn)的功能一一說明:

  • 初識化棋盤。
InitBoard(board, ROW, COL);

整個棋盤是通過一個二維數(shù)組實(shí)現(xiàn)的,棋盤初始化即指將二維數(shù)組中的所有元素置成空格,因?yàn)榭崭翊蛴≡诳刂婆_上是不可見的。

  • 打印棋盤。
DisplayBoard(board, ROW, COL);

因?yàn)槠灞P初始化之后全部是空格,是不可見的,所以我們需要打印棋盤的函數(shù)對棋盤做一些控制,讓他變成我們希望的樣子。

實(shí)現(xiàn)模板:

  • 開始下棋。

下棋部分又分為玩家下棋和電腦下棋。

  1. 玩家下棋。
  2. 電腦下棋。
PlayerMove(board, ROW, COL);  //玩家下棋ComputerMove(board, ROW, COL);  //電腦下棋

二者的邏輯實(shí)現(xiàn)不同,所以封裝為不同的函數(shù)實(shí)現(xiàn)。

當(dāng)然,在實(shí)現(xiàn)完下棋之后需要再次調(diào)用棋盤打印函數(shù),一來一回的在界面上出現(xiàn),增加代碼的趣味性。

  • 判斷輸贏函數(shù)。
ret = IsWin(board, ROW, COL);

這個函數(shù)需要有返回值來告訴我們游戲的結(jié)果,四種結(jié)果上面已經(jīng)提到過。

1. 玩家贏。 – 假設(shè)玩家棋子為 ‘ * ’;
2. 電腦贏。 – 假設(shè)電腦棋子為 ‘ # ’;
3. 平局。 – 假設(shè)平局時判定輸贏的函數(shù)返回 ‘ C ’;
4. 游戲繼續(xù)。 – 假設(shè)函數(shù)返回 ‘ Q ’。
(即棋盤未被填滿且尚未分出勝負(fù))


?2. game.c文件代碼分析。

- ?初識化二維數(shù)組,即初始化棋盤。

只需要控制循環(huán)即可遍歷整個二維數(shù)組中的所有元素,將他們賦值為空格即可。

void InitBoard(char board[ROW][COL], int row, int col){	int i = 0;	for (i = 0; i < row; i++)	{		int j = 0;		for (int j = 0; j < col; j++)		{			board[i][j] = " ";		}	}}

這里提一下ROW和COL分別表示棋盤的長和寬,在game.h文件里聲明了,后面介紹,這里只需要直到他們的值都是3即可,因?yàn)槿悠迤灞P就是3?3的。

- ?打印棋盤函數(shù)。

打印函數(shù)實(shí)現(xiàn):

  1. 打印棋盤首先我們要把每一個數(shù)組里的元素打印出來,為了使顯示美觀,可控制為“ %c ”,%c左右兩側(cè)各加一個空格。
  2. 當(dāng)列數(shù)小于2時打印‘ | ’,這樣就會在每列打印時產(chǎn)生兩個豎分隔線。
  3. 當(dāng)行數(shù)小于2時打印‘ — ’,這樣就會在第一行第二行和第二行第三行之間打印一行橫分割線,在實(shí)現(xiàn)橫分割線的同時通過第二點(diǎn)實(shí)現(xiàn)打印
    ‘ - - - | - - - | - - - ’。
  4. 注意每一行打印完之后進(jìn)行換行操作。
void DisplayBoard(char board[ROW][COL], int row, int col){	int i = 0;	for (i = 0; i < row; i++)	{		//打印數(shù)據(jù)		int j = 0;		for (j = 0; j < col; j++)		{			printf(" %c ", board[i][j]);			if (j < col - 1)			{				printf("|");			}		}		printf("/n");		//打印分割行		if (i < row - 1)		{			for (j = 0; j < col; j++)			{				printf("---");				if (j < col - 1)				{					printf("|");				}			}		}		printf("/n");	}}

打印效果:


仔細(xì)看可以看的出來第一行:三個空格 + 一個 ‘ | ’ ,
第一行和第二行之間:三根短線 - - - + 一個 ‘ | ’

- ?玩家下棋實(shí)現(xiàn)。

玩家下棋要注意:

  1. 玩家視角的9宮格是從(1,1) - > (3,3)的,但是我們程序員視角的二維數(shù)組下標(biāo)是(0,0) -> (2,2)的,所以定義x和y坐標(biāo)之后,將其作為數(shù)組下標(biāo)時要減一。即
board[x - 1][y - 1];
  1. 玩家落子是手動輸入坐標(biāo)的,所以要考慮到代碼的健壯性,即玩家輸入的坐標(biāo)不在(1,1)->(3,3)之間的情況下,應(yīng)該輸出警告,并通過循環(huán)重新輸入。
  2. 還需要注意,下棋是一個雙向反復(fù)的過程,如果落子時落子的坐標(biāo)合法,但是該坐標(biāo)已經(jīng)被落過子了,則也應(yīng)該提出警告,并利用循環(huán)重新輸入。
void PlayerMove(char board[ROW][COL], int row, int col){	int x = 0;	int y = 0;	while (1)	{		printf("玩家走:/n");		printf("請輸入坐標(biāo):>");		scanf("%d %d", &x, &y); // 2 1 --> 1 0		if (x >= 1 && x <= row && y >= 1 && y <= col)		{			if (board[x - 1][y - 1] == " ")			{				board[x - 1][y - 1] = "*";				break;			}			else			{				printf("坐標(biāo)占用,超出范圍/n");			}		}		else		{			printf("坐標(biāo)非法,超出范圍/n");		}	}}

因?yàn)榇嬖谳斎胱鴺?biāo)落過子或者非法需要重新輸入的原因,所以這里的循環(huán)判定條件為1,直到成功落子才break跳出循環(huán)。

- ?電腦落子函數(shù)實(shí)現(xiàn)。

這里需要說明,該代碼是基于C語言實(shí)現(xiàn)的,電腦落子屬于人工智能及算法范疇,不予討論。
這里電腦落子通過時間軸生成偽隨機(jī)數(shù)進(jìn)行坐標(biāo)落子。

電腦落子不存在坐標(biāo)非法的情況,因?yàn)槲覀兛梢酝ㄟ^對其取模進(jìn)行控制。

但確實(shí)也會存在落子處被占用的情況,所以也需要利用循環(huán)重新隨機(jī)一個數(shù),所以隨機(jī)數(shù)代碼應(yīng)該放在循環(huán)體里面,這是一個小細(xì)節(jié),需要注意。

void ComputerMove(char board[ROW][COL], int row, int col){	printf("電腦走:>/n");	while (1)	{		int x = rand() % row;		int y = rand() % col;		if (board[x][y] == " ")		{			board[x][y] = "#";			break;		}	}}

如果成功找到位置,就將 ’ # "賦給該坐標(biāo)位置,然后break結(jié)束。

- ?判斷輸贏函數(shù)。

判斷輸贏有三種情況:

  1. 行相等。 - 通過循環(huán)實(shí)現(xiàn)。
  2. 列相等。 - 通過循環(huán)實(shí)現(xiàn)。
  3. 對角線相等 - 兩個對角線都要考慮。
  4. 需要多調(diào)用一個函數(shù)來判斷棋盤是否被下滿了。
    • 如果被下滿了,并且沒有出現(xiàn)贏家,則返回’ Q ’ - 表示平局。
    • 如果沒有被下滿,并且沒有出現(xiàn)贏家,則返回’ C ’ - 表示繼續(xù)游戲。
char IsWin(char board[ROW][COL], int row, int col){	//1.判斷輸贏	//2.判斷平局	//3.游戲繼續(xù)	//行	int i = 0;	for (i = 0; i < row; i++)	{		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != " ")		{			return board[i][0];		}	}	//列	for (i = 0; i < col; i++)	{		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != " ")		{			return board[0][i];		}	}	//對角線	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != " ")	{		return board[0][0];	}	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != " ")	{		return board[0][2];	}	//判斷平局	if (IsFull(board, row, col))	{		return "Q";	}	//游戲繼續(xù)	return "C";}

需要注意一個小細(xì)節(jié),判斷行、列、對角線相等時要判斷他們不等于’ ",即不為空格,因?yàn)槲覀兂跏蓟臅r候把所有元素都初始化為空格了,不然的話直接就判斷結(jié)束了,屬于bug代碼。

- ?在判斷輸贏函數(shù)中調(diào)用的判斷棋盤是否滿的函數(shù)。

注意問題:
只需要遍歷二維數(shù)組中的每一個元素,如果遇到了一個空格,則返回0,代表棋盤未滿,如果遍歷完所有元素之后都沒有發(fā)現(xiàn)空格,則代表棋盤已被下滿,返回1。

int IsFull(char board[ROW][COL], int row, int col){	int i = 0;	int j = 0;	for (i = 0; i < row; i++)	{		for (j = 0; j < col; j++)		{			if (board[i][j] == " ")			{				return 0; //不滿			}		}	}	return 1; //滿了}

需要注意的問題是返回值是0或者1,所以定義函數(shù)的類型是int類型。


?3. game.h代碼分析

這個文件放的是預(yù)編譯命令和聲明函數(shù)等等指令。

預(yù)處理命令包括:

  1. 文件包含。
  2. #define引用。
  3. 條件編譯。
#pragma once#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, int col);//玩家下棋void PlayerMove(char board[ROW][COL], int row, int col);//電腦下棋void ComputerMove(char board[ROW][COL], int row, int col);//判斷游戲輸贏//要返回4種不同的狀態(tài)//玩家贏 - "*"//電腦贏 - "#"//平局 - "Q"//繼續(xù) - "C"char IsWin(char board[ROW][COL], int row, int col);

因?yàn)閕s_full函數(shù)是在game.c文件中被調(diào)用并且是在game.c文件中能夠被定義的,所以不需要在game.h文件中聲明。

??總結(jié)

???以上就是本文全部內(nèi)容,整個游戲代碼源碼將會放在全文最后ps部分,如果有講的不對或者不充分的地方希望大家可以在評論區(qū)留言,如果覺得博主寫的還行可以留下各位的?點(diǎn)贊?+?關(guān)注?+?收藏?嗷~

??♂?PS(源代碼)

?test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){	printf("**********************************/n");	printf("************  1.play  ************/n");	printf("************  0.exit  ************/n");	printf("**********************************/n");}void game(){	//三子棋過程	char board[ROW][COL]; //棋盤數(shù)組	//初始化棋盤 - board的元素全都給空格	InitBoard(board, ROW, COL);	//打印棋盤	DisplayBoard(board, ROW, COL);	//下棋	char ret = 0;	while (1)	{		PlayerMove(board, ROW, COL);		DisplayBoard(board, ROW, COL);		ret = IsWin(board, ROW, COL);		if (ret != "C")		{			break;		}		ComputerMove(board, ROW, COL);		DisplayBoard(board, ROW, COL);		ret = IsWin(board, ROW, COL);		if (ret != "C")		{			break;		}	}	if (ret == "*")	{		printf("玩家贏/n");	}	else if 
                 
               
              

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121418.html

相關(guān)文章

  • 《C語言入門》三子C語言實(shí)現(xiàn)(詳細(xì)版)

    摘要:簡單介紹了三子棋原理后接下來為大家講解分步目標(biāo)及代碼如何實(shí)現(xiàn)。電腦下棋我們實(shí)現(xiàn)了玩家和電腦的下棋后,我們需要編寫一個函數(shù)來判斷雙方的輸贏。我們使用函數(shù)來實(shí)現(xiàn)這一目標(biāo)。 目錄 1.三子棋原理 2.分塊代碼實(shí)現(xiàn) 3.總結(jié) 1.首先向大家介紹一下三子棋的原理 首先我們需要有一個棋盤,初始時棋...

    妤鋒シ 評論0 收藏0
  • 用C語言實(shí)現(xiàn)三子

    摘要:文章目錄三子棋的設(shè)置的內(nèi)容設(shè)置的設(shè)置棋盤的內(nèi)容棋盤以及棋盤的初始化打印棋盤下棋步驟玩家下棋電腦下棋判斷是否勝利三子棋三子棋的規(guī)則是在的棋盤里,雙方輪流下子以和表示,先將個子連成一條線橫豎斜都可以的一方獲勝下面是三子棋語 ...

    vspiders 評論0 收藏0
  • 三子游戲

    摘要:三子棋小游戲三子棋游戲簡介一分析及實(shí)現(xiàn)棋盤落子判斷輸贏二程序演示三完整代碼總結(jié)三子棋游戲簡介這是一個簡單的三子棋小游戲,估計(jì)大家小時候都玩兒過,只要能連成三個,無論是行,列還是對角線,就可以勝利了。 ...

    liuyix 評論0 收藏0
  • 《C語言入門》掃雷小游戲C語言實(shí)現(xiàn)

    摘要:條消息語言入門三子棋語言實(shí)現(xiàn)詳細(xì)版的博客博客條消息語言入門三子棋語言實(shí)現(xiàn)詳細(xì)版的博客博客我們將雷盤初始化為統(tǒng)一的符號。 目錄 1.原理簡介 2.分布目標(biāo)及代碼實(shí)現(xiàn) 3.總結(jié) 1.原理簡介 ?首先我們需要一個空的雷盤,在其中隨機(jī)埋入十枚雷,當(dāng)我們排這顆雷時,若此位置為雷,則游戲失敗,若不...

    caige 評論0 收藏0
  • 三子(井字)】如何用C語言實(shí)現(xiàn)

    摘要:三子棋目錄一問題介紹三子棋,在民間又叫井字棋。因?yàn)槿藗冊谟瓮鏁r常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋 目錄 一、問題介紹 ? ? ? ? 三子棋,在民間又叫井字棋。因?yàn)槿藗冊谟瓮鏁r常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋的游戲規(guī)則十分的簡單: ...

    jsbintask 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<