真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語言小游戲---三子棋-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)公司是一家從事企業(yè)網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、做網(wǎng)站、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)制作的專業(yè)網(wǎng)絡(luò)公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)近1000家。

1.數(shù)據(jù)的定義與函數(shù)的搭建

2.菜單打印?

3.初始化和打印棋盤

1.初始化棋盤

2.打印棋盤

4.游戲落子

? 1.玩家落子

? 2.電腦落子

5.判斷勝負(fù)

6.主函數(shù)設(shè)計(jì)

7.游玩演示

8.未來展望

9.完整代碼


1.數(shù)據(jù)的定義與函數(shù)的搭建

? 我們知道,三子棋的棋盤是一個(gè)3X3的棋盤,棋盤上的每個(gè)點(diǎn)代表一個(gè)棋子。因此我們可以用一個(gè)3X3的的二維數(shù)組來存儲(chǔ)棋盤上每個(gè)點(diǎn)的棋子。而棋盤的行數(shù)和列數(shù),我們使用宏定義的方式進(jìn)行實(shí)現(xiàn)。除此之外,當(dāng)游戲出現(xiàn)勝負(fù)時(shí),我們需要?jiǎng)?chuàng)建一個(gè)變量來表示不同的游戲結(jié)果。

#define ROW 3
#define COL 3
char board[ROW][COL];    //棋盤上的棋子

char ret = 'c';

//ret=='c' 表示游戲繼續(xù)
//ret=='*' 表示玩家勝利
//ret=='#' 表示電腦勝利
//ret=='p' 表示游戲平局

我們按照模塊化編程的思路將游戲的邏輯分成各個(gè)模塊并封裝成函數(shù)?,如下:

//打印菜單
void menu();

//初始化數(shù)組
void InitBoard(char board[ROW][COL], int row, int col);

//打印棋盤
void PrintBoard(char board[ROW][COL], int row, int col);

//玩家下棋
void Player(char board[ROW][COL], int row, int col);

//電腦下棋
void Computer(char board[ROW][COL], int row, int col);

//判斷勝負(fù)
char Judge(char board[ROW][COL], int row, int col);
2.菜單打印?

? 一個(gè)小游戲肯定少不了一個(gè)菜單,在菜單界面,用戶可以選擇開始游戲或退出游戲,我們?cè)O(shè)計(jì)的菜單如下:

當(dāng)用戶輸入1時(shí),程序進(jìn)入game()函數(shù),開始游戲,當(dāng)輸入0時(shí),結(jié)束游戲。

3.初始化和打印棋盤 ????????1.初始化棋盤

? 當(dāng)用戶選擇開始游戲后,在游戲開始前,我們需要對(duì)空棋盤進(jìn)行初始化,我們使用空格當(dāng)作占位符可以使得棋盤效果更加美觀。

void InitBoard(char board[ROW][COL], int row, int col)   //打印棋盤
{
    //用循環(huán)遍歷的方式
	for (int i = 0; i< row; i++)
	{
		for (int j = 0; j< col; j++)
		{
			board[i][j] = ' ';
		}
	}
    //用內(nèi)存設(shè)置的方式
	//memset(&board[0][0], ' ', row * sizeof(*board));
}
2.打印棋盤

? 通過循環(huán)遍歷二維數(shù)組我們可以將棋盤打印出來,為了使棋盤更加美觀,我們可以使用一些空格和符號(hào)使棋盤上的棋子分隔開來。

void PrintBoard(char board[ROW][COL], int row, int col)   //打印棋盤
{
	for (int i = 0; i< row; i++)
	{
		for (int j = 0; j< col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j< col - 1)       //最后一列不打印|
			{
				printf("|");
			}
		}
		printf("\n");
		if (i< row - 1)          //最后一行不打印---
		{
			for (int j = 0; j< col; j++)
			{
				printf("---");
				if (j< col - 1)        
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}

最終效果如下所示(為了充分展示效果,我們打印10X10棋盤):

4.游戲落子 ? ? ? ? 1.玩家落子

? 進(jìn)入Player函數(shù)之后,玩家就可以選擇落子的坐標(biāo),三子棋的落子規(guī)則特別簡(jiǎn)單,只要落子的坐標(biāo)在棋盤內(nèi)且落子位置不存在其他棋子即可。我們可以設(shè)計(jì)一個(gè)死循環(huán),當(dāng)滿足落子條件時(shí)跳出循環(huán),否則提示用戶輸入錯(cuò)誤并讓用戶重新輸入。如下:

void Player(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走\(yùn)n");
	while (1)
	{
		printf("請(qǐng)輸入要落子的坐標(biāo),用空格隔開:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x<= row && y >= 1 && y<= col)
		{
			if (board[x - 1][y - 1] == ' ')    //符合落子規(guī)則
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐標(biāo)被占用,請(qǐng)重新輸入\n");
			}
		}
		else
		{
			printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
		}
	}
}
? 2.電腦落子

? 對(duì)于電腦的落子,我們可以采用控制生成隨機(jī)數(shù)的方式來隨機(jī)獲取在棋盤范圍內(nèi)的坐標(biāo)值。我們同樣設(shè)置死循環(huán),如果生成的隨機(jī)數(shù)坐標(biāo)合法,則進(jìn)行落子并跳出循環(huán),否則重新獲取隨機(jī)數(shù)直到合法。如下:

void Computer(char board[ROW][COL], int row, int col)     //電腦落子
{
	printf("電腦走\(yùn)n");
	while (1)
	{
		int x = rand() % row;     //獲取在棋盤范圍內(nèi)坐標(biāo)
		int y = rand() % col;
		if (board[x][y] == ' ')   //沒有占用
		{
			board[x][y] = '#';
			break;
		}
	}
}

5.判斷勝負(fù)

? 三子棋的勝負(fù)只需要判斷是否出現(xiàn)三子連珠的情況就行了。三子連珠有三種情況,分為行連珠,列連珠和對(duì)角線連珠。由于玩家落子為*,電腦落子為#,與我們起初設(shè)定的勝負(fù)返回值相對(duì)應(yīng),所以如果出現(xiàn)連珠的情況則直接返回連珠的棋子。而如果棋盤的棋子滿了就返回p表示平局,如下:

char Judge(char board[ROW][COL], int row, int col)
{
	int flag = 0;          //判斷棋盤是否滿了
	//判斷行
	for (int i = 0; i< row; i++)      
	{
		int j = 0;
        //三子連珠,\分行符防止一行過長
		if (board[i][j] == board[i][j + 1] \
            && board[i][j + 1] == board[i][j + 2]\
            && board[i][j]!=' ')
			return board[i][j];
	}
	//判斷列
	for (int j = 0; j< col; j++)    
	{
		int i = 0;
        //三子連珠
		if (board[i][j] == board[i+1][j] \
            && board[i+1][j] == board[i+2][j] \
            && board[i][j] != ' ')
			return board[i][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];
	}
	//判斷平局
	for (int i = 0; i< row; i++)
	{
		for (int j = 0; j< col; j++)
		{
			if (board[i][j] == ' ')
			{
				flag = 1;    //棋盤未滿,標(biāo)志位置1
			}
		}
	}
	if (flag)
	{
		return 'c';     //繼續(xù)游戲
	}
	else
	{
		return 'p';     //平局
	}
}
6.主函數(shù)設(shè)計(jì)

? 主函數(shù)依舊采用do...while循環(huán)來實(shí)現(xiàn)游戲的循環(huán)。每當(dāng)游戲結(jié)束后,回到打印菜單處讓玩家選擇是否繼續(xù)游戲,使用switch選擇語句根據(jù)玩家的選擇進(jìn)入不同的分支。如果玩家選擇0退出,則跳出循環(huán),程序結(jié)束。代碼如下:

int main()
{
	srand((unsigned int)time(NULL));    //設(shè)置隨機(jī)種子,供后續(xù)使用
	int input = 0;
	do
	{
		menu();
		printf("請(qǐng)選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入有誤,請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
	return 0;
}

而對(duì)于game()函數(shù),就是負(fù)責(zé)把各個(gè)功能模塊按照一定順序整合起來,實(shí)現(xiàn)一個(gè)完整的三子棋邏輯,如下:

void game()
{
	char ret = 'c';    
	char board[ROW][COL];
	InitBoard(board, ROW, COL);  
	PrintBoard(board, ROW, COL); 
	while (1)
	{
		Player(board, ROW, COL);  
		PrintBoard(board, ROW, COL);
		ret=Judge(board, ROW, COL);   //每次下棋完都需判斷勝負(fù)
		if (ret != 'c')  //游戲結(jié)果出現(xiàn),跳出循環(huán)
		{
			break;
		}
		Computer(board, ROW, COL);
		PrintBoard(board, ROW, COL);
		ret=Judge(board, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家獲勝\n");
	}
	else if (ret == '#')
	{
		printf("電腦獲勝\n");
	}
	else
	{
		printf("平局\n");
	}
}
7.游玩演示

? 運(yùn)行游戲,打印菜單,選擇1開始游戲,打印棋盤提示用戶輸入坐標(biāo):

? 每次輸入坐標(biāo)后會(huì)將棋盤打印出來,然后電腦自動(dòng)落子,并再次打印棋盤:?

當(dāng)輸入非法時(shí)會(huì)提醒用戶重新輸入:

? 按照玩家走->電腦走->玩家走的順序不斷循環(huán),直到分出勝負(fù),打印信息和菜單:

此時(shí)選擇1可以繼續(xù)游戲,選擇0則退出游戲:

8.未來展望

目前,此游戲的功能相對(duì)簡(jiǎn)單,未來準(zhǔn)備進(jìn)行以下兩點(diǎn)改進(jìn):


1.將游戲做成更精美的圖形界面

2.設(shè)計(jì)算法使得電腦智能下棋,而不是通過隨機(jī)數(shù)落子

9.完整代碼

百度網(wǎng)盤鏈接:

鏈接:https://pan.baidu.com/s/1pgiwTVdNpvgPFPLuDuYb4Q?
提取碼:2003


以上,就是本期的全部?jī)?nèi)容。

制作不易,能否點(diǎn)個(gè)贊再走呢qwq

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


標(biāo)題名稱:C語言小游戲---三子棋-創(chuàng)新互聯(lián)
文章位置:http://weahome.cn/article/djedhj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部