中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

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

目錄

團風(fēng)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

游戲規(guī)則:

geme.h:

test.c:

geme.c:


游戲規(guī)則:

? 相信大家都知道三子棋的游戲規(guī)則,但是還是啰嗦一下結(jié)束一下哈哈哈;規(guī)則就是在一個3*3的棋盤中,對應(yīng)的九個格子,只要雙方只要有一方的三顆棋子連成一條線就勝利,要是填滿九個格子還沒有任意一方的三顆棋子連成一條線,那就是平局了。

okok啰嗦完,開始正式話題。

———————————————————————————————————————————

在我們實現(xiàn)三子棋的時候,我們可以想到用模塊化的開發(fā)去完成游戲的實現(xiàn),每一個文件各司其職,比如我們的函數(shù)聲明可以放到一個建立的.h頭文件中,自定義的函數(shù)可以寫到一個新的.c文件中,游戲的運行以及測試可以放在第一個.c文件中。

那這樣下來我們的一個工程中就有以下的三個文件:

geme.h test.c geme.c

———————————————————————————————————————————

?????????????????????????????????????????????test.c

在這個.c文件下我們可以先實現(xiàn)我們的游戲菜單:

我們可以在自定義一個函數(shù)void test(),這個函數(shù)是實現(xiàn)我們游戲的函數(shù):

上來我們可以使用do{}while();(實現(xiàn)重復(fù)玩游戲的功能)和switch語句來實現(xiàn),代碼:

#includevoid enmu()
{
    printf("************************\n");
    printf("*****1、三子棋游戲*******\n");
    printf("*****0、退出游戲*********\n");
    printf("************************\n");
}
void test()
{
    int num1=0;
    do
    {
        enmu();
        printf("請選擇:\n");
        scanf("%d",&num);
        switch(num)
        {
            case 1:
            printf("三子棋游戲\n");
            break;
            case 0:
            printf("退出游戲\n");
            break;
            default:
            printf("選擇有誤請重新輸入:\n");
            break;
        }
    }while(num)
}
int main()
{
    test();
    return 0;
}

至此我們的菜單就完成了!邏輯通過switch語句也實現(xiàn)了!

———————————————————————————————————————————

? ?geme.c

接著我們可以寫 void game()函數(shù),在這個函數(shù)中我們可以先實現(xiàn)把棋盤打印出來(如圖所示棋盤):

我們從圖中可以看出我們實現(xiàn)這個棋盤只要一個二維數(shù)組便可以實現(xiàn)!

char board[ROW][COL]

其中 RWO和COL是我們定義的全局變量,這樣子的好處就是我們可以隨時修改棋盤的大小不僅僅局限于3*3的棋盤。

對此我們需要先實現(xiàn)這個棋盤即初始化,可以寫一個void int_board(char board[ROW][COL],int row,int col) 這么一個函數(shù)實現(xiàn)。( 其中的小寫的row和col對應(yīng)的是前面所說的全局變量ROW和COL)

代碼:

void init_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++)
		{
			board[i][j] = ' ';
		}
	}
}

當(dāng)我們的棋盤初始完后,那我們就需要把棋盤打印到棋盤上面,我們同樣是定義一個函數(shù)void print_board(char board[ROW][COL],int row,int col)來打印棋盤:

不過在答應(yīng)這個棋盤之前,需要注意一些問題:

這么一個棋盤我們可以看到

第一行是這樣的:

是由空格%c空格|空格%c空格|空格%c空格組成的

那我們就可以把空格%c空格|作為一個單位來輸出,輸出用循環(huán)控制即可(但是需要注意的是最后一個單位是沒有|)

一個單位:*3

第二行是這樣的:

是由---|---|---組成的并且只是打印兩組

那我們就可以以---|為一個單位打?。ㄗ詈笠粋€單位是沒有|)

一個單位:

那我們上代碼:

void print_board(char board[ROW][COL],int row,int col)
{
    int i=0;
    int j=0;
    for(i=0;i

接下里我們就需要解決兩個問題:第一個就是玩家下棋;第二個就是電腦下棋

首先我們先解決玩家下棋:

先定義一個函數(shù)void player_move(char board[ROW]COL[,int row,int col])

我們實現(xiàn)這個函數(shù)時候就需要想一些問題,就是你下的這個位置是不是空的,并且是在我們自己寫棋盤范圍內(nèi),不是空那我們就需要重新輸入(我們定義*號為玩家下的棋);還有就是下棋的位置是在數(shù)組中的,而面對玩家群體時,他們可不清楚上面是數(shù)組,所以我們就需要在數(shù)組的位置上+1

代碼:

void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("請玩家下棋(輸入棋盤對應(yīng)的坐標(biāo)):>\n");
	scanf_s("%d %d",&x,&y);
	while (1)
	{
		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");
		}
	}
}

接著就是電腦下棋:

同樣定義一個函數(shù):void computer_move(char board[ROW][COL],int row,int col)

對于電腦下棋我們也需要思考幾個問題,第一電腦下的位置是隨機的,并且也需要符合玩家下棋的條件。那么對于隨機值我們可以用rand和srand(srand這個函數(shù)還需要一個無符號返回值,這個返回值可以用time函數(shù)數(shù)解決)

這一對函數(shù)(需要包含頭文件:stdlib.h)來解決,可以設(shè)置定義一個整型變量來接收rand生成的隨機值,并且這個隨機值要在數(shù)組的范圍內(nèi),不然會造成數(shù)組越界的問題,對此我們只需要對這個隨機值進行取模3即可。

代碼:

void computer_move(char board[ROW][COL], int row, int col)
{
	printf("電腦下棋:\n");
	while (1)
	{
		int x = rand() % row;//0 1 2
		int y = rand() % col;//0 1 2
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

到這一步游戲已經(jīng)可以走起來了我們可以說以及完成這個游戲的百分之八十了,還有剩下的最后百分之二十,那這最后的百分之二十就是要去判斷這個游戲的輸贏了。

我們可以寫一個函數(shù)char is_win(char board[ROW][COL],int row,int col),通過這個函數(shù)的返回值去判斷誰贏,那么就有以下邏輯:

如果返回值是'*'則玩家贏

如果返回值是'#'則玩家贏

如果返回值是'P'則平局

如果返回值是'C'則游戲繼續(xù)

游戲獲勝可以參考前面的游戲規(guī)則

代碼:

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][1]!=' ')
		{
			return board[i][1];
		}
	}
	for (i = 0; i< row; i++) //判斷列是否贏
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][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];
	}
}

其實我們看我這段代碼后會發(fā)現(xiàn),沒有平局的情況,對于平局的情況我們其實需要另寫一個函數(shù)int is_full(char board[ROW][COL],int row,int col)的返回值在char is_win(char board[ROW][COL],int row,int col)函數(shù)中實現(xiàn)

代碼:

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] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
			{
				return 1;
			}
		}
	}
}

那完整的char is_win(char board[ROW][COL],int row,int col)函數(shù)如下:

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] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
			{
				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][1]!=' ')
		{
			return board[i][1];
		}
	}
	for (i = 0; i< row; i++) //判斷列是否贏
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][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 'P';
	}

}

至此,這個三子棋的小游戲就已經(jīng)完成了。

———————————————————————————————————————————————————————————

? ? ? ? ? ? ? ? ? ? game.h

這里就需要包含一下我們函數(shù)聲明:

  1. #include#define ROW 3
    #define COL 3
    #include#includevoid 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);

完整程序:

game.c:

#define _CRT_SECURE_NO_WARANINGS 1
#include"game.h"

void init_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++)
		{
			board[i][j] = ' ';
		}
	}
}

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)
{
	int x = 0;
	int y = 0;
	printf("請玩家下棋(輸入棋盤對應(yīng)的坐標(biāo)):>\n");
	scanf_s("%d %d",&x,&y);
	while (1)
	{
		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");
		}
	}
}

void computer_move(char board[ROW][COL], int row, int col)
{
	printf("電腦下棋:\n");
	while (1)
	{
		int x = rand() % row;//0 1 2
		int y = rand() % col;//0 1 2
		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] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
			{
				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][1]!=' ')
		{
			return board[i][1];
		}
	}
	for (i = 0; i< row; i++) //判斷列是否贏
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][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 'P';
	}

}

game.h:

#define _CRT_SECURE_NO_WARANINGS 1
#include#define ROW 3
#define COL 3
#include#includevoid 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);

test.c:

#define _CRT_SECURE_NO_WARANINGS 1
#include"game.h"
void menu()
{
	printf("********************\n");
	printf("*****1、play********\n");
	printf("*****0、exit********\n");
	printf("********************\n");
}

void game()
{
	printf("***三子棋***\n");
	char ret=' ';
	char board[ROW][COL];
	//先給定空棋盤的位置
	init_board(board, ROW, COL);
	//初始化并且打印棋盤
	print_board(board, ROW, COL);
	//玩家下棋
	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);                
		//判斷輸贏                             //可以讓is_win函數(shù)返回一個字符串判斷輸贏:
											  //玩家贏返回:*		電腦贏返回:#		平局返回:P	以及繼續(xù)游戲!
		ret=is_win(board,ROW,COL);
		if (ret == '*')
		{
			printf("恭喜你贏!\n");
			break;
		}
		else if(ret=='#')
		{
			printf("抱歉你輸了!\n");
			break;
		}
		else if (ret == 'P')
		{
			printf("平局!\n");
			break;
		}
		else
		{
			printf("游戲繼續(xù)!\n");
		}
		//電腦下棋
		computer_move(board,ROW,COL);
		print_board(board, ROW, COL);
		//判斷輸贏
		ret = is_win(board, ROW, COL);
		if (ret == '*')
		{
			printf("恭喜你贏!\n");
			break;
		}
		else if (ret == '#')
		{
			printf("抱歉你輸了!\n");
			break;
		}
		else if (ret == 'P')
		{
			printf("平局!\n");
			break;
		}
		else
		{
			printf("游戲繼續(xù)!\n");
		}
	}

}

void test()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("請輸入選項:>\n");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戲已退出!\n");
			break;
		default:
			printf("輸入有誤請重新輸入:>\n");
		}
	} while (input);
}

int main()
{
	//1、創(chuàng)建一個打印菜單的函數(shù)
	//2、作為一個游戲我們首先是確定一點就是可以重復(fù)玩。
	test();
	return 0;
}

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

新聞標(biāo)題:小游戲--->三子棋-創(chuàng)新互聯(lián)
文章URL:http://m.rwnh.cn/article8/dopiop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計搜索引擎優(yōu)化、定制開發(fā)、網(wǎng)站制作

廣告

聲明:本網(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)

中阳县| 宜兰县| 浮梁县| 营口市| 元江| 荔波县| 长海县| 乐平市| 休宁县| 大港区| 澄城县| 绵阳市| 萨嘎县| 寻乌县| 麻城市| 贵州省| 开化县| 读书| 石首市| 峨山| 东宁县| 综艺| 乌鲁木齐县| 汕尾市| 深水埗区| 东莞市| 中山市| 怀安县| 托克托县| 会同县| 卓资县| 邵东县| 溧水县| 水城县| 济阳县| 深泽县| 贵州省| 东海县| 清流县| 清水河县| 来宾市|