c語(yǔ)言實(shí)現(xiàn)一個(gè)三子棋小游戲-創(chuàng)新互聯(lián)

在學(xué)習(xí)了數(shù)組之后,我們采用C語(yǔ)言來(lái)去實(shí)現(xiàn)一個(gè)三子棋小游戲,在開(kāi)始游戲之前要先有一個(gè)游戲的菜單來(lái)選擇是否進(jìn)入游戲,按 1?進(jìn)入游戲,按 0?退出程序,按其他數(shù)字則重新進(jìn)行輸入。這時(shí)我們應(yīng)該需要一個(gè)循環(huán)來(lái)進(jìn)行這段邏輯操作,想到了do....while循環(huán),能夠打印菜單,并且不進(jìn)入循環(huán),我們開(kāi)始實(shí)現(xiàn)基本的邏輯,代碼如下

成都創(chuàng)新互聯(lián)專(zhuān)注于泉州企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),商城開(kāi)發(fā)。泉州網(wǎng)站建設(shè)公司,為泉州等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
#includevoid menu()
{
	printf("******************\n");
	printf("***** 1.play *****\n");
	printf("***** 0.exit *****\n");
	printf("******************\n");

}

void game()
{
	printf("開(kāi)始游戲\n");
}
int main()
{
	int input = 0;
	do 
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
	
	return 0;
}

這時(shí),基本的邏輯已經(jīng)實(shí)現(xiàn),當(dāng)輸入1時(shí)進(jìn)入游戲,我們此時(shí)需要設(shè)計(jì)游戲的實(shí)現(xiàn)邏輯。三子棋需要3*3的方陣來(lái)進(jìn)行實(shí)現(xiàn),我們可以采用二維數(shù)組來(lái)初始化方陣,最開(kāi)始初始化為空格,當(dāng)玩家下棋時(shí),輸入要下棋的坐標(biāo)來(lái)進(jìn)行,隨后到電腦來(lái)下棋,電腦下棋就又遇到了我們的隨機(jī)數(shù)朋友,srang()函數(shù)和rand()函數(shù),具體用法見(jiàn)下方代碼

我們首先要先創(chuàng)建一個(gè)3*3的數(shù)組當(dāng)做棋盤(pán),為了達(dá)到空白棋盤(pán)的效果,先寫(xiě)一個(gè)初始化棋盤(pán)函數(shù)init_board();使用for循環(huán)來(lái)初始化棋盤(pán)中的元素為空格,代碼如下:

void init_board(char board[ROW][COL], int row, int col)//初始化棋盤(pán)
{
	int i = 0;
	for (i = 0; i< row; ++i)
	{
		int j = 0;
		for (j = 0; j< col; ++j)
		{
			board[i][j] = ' ';
		}
	}
}

初始化之后我們需要看看棋盤(pán)是什么樣,打印出來(lái)看一下,再寫(xiě)一個(gè)打印棋盤(pán)的print_board()函數(shù)代碼如下

void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i< row; i++)
	{
		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");
		}
	}

}

棋盤(pán)顯示如圖所示,為了能夠方便觀察,我們加入了一些橫線,此時(shí)棋盤(pán)就能夠正常去顯示了。這個(gè)時(shí)候就到了下棋的環(huán)節(jié)了,玩家下棋然后電腦下棋,首先玩家下棋,在玩家下棋的時(shí)候,玩家又不一定全部都了解數(shù)組下標(biāo)從0開(kāi)始的規(guī)則,所以在寫(xiě)程序時(shí)要考慮這個(gè)問(wèn)題,首先進(jìn)行行數(shù)和列數(shù)的輸入,在第一次輸入時(shí)時(shí)空白棋盤(pán),哪都能下,如果后邊再下,是否需要判斷哪些位置已經(jīng)被占,哪些位置空白呢?代碼如下

void player_move(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	while (1)
	{
		printf("請(qǐng)輸入坐標(biāo)\n");
		int x = 0;
		int y = 0;
		scanf("%d %d", &x, &y);
		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)已經(jīng)被占用\n");
		}
		else
			printf("坐標(biāo)非法\n");
		

	}
}

采用一個(gè)while循環(huán),只有輸入正確才會(huì)停止,否則會(huì)顯示錯(cuò)誤信息,讓玩家重新輸入。下面就到了電腦下棋的環(huán)節(jié),電腦下棋時(shí)要生成兩個(gè)隨機(jī)數(shù),我們需要使用srand()函數(shù)和rand()函數(shù),但產(chǎn)生的隨即數(shù)字較大,我們需要去%上行數(shù)和列數(shù),保證坐標(biāo)的合法性,這個(gè)產(chǎn)生的數(shù)字也要進(jìn)行判斷,判斷位置是否允許下棋,代碼如下

void computer_move(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;
		}

	}
}

邏輯依舊比較簡(jiǎn)單,但是在每一次下棋結(jié)束時(shí),我們應(yīng)該加入一個(gè)能夠用來(lái)判斷輸贏的函數(shù),取名is_win,當(dāng)玩家贏時(shí),返回‘ * ’,當(dāng)電腦贏時(shí),返回‘ # ’,也存在平局的情況,我們讓程序返回? Q,如果不存在以上現(xiàn)象,讓程序返回 C ,代碼繼續(xù)往下進(jìn)行。在判斷輸贏時(shí),我們需要判斷3行,3列和兩個(gè)對(duì)角線元素是否相同,如果相同,則會(huì)返回,代碼實(shí)現(xiàn)如下

char is_win(char board[ROW][COL], int row, int col) 
{
	int i = 0;
	for (i = 0; i< row; ++i)//判斷3行
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	int j = 0;
	for (j = 0; j< col; ++j)//判斷3列
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
		{
			return board[0][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, row, col) == 1)
	{
		return 'Q';		
	}
	return 'C';
}

其中的is_full()函數(shù)用來(lái)判斷棋盤(pán)是否下滿,如果棋盤(pán)下滿并且沒(méi)有人贏則為平局,is_full()函數(shù)實(shí)現(xiàn)如下

int is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i< row; ++i)
	{
		int j = 0;
		for (j = 0; j< col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}

	}
	return 1;
}

當(dāng)有空位時(shí),返回0,否則返回1,返回1時(shí),判斷輸贏的函數(shù)將會(huì)返回Q,程序打印出平局。到這里,基本的幾個(gè)函數(shù)已經(jīng)寫(xiě)完了我們?cè)倩仡^把完整的代碼寫(xiě)出供大家參考主函數(shù)如下

#define _CRT_SECURE_NO_WARNINGS 1

#include#include"game.h"
#include#includevoid menu()
{
	printf("******************\n");
	printf("***** 1.play *****\n");
	printf("***** 0.exit *****\n");
	printf("******************\n");

}

void game()
{
	char board[ROW][COL] = { 0 };
	char ret = 0;
	init_board(board,ROW,COL);//初始化棋盤(pán),使棋盤(pán)最開(kāi)始都為空格
	print_board(board, ROW, COL);//打印棋盤(pán),顯示出棋盤(pán)內(nèi)容
	while (1)
	{
		player_move(board, ROW, COL);//玩家下棋
		print_board(board, ROW, COL);//打印棋盤(pán),顯示出棋盤(pán)內(nèi)容
		//判斷輸贏
		ret=is_win(board, ROW, COL);
		if (ret != 'C') 
		{
			break;
		}
		computer_move(board, ROW, COL);//電腦下棋
		print_board(board, ROW, COL);//打印棋盤(pán),顯示出棋盤(pán)內(nèi)容
		ret=is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}

	}
	if (ret == '*')
	{
		printf("玩家贏\n");
	}
	if (ret == '#')
	{
		printf("電腦贏\n");
	}
	if (ret == 'Q')
		printf("平局\n");


}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do 
	{
		menu();//打印菜單
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
	


	return 0;
}

放幾個(gè)函數(shù)的game.c內(nèi)容如下

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void init_board(char board[ROW][COL], int row, int col)//初始化棋盤(pán)
{
	int i = 0;
	for (i = 0; i< row; ++i)
	{
		int j = 0;
		for (j = 0; j< col; ++j)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盤(pán)
void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i< row; i++)
	{
		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");
		}
	}

}


void player_move(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	while (1)
	{
		printf("請(qǐng)輸入坐標(biāo)\n");
		int x = 0;
		int y = 0;
		scanf("%d %d", &x, &y);
		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)已經(jīng)被占用\n");
		}
		else
			printf("坐標(biāo)非法\n");
		

	}
}

//電腦下棋
void computer_move(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;
		}

	}
}

int is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i< row; ++i)
	{
		int j = 0;
		for (j = 0; j< col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}

	}
	return 1;
}

char is_win(char board[ROW][COL], int row, int col) 
{
	int i = 0;
	for (i = 0; i< row; ++i)//判斷3行
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	int j = 0;
	for (j = 0; j< col; ++j)//判斷3列
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
		{
			return board[0][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, row, col) == 1)
	{
		return 'Q';		
	}
	return 'C';
}

頭文件game.h如下

#define _CRT_SECURE_NO_WARNINGS 1

#define ROW 3
#define COL 3

void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);

void player_move(char board[ROW][COL], int row, int col);


void computer_move(char board[ROW][COL], int row, int col);

char is_win(char board[ROW][COL], int row, int col)

有了這些,一個(gè)不太復(fù)雜又具有一定可玩性的三子棋小游戲就完成了。

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

分享名稱(chēng):c語(yǔ)言實(shí)現(xiàn)一個(gè)三子棋小游戲-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article2/dhipoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站排名、小程序開(kāi)發(fā)、企業(yè)建站、網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)