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

資訊專欄INFORMATION COLUMN

哈哈哈~井字棋(無心版),快來初步感受一下代碼世界的樂趣吧

不知名網(wǎng)友 / 836人閱讀

摘要:文章目錄前言正文一,游戲?qū)崿F(xiàn)基本流程二游戲?qū)崿F(xiàn)步驟創(chuàng)建工程及分配功能給頭文件上內(nèi)容當(dāng)當(dāng)當(dāng),主函數(shù)出場(chǎng)游戲函數(shù)里面打印游戲菜單棋盤初始化打印棋盤玩家下棋電腦下棋判斷結(jié)果三游戲結(jié)果演示恭喜友友獲勝啦電腦獲勝,很遺憾,再接再厲

前言

Hello everyone! 好久不見,forever 又來了,最近挺忙的所以好久沒更新了,上次我介紹了函數(shù)相關(guān)知識(shí),然后這次我們中間來個(gè)小插曲,來給大家看看井字棋游戲哈!不過由于最近時(shí)間比較緊張,所以就給大家看看無心版井字棋游戲,哈哈哈哈!所謂無心版就是電腦下棋時(shí)沒有攜帶高級(jí)算法,不會(huì)和玩家進(jìn)行一場(chǎng)真正的博弈哈!當(dāng)然后面我還會(huì)繼續(xù)跟進(jìn),將這個(gè)無心版本升級(jí),讓玩家和電腦能夠針鋒相對(duì),體驗(yàn)體驗(yàn)?zāi)欠N刺激感哈!
所以今天大家先別著急,先隨 forever 一起去看看無心版本,其實(shí)看完簡(jiǎn)單的無心版本之后,大家也可以嘗試挑戰(zhàn)一下,去寫一寫攜帶高級(jí)算法,給電腦端附上高級(jí)智慧,此時(shí)電腦所表現(xiàn)出來的高級(jí)智慧是你給的,也就體現(xiàn)出你的智慧啦!聽完的友友們,是不是很想去試試哈!
接下來就跟著 forever 一起來感受感受井字棋的成長(zhǎng)歷程吧!

正文

一,游戲?qū)崿F(xiàn)基本流程

1、創(chuàng)建工程,首先考慮自己的整個(gè)工程需要由多少頭文件和源文件組成,forever 的詳細(xì)工程創(chuàng)建如下面分析;
2、對(duì)應(yīng)給每個(gè)文件分配什么作用,即給里面放什么內(nèi)容;
3、接下來放主函數(shù),以主函數(shù)為樹干,然后分枝開葉;
4、打印游戲菜單;
5、棋盤初始化;
6、打印棋盤;
7、開始下棋:倘若定義玩家先下棋;
8、其次電腦下棋;
9、判斷結(jié)果;
10、游戲結(jié)束。

二、游戲?qū)崿F(xiàn)步驟

1、創(chuàng)建工程及分配功能

forever 將整個(gè)程序分為兩個(gè)模塊:頭文件模塊和源文件模塊。頭文件模塊包含:game.h
(包含整個(gè)程序需要調(diào)用的頭文件、宏定義以及函數(shù)的聲明)
;源文件包含:main.cpp(放主函數(shù)的源文件)、game.cpp(游戲開始的源文件)、gamelogic.cpp(游戲整體邏輯框架源文件)、test.cpp(游戲具體操作內(nèi)容源文件)。

//頭文件模塊game.h   //包含整個(gè)程序需要調(diào)用的頭文件、宏定義以及函數(shù)的聲明//源文件模塊main.cpp   //放主函數(shù)(main函數(shù))game.cpp  //游戲開始的實(shí)現(xiàn)gamelogic.cpp  //游戲整體邏輯框架實(shí)現(xiàn)test.cpp  //游戲具體操作內(nèi)容實(shí)現(xiàn)

2、給頭文件上內(nèi)容

這里我就按順序?qū)?,先寫剛開始需要的,然后后面需要什么頭文件,forever 會(huì)依次在每一步里面添加哈!這里就先給一個(gè) 從頭到尾都需要的吧!

//game.h包含整個(gè)程序需要調(diào)用的頭文件、宏定義以及函數(shù)的聲明#include

3、當(dāng)當(dāng)當(dāng),主函數(shù)出場(chǎng)

//main.cpp放主函數(shù)(main函數(shù))#include "game.h"int main(){	game();//調(diào)用游戲函數(shù)出場(chǎng)啦!	return 0;}

4、游戲函數(shù)里面:打印游戲菜單

友友們!玩游戲肯定都知道游戲菜單哈!就是那個(gè)界面啦!不過這個(gè)菜單超級(jí)簡(jiǎn)單,只有游戲開始和游戲結(jié)束。

//game.cpp 游戲開始的實(shí)現(xiàn)#include "game.h"void meau(){	printf("—————— 0.exit ——————/n");	printf("—————— 1.play ——————/n");}

這里面除了打印菜單還有一個(gè)游戲開始的函數(shù)即上面提到的 game() 函數(shù),而此時(shí)頭文件里面便會(huì)有一個(gè)game()函數(shù)的聲明:

#includevoid game();//游戲總函數(shù)

而 game.cpp 里面的所有內(nèi)容是:

#include "game.h"//打印菜單void meau(){	printf("—————— 0.exit ——————/n");	printf("—————— 1.play ——————/n");}//游戲開始void game(){	unsigned int number = 0;//用unsigned 修飾保證輸入的是正整數(shù)	do	{		meau();//打印菜單		printf("請(qǐng)選擇:>");		scanf("%d", &number);		switch (number)		{		case 0:printf("注意休息,保護(hù)眼睛哈,游戲結(jié)束啦!/n");			break;		case 1:printf("打起精神,認(rèn)真思考哈,游戲開始啦!/n");			playgame();//游戲整體內(nèi)容框架			break;		default:			printf("這位友友有點(diǎn)皮喲,請(qǐng)選擇正確數(shù)字哈!/n");		}	} while (number);}

運(yùn)行相關(guān)結(jié)果:

5、棋盤初始化

這時(shí)就會(huì)創(chuàng)建一個(gè)二維字符數(shù)組來存入棋盤,因?yàn)楹竺孢@個(gè)二維字符數(shù)組會(huì)反復(fù)使用,所以此時(shí)字符數(shù)組的大小 forever 就用宏定義的方式給大家呈現(xiàn)出來吧!此時(shí)頭文件里面就會(huì)加上宏定義,當(dāng)然還有上面那個(gè) playgame() 函數(shù)的聲明:

#include#define LINE 3#define LIST 3void game();//游戲總函數(shù)void playgame();//游戲整體邏輯框架void Firstboard(char board[LINE][LIST], int line, int list);//初始化棋盤

宏定義的優(yōu)點(diǎn):
1、方便程序的修改;
2、提高程序的運(yùn)行效率;
宏定義的展開是在程序的預(yù)處理階段實(shí)現(xiàn)完成的,無需運(yùn)行時(shí)后分配內(nèi)存,能夠部分實(shí)現(xiàn)函數(shù)的功能卻沒有函數(shù)調(diào)用時(shí)候的壓棧等問題,效率高
3、增強(qiáng)代碼可讀性
4、增加代碼的靈活性

這里將棋盤全部初始化為空格:

void Firstboard(char board[LINE][LIST], int line, int list){	for (int i = 0; i < line; i++)	{		for (int j = 0; j < list; j++)		{			board[i][j] = " ";		}	}}

6、打印棋盤

這里頭文件就會(huì)聲明打印棋盤函數(shù):

#include#define LINE 3#define LIST 3void game();//游戲總函數(shù)void playgame();//游戲整體邏輯框架void Firstboard(char board[LINE][LIST], int line, int list);//初始化棋盤void printboard(char board[LINE][LIST], int line, int list);//打印棋盤

這里將棋盤打印呈現(xiàn)出來,首先給大家展示一個(gè)比較死板的版本:

void printboard(char board[line][list], int line, int list){	for (int i = 0; i < line; i++)	{		printf(" %c | %c | %c/n", board[i][0], board[i][1], board[i][2]);		if (i < line - 1)		{			printf("---|---|---/n");		}	}}

運(yùn)行結(jié)果:

這里的打印可以看出是那種簡(jiǎn)單粗暴直接式打印方法,當(dāng)然這種方法最直接,最簡(jiǎn)單,但也最死板,如果此時(shí)我們想打印更多棋盤格子呢?是不是就做不到啦,又得修改好多,按這種方法打印就要打印好多,實(shí)在是降低了代碼的靈活性。因此修改該代碼如下:

void printboard(char board[LINE][LIST], int line, int list){	int i = 0, j = 0;	for (i = 0; i < line; i++)	{		for (j = 0; j < list; j++)		{			printf(" %c ",board[i][j]);			if (j < list - 1)			{				printf("|");			}		}		printf("/n");		if (i < line - 1)		{			for (j = 0; j < list; j++)			{				printf("---");				if (j < list - 1)				{					printf("|");				}			}			printf("/n");		}	}}

運(yùn)行結(jié)果:

這里 forever 利用循環(huán)將整個(gè)代碼寫的靈活了,如果想要打印更多格子,直接對(duì)宏定義的量進(jìn)行改變就行啦!所以友友們以后寫代碼盡量去注重一下代碼的可讀性,觀賞性和靈活性,讓你的寫代碼的水準(zhǔn)更高,更牛哈!

7、玩家下棋

這里頭文件就會(huì)聲明玩家下棋函數(shù):

#include#define LINE 3#define LIST 3void game();//游戲總函數(shù)void playgame();//游戲整體邏輯框架void Firstboard(char board[LINE][LIST], int line, int list);//初始化棋盤void printboard(char board[LINE][LIST], int line, int list);//打印棋盤void playergame(char board[LINE][LIST], int line, int list);//玩家下棋

倘若我們規(guī)定玩家先下棋,那么這里我們就得開始實(shí)現(xiàn)玩家下棋啦!這里我們定義一下玩家用 * 當(dāng)棋子吧!

void playergame(char board[LINE][LIST], int line, int list){	printf("玩家走/n請(qǐng)輸入坐標(biāo):>");	int x = 0, y = 0;	while (1)	{		scanf("%d %d", &x, &y);		if (x >0 && x <= line && y >0 && y <= list)//x,y為1-3是方便玩家輸入		{			if (board[x - 1][y - 1] == " ")//這里x-1和y-1是為了對(duì)應(yīng)數(shù)組元素			{				board[x - 1][y - 1] = "*";				break;			}			else			{				printf("皮友友,該坐標(biāo)已有棋子,請(qǐng)重新下哈!/n");			}		}		else		{			printf("這位友友有點(diǎn)皮喲,請(qǐng)輸入正確范圍坐標(biāo)哈!/n");		}	}}

運(yùn)行結(jié)果:

8、電腦下棋

一如既往,頭文件會(huì)聲明電腦下棋函數(shù):

#include#include//rand()頭文件調(diào)用#include//time頭文件調(diào)用#define LINE 3#define LIST 3void game();//游戲總函數(shù)void playgame();//游戲整體邏輯框架void Firstboard(char board[LINE][LIST], int line, int list);//初始化棋盤void printboard(char board[LINE][LIST], int line, int list);//打印棋盤void playergame(char board[LINE][LIST], int line, int list);//玩家下棋void computergame(char board[LINE][LIST], int line, int list);//電腦下棋

此處電腦開始下棋啦!我們規(guī)定一下電腦下棋的棋子為 + 符號(hào)吧!

void computergame(char board[LINE][LIST], int line, int list){	printf("電腦走/n");	int x = 0, y = 0;	while (1)	{		x = rand() % line;//生成隨機(jī)數(shù)		y = rand() % list;		if (board[x][y] == " ")		{			board[x][y] = "+";			break;		}	}}

運(yùn)行結(jié)果:

x = rand() % line; //生成隨機(jī)數(shù): 這里是讓電腦下棋時(shí)生成隨機(jī)坐標(biāo),即隨機(jī)下棋,這也對(duì)應(yīng)了我們標(biāo)題里的無心版本啦!哈哈哈哈!就是沒有思維,隨機(jī)生成什么就是什么哈!當(dāng)然這里在使用rand() 時(shí),必須要在主函數(shù)里面使用一個(gè) srand((unsigned int) time (NULL)) ,如下展示:

int main(){	srand((unsigned int)time(NULL));	game();	return 0;}

9、判斷結(jié)果

這里就要在頭文件里聲明一個(gè)判斷是勝負(fù)的函數(shù):

#include#include//rand()頭文件調(diào)用#include//time頭文件調(diào)用#define LINE 3#define LIST 3void game();//游戲總函數(shù)void playgame();//游戲整體邏輯框架void Firstboard(char board[LINE][LIST], int line, int list);//初始化棋盤void printboard(char board[LINE][LIST], int line, int list);//打印棋盤char is_win(char board[LINE][LIST], int line, int list);//判斷輸贏void playergame(char board[LINE][LIST], int line, int list);//玩家下棋void computergame(char board[LINE][LIST], int line, int list);//電腦下棋void is_guo(char ret);//判斷最終結(jié)果

以上到這里就是頭文件中的所有內(nèi)容啦!

每下一步棋就需要判斷該局是否結(jié)束,若未結(jié)束則繼續(xù)互相博弈,若結(jié)束則還要判斷勝負(fù)或平局。因此一共有四種情況:
1、未結(jié)束繼續(xù)(返回 ‘w’)
2、結(jié)束后,玩家勝利(返回 ‘*’ )
3、結(jié)束后,電腦勝利(返回 ‘+’)
4、結(jié)束后平局(返回 ‘p’)

這里放判斷輸贏和最終結(jié)果的函數(shù):

//判斷輸贏char is_win(char board[LINE][LIST], int line, int list){	//判斷行	for (int i = 0; i < line; i++)	{		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != " ")		{			return board[i][1];		}	}	//判斷列	for (int j = 0; j < list; j++)	{		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != " ")		{			return board[1][j];		}	}	//判斷對(duì)角線	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1]!=" ")	{		return board[1][1];	}	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != " ")	{		return board[1][1];	}		if (is_full(board, line, list) == 1)	{		return "p";	}	return "w";}//判斷最終結(jié)果void is_guo(char ret){	if (ret == "*")	{		printf("恭喜友友,你勝利啦!/n");	}	else if (ret == "+")	{		printf("很遺憾,友友你輸啦!,再接再厲喲!/n");
            
                     
             
               

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

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

相關(guān)文章

  • 關(guān)于井字游戲自己解題思路.

    摘要:題目來源于面試公司先看看題目吧假設(shè)我們現(xiàn)在有一個(gè)的井字棋游戲,我們用一個(gè)二維數(shù)組代表棋盤,代表玩家下的棋子,代表玩家下的棋子,代表該格沒有棋子。 題目來源于面試公司,先看看題目吧 假設(shè)我們現(xiàn)在有一個(gè) 3 x 3 的井字棋游戲,我們用一個(gè)二維數(shù)組代表棋盤,’x’ 代表玩家 X 下的棋子,’o’ 代表玩家 O 下的棋子,’e’ 代表該格沒有棋子。例如:一個(gè)空白的棋盤以下面的二維數(shù)組表示: ...

    wums 評(píng)論0 收藏0
  • C語言實(shí)現(xiàn)入門級(jí)小游戲——三子(萬字長(zhǎng)篇)

    摘要:今天博主將為大家?guī)碚Z言入門級(jí)小游戲三子棋井字棋的詳細(xì)介紹,希望這篇文章對(duì)大家能有幫助。在這里,我們使用函數(shù)來實(shí)現(xiàn)這一功能。 ?? ? ??今天博主將為大家?guī)鞢語言入門級(jí)小游戲——三子棋(井字棋)的詳細(xì)介紹,希望這篇文章對(duì)大家能有幫助?。?? ? ? 在編程的學(xué)習(xí)過程中,編寫一些中這樣...

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

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

    jsbintask 評(píng)論0 收藏0
  • 【C語言實(shí)現(xiàn)井字及電腦落子優(yōu)化】

    摘要:如果上述兩種情況均不存在,當(dāng)發(fā)現(xiàn),位置是空時(shí),電腦先下這一步。其他情況均隨意落子。 朋友們,我們還記得以前上課經(jīng)常和同桌玩起井字棋,那么我們就當(dāng)我們回憶童年,現(xiàn)在也...

    he_xd 評(píng)論0 收藏0
  • Minimax 和 Alpha-beta 剪枝算法簡(jiǎn)介,以及以此實(shí)現(xiàn)井字游戲(Tic-tac-t

    摘要:我們?cè)谇拔闹锌紤]的那張圖就來自這篇文章,之后我們會(huì)用剪枝算法來改進(jìn)之前的解決方案。剪枝算法的實(shí)現(xiàn)接下來討論如何修改前面實(shí)現(xiàn)的算法,使其變?yōu)榧糁λ惴ā,F(xiàn)在我們已經(jīng)有了現(xiàn)成的和剪枝算法,只要加上一點(diǎn)兒細(xì)節(jié)就能完成這個(gè)游戲了。 前段時(shí)間用 React 寫了個(gè)2048 游戲來練練手,準(zhǔn)備用來回顧下 React 相關(guān)的各種技術(shù),以及試驗(yàn)一下新技術(shù)。在寫這個(gè)2048的過程中,我考慮是否可以在其中加...

    wemall 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<