C語言實現(xiàn)三子棋(超詳解版本)-創(chuàng)新互聯(lián)

🚀write in front🚀
📝個人主頁:認真寫博客的夏目淺石.
🎁歡迎各位→點贊👍 + 收藏?? + 留言📝?
📣系列專欄:鵬哥帶我學c帶我飛
💬總結(jié):希望你看完之后,能對你有所幫助,不足請指正!共同學習交流 🖊
??不如沉默去做,看結(jié)局怎么去說 ?
在這里插入圖片描述

創(chuàng)新互聯(lián)公司是專業(yè)的濱海新區(qū)網(wǎng)站建設(shè)公司,濱海新區(qū)接單;提供成都網(wǎng)站設(shè)計、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行濱海新區(qū)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

文章目錄
  • 一、🌸問題描述
  • 二、🌷基本流程
  • 三、🌺具體步驟
    • 1.🎐創(chuàng)建test.c, game.h 源文件和game.h頭文件
    • 2.🎐寫出主函數(shù)和創(chuàng)建菜單
    • 3.🎐搭建游戲邏輯
    • 4.🎐game函數(shù)的初步實現(xiàn)
    • 5.🎐game函數(shù)的進一步實現(xiàn)玩家下棋
    • 6.🎐game函數(shù)的再進一步實現(xiàn)電腦下棋
    • 7.🎐對于三子棋游戲規(guī)則的思考
    • 8.🎐對于三子棋游戲的最終實現(xiàn)
  • 四、🌻玩法演示
  • 五、🍀源代碼
  • 🦋總結(jié)

一、🌸問題描述

用c語言實現(xiàn)三子棋游戲
在這里插入圖片描述

二、🌷基本流程

1.菜單界面選擇開始或者退出游戲。
2.創(chuàng)建棋盤并初始化。
3.打印棋盤。
4.玩家落子(玩家輸入行列坐標的方式來落子),'*’表示玩家落子。
5.判定勝負關(guān)系(輸,贏,和棋),‘Q’表示和棋。
6.電腦落子(隨機位置落子) ,’#’表示電腦落子。
7.判定勝負關(guān)系

三、🌺具體步驟 1.🎐創(chuàng)建test.c, game.h 源文件和game.h頭文件

這樣做的目的是為了讓我的實現(xiàn)更加簡單和簡介,思路更加清晰,方便初學者學習。

2.🎐寫出主函數(shù)和創(chuàng)建菜單
void menu()
{printf("***********************\n");
	printf("******* 1. play *******\n");
	printf("******* 0. eixt *******\n");
	printf("***********************\n");
}
void test()
{menu();
}
int main()
{test();
	return 0;
}
3.🎐搭建游戲邏輯

這里顯然就是打印完菜單要開始游戲,所以我應(yīng)該搭建出來我的游戲邏輯。

void test()
{int input;
	do
	{menu();
		printf("請選擇:>");
		scanf("%d",&input);
		switch(input)
		{	case 1: game();
				break;
			case 0: printf("退出游戲"); 
				break;
			default: printf("選擇錯誤:>");
				break;
		}
	}while(input);
}

輸入1我要繼續(xù)游戲,輸入0我就退出我的游戲,其他的就是不符合所以從新輸入。
下一步那就是要實現(xiàn)game函數(shù)內(nèi)容來豐富我的游戲。

4.🎐game函數(shù)的初步實現(xiàn)

game函數(shù)需要先實現(xiàn)什么呢?
當然是我們的棋盤需要被初始化啦,然后就是打印我的棋盤對吧?

void game()
{char board[ROW][COL];
	//初始化我的棋盤 
	init_board(board,ROW,COL);
	//打印我的棋盤
	print_board(board,ROW,COL);
}

1.初始化我的棋盤:

void init_board(char borad[ROW][COL],int row,int col)
{for(int i=0;iint j=0;
		for(j=0;j	borad[i][j] = ' ';
		}
	}
}

2.打印我的棋盤:

簡陋版本:

void print_board(char board[ROW][COL], int row, int col)
{int i = 0;
	for (i = 0; i< row; i++)
	{printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		if(i

美化版本:
美化版本好處就是更加便于我對于代碼的操作和改動。

void print_board(char board[ROW][COL],int row,int col)
{int i=0;
	for(i=0;iint j=0;
		for(j=0;j	printf(" %c ",board[i][j]);
			if(j!=col-1)
				printf("|"); 
		}
		printf("\n");
		if(i	for(j=0;j		printf("---");
				if(j!=col-1)
					printf("|");
			}
			printf("\n");
		}
	}
}
5.🎐game函數(shù)的進一步實現(xiàn)玩家下棋
void game()
{char board[ROW][COL];
	//初始化我的棋盤 
	init_board(board,ROW,COL);
	//打印我的棋盤
	print_board(board,ROW,COL);
	while(1)
	{player_move(board,ROW,COL);//我下完棋之后就要再次打印我的棋盤然后反復(fù)操作
		print_board(board,ROW,COL);
	}	
}

player_move的實現(xiàn):

void player_move(char board[ROW][COL],int row,int col)
{printf("玩家下棋\n");
	while(1)
	{printf("請輸入要下棋得坐標:>");
		int x,y;
		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("該坐標被占用,請重新輸入\n");
			}
		}
		else
		{	printf("坐標非法\n");
		}
	}
}

在這里插入圖片描述
所以就是對于我的x,y,坐標,看輸入是否合法,不合法就需要我去重新輸入,然后還需要思考是否我選擇的坐標被占用了,如果沒有就下去這個子然后跳出,否則繼續(xù)?。。?/p>6.🎐game函數(shù)的再進一步實現(xiàn)電腦下棋

void game()
{//存放玩家或者電腦的落子情況
	char board[ROW][COL];
	char ret = 0;
	//初始化一下棋盤為全空格
	init_board(board, ROW, COL);
	print_board(board, ROW, COL);

	while (1)
	{player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
	}
}

computer_move函數(shù)的實現(xiàn)代碼:
這里用到了一個rand函數(shù)是生成隨機數(shù)的一個函數(shù),大家可以去msdn查找學習。

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;
		}
	}
}
7.🎐對于三子棋游戲規(guī)則的思考

其實思考內(nèi)容就是我出現(xiàn)結(jié)局的情況,這里有幾種方案:

判斷輸贏
判斷輸贏的代碼要告訴我:電腦贏了?玩家贏了?玩家贏?游戲繼續(xù)?
電腦贏:#
玩家贏:*
平局:Q
游戲繼續(xù):C

思考了這些其實就可以繼續(xù)去完善我們的代碼了。

8.🎐對于三子棋游戲的最終實現(xiàn)
void game()
{//存放玩家或者電腦的落子情況
	char board[ROW][COL];
	char ret = 0;
	//初始化一下棋盤為全空格
	init_board(board, ROW, COL);
	print_board(board, ROW, COL);

	while (1)
	{player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判斷輸贏
		ret = is_win(board,ROW, COL);
		if (ret != 'C')
		{	break;
		}
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判斷輸贏
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{	break;
		}
	}
	if (ret == '#')
		printf("電腦贏了\n");
	else if (ret == '*')
		printf("玩家贏了\n");
	else if (ret == 'Q')
		printf("平局\n");
}

is_full以及我的is_win函數(shù)的實現(xiàn)

//我希望is_full這個函數(shù)只是為了支持is_win函數(shù)的,只是在is_win函數(shù)內(nèi)部使用
//那我們就沒必要在頭文件中聲明
// 
//判斷棋盤是否滿了
static int is_full(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;
}

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

	//繼續(xù)
	//沒有玩家或者電腦贏,也沒有平局,游戲繼續(xù)
	return 'C';
}
四、🌻玩法演示

玩家贏:
在這里插入圖片描述
電腦贏:
在這里插入圖片描述

五、🍀源代碼
#include#include#include#define ROW 3
#define COL 3
void menu()
{printf("***********************\n");
	printf("******* 1. play *******\n");
	printf("******* 0. eixt *******\n");
	printf("***********************\n");
}

void init_board(char borad[ROW][COL],int row,int col)
{for(int i=0;iint j=0;
		for(j=0;j	borad[i][j] = ' ';
		}
	}
}


void print_board(char board[ROW][COL],int row,int col)
{int i=0;
	for(i=0;iint j=0;
		for(j=0;j	printf(" %c ",board[i][j]);
			if(j!=col-1)
				printf("|"); 
		}
		printf("\n");
		if(i	for(j=0;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("請輸入要下棋得坐標:>");
		int x,y;
		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("該坐標被占用,請重新輸入\n");
			}
		}
		else
		{	printf("坐標非法\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;
	int j = 0;
	for (i = 0; i< row; i++)
	{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;iif(board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][0]!=' ')
			return board[i][0];
	}
	//判斷三列
	for(i=0;iif (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
			return board[0][i];
	}
	//對角線
	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';
	}
	
	//繼續(xù)
	//沒有玩家或者電腦贏,也沒有平局,游戲繼續(xù)
	return 'C';
}

void game()
{char board[ROW][COL];
	char ret=0;
	//初始化我的棋盤 
	init_board(board,ROW,COL);
	//打印我的棋盤
	print_board(board,ROW,COL);
	
	while(1)
	{player_move(board,ROW,COL);
		print_board(board,ROW,COL);
		ret=is_win(board,ROW,COL);
		if(ret!='C')
		{	break;
		}
		computer_move(board,ROW,COL);
		print_board(board,ROW,COL);
		ret=is_win(board,ROW,COL);
		if(ret!='C')
		{	break;
		}
	}
	if(ret=='#')
	 	printf("電腦贏了\n");
	else if(ret=='*')
		printf("玩家贏了\n");
	else if(ret=='Q')
		printf("平局\n");
}
//判斷輸贏
//判斷輸贏的代碼要告訴我:電腦贏了?玩家贏了?玩家贏?游戲繼續(xù)?
//電腦贏:#
//玩家贏:*
//平局:Q
//游戲繼續(xù):C
void test()
{int input;
	do
	{menu();
		printf("請選擇:>");
		scanf("%d",&input);
		switch(input)
		{	case 1: game();
				break;
			case 0: printf("退出游戲"); 
				break;
			default: printf("選擇錯誤:>");
				break;
		}
	}while(input);
}
int main()
{test();
	return 0;
}
🦋總結(jié)

三子棋游戲:

1.三子棋實現(xiàn),先去想邏輯和游戲規(guī)則,然后搭建這些邏輯框架,最后寫出代碼去實現(xiàn)它,逐步思考和代碼推進。
2.多去想怎么可以優(yōu)化我的代碼,這樣才會使得自己進步。

個人對于近期學習感想:

1.學習一定要穩(wěn)重,不能圖快而使得自己學的不夠精,最后基礎(chǔ)不牢,又從頭開始學習。
2.認準一個老師,就踏踏實實跟著學就行,多去做老師反復(fù)強調(diào)你需要做的,少說便會得到答案
3.堅持不斷地學習和規(guī)律的作息其實這樣的學習效果真的非常好,希望你我都不是三分熱度,堅持自己的學習計劃,慢慢去做吧,加油!

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

分享文章:C語言實現(xiàn)三子棋(超詳解版本)-創(chuàng)新互聯(lián)
本文地址:http://muchs.cn/article4/dodoie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信公眾號、定制開發(fā)、品牌網(wǎng)站制作、網(wǎng)站維護、ChatGPT

廣告

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