最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言三子棋小游戲?qū)崿F(xiàn)全程

 更新時間:2022年05月11日 14:42:23   作者:^O^玩轉(zhuǎn)編程  
三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,想用c語言做出這個游戲,事實上也是比較簡單的,下面通過c語言進行對五子棋的分析

前言

很高興為大家?guī)砣制宓臄U展版本

game.h

在這個文件中我們完成對代碼的函數(shù)聲明,常量的定義和頭文件的包含。

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//定義行和列
#define ROW 3
#define COL 3
//函數(shù)聲明
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);

test.c

這里我們測試三子棋游戲?qū)崿F(xiàn)的邏輯

#define  _CRT_SECURE_NO_WARNINGS
	#include"game.h"
	void menu()
	{
		printf("***********************\n");
		printf("****1.play  0.exit ****\n");
		printf("***********************\n");
	}
	void game()
	{
		char board[ROW][COL] = { 0 };
		//初始化棋盤
		InitBoard(board, ROW, COL);
		//打印棋盤
		DisplayBoard(board, ROW, COL);
		char ret = 0;
		//下棋
		while (1)
		{
			//玩家下
			PlayMove(board, ROW, COL);
			//打印棋盤
			DisplayBoard(board, ROW, COL);
			//判斷輸贏
			ret = IsWin(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
			//電腦下
			ComputerMove(board, ROW, COL);
			//判斷輸贏
			DisplayBoard(board, ROW, COL);
			ret = IsWin(board, ROW, COL);
			if (ret != 'C')
			{
				break;
			}
		}
		if (ret == '*')
		{
			printf("你贏了,真厲害!\n");
		}
		if (ret == '#')
		{
			printf("人機都打不過,好好反省噢!\n");
		}
		if (ret == 'Q')
		{
			printf("遇見了旗鼓相當(dāng)?shù)膶κ謀n");
		}
	}
	int main()
	{
		srand((unsigned int)time(NULL));//設(shè)置隨機數(shù)的種子
		int input = 0;
		do
		{
			menu();
			scanf("%d", &input);
			switch (input)
			{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戲\n");
				break;
			default:
				printf("選擇錯誤,請重新選擇\n");
				break;
			}
		} while (input);
		return 0;
	}

game.c

在這個文件中,我們主要完成對游戲代碼的實現(xiàn)。

#define  _CRT_SECURE_NO_WARNINGS
#include"game.h"
 
//棋盤初始化
void InitBoard(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++)
		{
			board[i][j] = ' ';
		}
	}
}
//棋盤打印
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i<row;i++)
	{
		for (j = 0;j < row;j++)
		{
			//打印數(shù)據(jù)
			printf(" %c ", board[i][j]);
			//打印|
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		//打印分割線
		if (i < row - 1)
		{
			for (j = 0;j < row;j++)
			{
				printf("---");
				//打印|
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
			printf("\n");
	}
	printf("\n");
}
 
//玩家下棋"*"
void PlayMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下\n");
	while (1)
	{
		printf("請輸入坐標(biāo):>");
		scanf("%d%d", &x, &y);
		//坐標(biāo)判斷
		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)被占用,請重新選擇坐標(biāo)\n");
			}
		}
		else
		{
			printf("坐標(biāo)非法,請重新選擇\n");
		}
	}
	
}
 
//電腦下
//電腦找空位置隨機下
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("電腦下\n");
	while (1)
	{
		int x = rand() % row;//生成0~2的數(shù)
		int y = rand() % col;//生成0~2的數(shù)
		if (board[x][y] == ' ')
		{
			board[x ][y ] = '#';
			break;
		}
	}
	
}
//判斷棋盤是否滿
//滿了就返回 1
//不滿就返回 0
int IsFull(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;
}
//判斷輸贏
//玩家贏返回  "*"
//電腦贏      "#"
//平局        "Q"
//繼續(xù)        "C"
char IsWin(char board[ROW][COL], int row, int col)
{
	//每行相等
	int i = 0;
	int j = 0;
	int count = 0;//記錄相同棋子數(shù)
	for (i = 0;i < row;i++)
	{
		count = 0;
		for (j = 0;j < col - 1;j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
			{
				count++;
			}
		}
		if (count == row - 1)
		{
			return board[i][j];
		}
	}
	//每列相等
	for (i = 0;i < col;i++)
	{
		count = 0;
		for (j = 0;j < row - 1;j++)
		{
			if (board[j][i] == board[j+1][i] && board[j][i] != ' ')
			{
				count++;
			}
		}
		if (count == col - 1)
		{
			return board[j][i];
		}
	}
	//對角線相等
	//第一條
    count = 0;
	for(i = 0,j = 0;i<row-1&&j<col-1;i++,j++)
	{
		if (board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ')
		{
			count++;
		}
	}
	if (count == col - 1)
	{
		return board[i][j];
	}
	//第二條對角線
	//此次要記得把count重新歸零
	count = 0;
	for (i = 0, j = col - 1;i < row - 1&& j > 0;i++, j--)
	{
 
		if (board[i][j] == board[i+1][j - 1] && board[i][j] != ' ')
		{
			count++;
		}
	}
		if (count == col - 1)
		{
			return board[i][j];
		}
	if (IsFull(board, ROW, COL))
	{
		return 'Q';
	}
	return 'C';
}

游戲代碼實現(xiàn)的過程

對于三子棋游戲?qū)崿F(xiàn)的思路是很重要的,讓博主帶領(lǐng)大家看看到底是如何實現(xiàn)的吧。

1 初始化棋盤

我們要實現(xiàn)棋盤的設(shè)計,要借助于二維數(shù)組board,很明顯剛剛開始棋盤中是上面都沒有的,我們就要二維數(shù)組所有元素都初始化為空格。

//棋盤初始化
void InitBoard(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++)
		{
			board[i][j] = ' ';
		}
	}
}

2 打印棋盤

為了打印出我們所需要的棋盤,這里我們要好好研究一下。棋盤如下:

我們可以看到棋盤可以分為三個部分:

一部分:打印數(shù)據(jù)。

二部分:打印 " | "。

三部分:打印分割線。

按照這個思路我們可以寫出。

//棋盤打印
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i<row;i++)
	{
		for (j = 0;j < row;j++)
		{
			//打印數(shù)據(jù)
			printf(" %c ", board[i][j]);
			//打印|
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		//打印分割線
		if (i < row - 1)
		{
			for (j = 0;j < row;j++)
			{
				printf("---");
				//打印|
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
			printf("\n");
	}
	printf("\n");
}

3 玩家下

這里我們用" * "代表玩家下的棋子。

//玩家下棋"*"
void PlayMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下\n");
	while (1)
	{
		printf("請輸入坐標(biāo):>");
		scanf("%d%d", &x, &y);
		//坐標(biāo)判斷
		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)被占用,請重新選擇坐標(biāo)\n");
			}
		}
		else
		{
			printf("坐標(biāo)非法,請重新選擇\n");
		}
	}
}

4 電腦下

這里我們就讓電腦隨機找個空位下,后期博主會繼續(xù)完善代碼,讓電腦看起來跟加智能。

//電腦下
//電腦找空位置隨機下
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("電腦下\n");
	while (1)
	{
		int x = rand() % row;//生成0~2的數(shù)
		int y = rand() % col;//生成0~2的數(shù)
		if (board[x][y] == ' ')
		{
			board[x ][y ] = '#';
			break;
		}
	}
}

5 判斷棋盤是否已滿

我們規(guī)定 :

滿了就返回 1

不滿就返回 0

//判斷棋盤是否滿
//滿了就返回 1
//不滿就返回 0
int IsFull(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;
}

6 判斷輸贏

我們規(guī)定:

玩家贏就返回:" * "

電腦贏就返回:" # "

平局就返回:" Q "

繼續(xù)就返回:" C "

//判斷輸贏
//玩家贏返回  "*"
//電腦贏      "#"
//平局        "Q"
//繼續(xù)        "C"
char IsWin(char board[ROW][COL], int row, int col)
{
	//每行相等
	int i = 0;
	int j = 0;
	int count = 0;//記錄相同棋子數(shù)
	for (i = 0;i < row;i++)
	{
		count = 0;
		for (j = 0;j < col - 1;j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
			{
				count++;
			}
		}
		if (count == row - 1)
		{
			return board[i][j];
		}
	}
	//每列相等
	for (i = 0;i < col;i++)
	{
		count = 0;
		for (j = 0;j < row - 1;j++)
		{
			if (board[j][i] == board[j+1][i] && board[j][i] != ' ')
			{
				count++;
			}
		}
		if (count == col - 1)
		{
			return board[j][i];
		}
	}
	//對角線相等
	//第一條
    count = 0;
	for(i = 0,j = 0;i<row-1&&j<col-1;i++,j++)
	{
		if (board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ')
		{
			count++;
		}
	}
	if (count == col - 1)
	{
		return board[i][j];
	}
	//第二條對角線
	//此次要記得把count重新歸零
	count = 0;
	for (i = 0, j = col - 1;i < row - 1&& j > 0;i++, j--)
	{
		if (board[i][j] == board[i+1][j - 1] && board[i][j] != ' ')
		{
			count++;
		}
	}
		if (count == col - 1)
		{
			return board[i][j];
		}
	if (IsFull(board, ROW, COL))
	{
		return 'Q';
	}
	return 'C';
}

到這里游戲的設(shè)計就完成了,大家心里有了一些理解吧,我們這個三字棋,不僅僅可以下三字棋,還可以下五字棋,甚至N字棋大家要改只要改變ROW和COL的定義的常量就可以了。

//定義行和列
#define ROW 3
#define COL 3

到此這篇關(guān)于C語言三子棋小游戲?qū)崿F(xiàn)全程的文章就介紹到這了,更多相關(guān)C語言三子棋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言聯(lián)合體類型的實現(xiàn)

    C語言聯(lián)合體類型的實現(xiàn)

    聯(lián)合體也是一種構(gòu)造數(shù)據(jù)類型,和結(jié)構(gòu)體類型一樣,它也是由各種不同類型的數(shù)據(jù)組成,本文主要介紹了C語言聯(lián)合體類型的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • c++ Bellman-Ford算法的具體實現(xiàn)

    c++ Bellman-Ford算法的具體實現(xiàn)

    Bellman-Ford算法用于解決有邊數(shù)限制的最短路問題,且可以應(yīng)對有負(fù)邊權(quán)的圖,本文主要介紹了c++ Bellman-Ford算法的具體實現(xiàn),感興趣的可以了解一下
    2021-06-06
  • C語言strlen函數(shù)全方位講解

    C語言strlen函數(shù)全方位講解

    在C語言中我們要獲取字符串的長度,可以使用strlen函數(shù),strlen函數(shù)計算字符串的長度時,直到空結(jié)束字符,但不包括空結(jié)束字符,因為 strlen函數(shù)時不包含最后的結(jié)束字符的,因此一般使用strlen函數(shù)計算的字符串的長度會比使用sizeof計算的字符串的字節(jié)數(shù)要小
    2022-09-09
  • VS2019簡單快速的打包可安裝項目(圖文教程)

    VS2019簡單快速的打包可安裝項目(圖文教程)

    這篇文章主要介紹了VS2019簡單快速的打包可安裝項目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C++形參與實參的區(qū)別實例解析

    C++形參與實參的區(qū)別實例解析

    這篇文章主要介紹了C++形參與實參的區(qū)別實例解析,需要的朋友可以參考下
    2014-07-07
  • C語言 指針與數(shù)組的詳解及區(qū)別

    C語言 指針與數(shù)組的詳解及區(qū)別

    這篇文章主要介紹了C語言 指針與數(shù)組的詳解及對比的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++中函數(shù)的用法小結(jié)

    C++中函數(shù)的用法小結(jié)

    這篇文章主要為大家分享下本人在閱讀《C++ Primer》函數(shù)一章時的讀書總結(jié),需要的朋友可以參考下
    2014-02-02
  • C++ 實現(xiàn)漢諾塔的實例詳解

    C++ 實現(xiàn)漢諾塔的實例詳解

    這篇文章主要介紹了C++ 實現(xiàn)漢諾塔的實例詳解的相關(guān)資料,這里主要說明C++中數(shù)據(jù)結(jié)構(gòu)的遞歸的應(yīng)用,需要的朋友可以參考下
    2017-08-08
  • Qt音視頻開發(fā)之利用ffmpeg實現(xiàn)解碼本地攝像頭

    Qt音視頻開發(fā)之利用ffmpeg實現(xiàn)解碼本地攝像頭

    一開始用ffmpeg做的是視頻流的解析,后面增加了本地視頻文件的支持,到后面發(fā)現(xiàn)ffmpeg也是支持本地攝像頭設(shè)備的,所以本文就來用ffmpeg實現(xiàn)解碼本地攝像頭功能吧
    2023-03-03
  • C語言深入探索數(shù)據(jù)類型的存儲

    C語言深入探索數(shù)據(jù)類型的存儲

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-07-07

最新評論

杭锦后旗| 秀山| 岳西县| 醴陵市| 衡东县| 邵武市| 松江区| 图们市| 怀集县| 许昌市| 柳河县| 探索| 南丹县| 招远市| 公安县| 宝应县| 清苑县| 彭山县| 定南县| 涞源县| 昌邑市| 姚安县| 新建县| 柳林县| 宝丰县| 响水县| 成武县| 咸宁市| 盐城市| 慈利县| 色达县| 兴海县| 台东县| 临潭县| 乐安县| 宁蒗| 安多县| 甘洛县| 兴宁市| 济南市| 漳浦县|