欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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("人機(jī)都打不過,好好反省噢!\n");
		}
		if (ret == 'Q')
		{
			printf("遇見了旗鼓相當(dāng)?shù)膶κ謀n");
		}
	}
	int main()
	{
		srand((unsigned int)time(NULL));//設(shè)置隨機(jī)數(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");
		}
	}
	
}
 
//電腦下
//電腦找空位置隨機(jī)下
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 電腦下

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

//電腦下
//電腦找空位置隨機(jī)下
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++?獲取當(dāng)前正在運行函數(shù)的名稱

    C++?獲取當(dāng)前正在運行函數(shù)的名稱

    本文主要介紹了C++獲取當(dāng)前正在運行函數(shù)的名稱,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C++小游戲tankwar之界面繪制的詳細(xì)過程

    C++小游戲tankwar之界面繪制的詳細(xì)過程

    最近沒有項目做,空閑了下來,于是寫了個c++小游戲來打發(fā)時間,下面通過本文基于圖文并茂的形式給大家介紹C++小游戲tankwar之界面繪制的詳細(xì)過程,感興趣的朋友一起看看吧
    2021-05-05
  • opencv實現(xiàn)矩形檢測

    opencv實現(xiàn)矩形檢測

    這篇文章主要為大家詳細(xì)介紹了opencv實現(xiàn)矩形檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++發(fā)送郵件實現(xiàn)代碼

    C++發(fā)送郵件實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C++發(fā)送郵件的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 解析c語言中"函數(shù)調(diào)用中缺少哨兵"的情況分析

    解析c語言中"函數(shù)調(diào)用中缺少哨兵"的情況分析

    本篇文章是對c語言中"函數(shù)調(diào)用中缺少哨兵"的情況進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Matlab實現(xiàn)極坐標(biāo)堆疊柱狀圖的繪制

    Matlab實現(xiàn)極坐標(biāo)堆疊柱狀圖的繪制

    極坐標(biāo)堆疊圖也是風(fēng)玫瑰圖的常用形式,MATLAB的bar繪制的條形圖可以繪制成堆疊形式,但是并沒有一個自帶函數(shù)可以繪制極坐標(biāo)堆疊圖。本文將為大家提供Matlab繪制極坐標(biāo)堆疊柱狀圖的示例代碼,需要的可以參考一下
    2022-08-08
  • 基于VS2019配置opencv4.0的方法步驟

    基于VS2019配置opencv4.0的方法步驟

    這篇文章主要介紹了基于VS2019配置opencv4.0的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C語言實現(xiàn)簡單三子棋小游戲

    C語言實現(xiàn)簡單三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題

    C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題

    這篇文章我們九里講講C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C語言使用ffmpeg實現(xiàn)單線程異步的視頻播放器

    C語言使用ffmpeg實現(xiàn)單線程異步的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了C語言如何使用ffmpeg實現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-12-12

最新評論