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

詳解用C語(yǔ)言實(shí)現(xiàn)三子棋游戲流程

 更新時(shí)間:2021年11月15日 11:54:22   作者:Ssorrymaker  
三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來(lái),相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了

三子棋游戲簡(jiǎn)介

在這里插入圖片描述

這是一個(gè)簡(jiǎn)單的三子棋小游戲,估計(jì)大家小時(shí)候都玩兒過(guò),只要能連成三個(gè),無(wú)論是行,列還是對(duì)角線,就可以勝利了。是不是很簡(jiǎn)單呢,那我們來(lái)嘗試一下用C語(yǔ)言來(lái)寫(xiě)一個(gè)簡(jiǎn)單的三子棋游戲。

一、分析及實(shí)現(xiàn)

1.棋盤(pán)

想要玩游戲,那首先應(yīng)該有一個(gè)棋盤(pán)吧。因?yàn)槲覀兺鎯旱氖侨悠澹詠?lái)說(shuō)一個(gè)3X3的棋盤(pán)應(yīng)該可以滿足要求。這里使用了一個(gè)三行三列的二維數(shù)組來(lái)模擬三子棋的棋盤(pán)。
有了棋盤(pán)之后在開(kāi)始游戲之前先把棋盤(pán)初始化一下,這樣看起來(lái)更方便。

//初始化棋盤(pán)
void InitBoard(char board[][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] = ' ';
		}
	}
}

之后呢,再來(lái)打印看看,要優(yōu)化一下再打印出來(lái)

//打印棋盤(pán)
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		printf("+---+---+---+\n");
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("| %c ", board[i][j]);
		}
		printf("|\n");
	}
	printf("+---+---+---+\n");
}

這是我設(shè)計(jì)的一個(gè)簡(jiǎn)單的小棋盤(pán)

在這里插入圖片描述

棋盤(pán)的風(fēng)格和樣式可以根據(jù)自己的喜好更改。
好了,現(xiàn)在我們有了棋盤(pán),有了打印出來(lái)的樣子,那接下來(lái)就應(yīng)該向棋盤(pán)上落子了!

2.落子

下棋呢可以是兩個(gè)人下,當(dāng)然也可以自己和電腦下棋,這里我選擇和電腦對(duì)弈,這樣就需要兩個(gè)功能了,一個(gè)是玩家下棋,一個(gè)就是電腦下棋了。

//玩家下棋
void Player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋:->");
		scanf("%d %d", &x, &y);

		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'O';
				break;
			}
			else
			{
				printf("坐標(biāo)已被占用!\n");
			}
		}
		else
		{
			printf("坐標(biāo)非法,請(qǐng)重新輸入!\n");
		}
	}
}

為了將玩家和電腦區(qū)分開(kāi),需要使用兩個(gè)不一樣的符號(hào)來(lái)代表玩家的落子和電腦的落子 玩家----O,電腦----X

//電腦下棋
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] = 'X';
			break;
		}
	}
}

玩家的落子可以通過(guò)輸入坐標(biāo),而電腦呢,我們讓他隨機(jī)選擇合理的坐標(biāo)范圍進(jìn)行落子。
那隨著玩家和電腦相繼落子,我們就需要判斷誰(shuí)獲勝了,或者平局的情況。

3.判斷輸贏

//判斷輸贏
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])
		{
			return board[i][0];
		}

		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
		{
			return board[0][i];
		}

	}
	//判斷對(duì)角線
	if ((board[0][0] == board[1][1] && board[1][1] == board[2][2])
		|| (board[0][2] == board[1][1] && board[1][1] == board[2][0]))
	{
		return board[1][1];
	}

	if (Is_full(board, row, col))
	{
		return 'D';  //平局
	}
	return 'C'; //Continue表示繼續(xù)
}

如果棋盤(pán)滿了,還沒(méi)有分出勝負(fù)的話就是平局的情況。
為了判斷棋盤(pán)是否滿了,我們也需要相應(yīng)的功能來(lái)簡(jiǎn)化我們的代碼。

//判斷棋盤(pá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;
}

二、程序演示

在這里插入圖片描述

三、完整代碼

以下是完整代碼,有需要的可以查看,我用了三個(gè)文件來(lái)存儲(chǔ),兩個(gè).c文件用來(lái)書(shū)寫(xiě)主要代碼,一個(gè).h文件用來(lái)存儲(chǔ)預(yù)處理指令和宏定義

1.main.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"


int main()
{
	test();
	return 0;
}

2.game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()
{
	printf("**********************************\n");
	printf("**********   1.play   ************\n");
	printf("**********   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)
	{
		Player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret == 'O')
		{
			printf("玩家贏!\n");
			break;
		}
		if (ret == 'D')
		{
			printf("平局\n");
			break;
		}
		Computer_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret == 'X')
		{
			printf("電腦贏!\n");
			break;
		}
	}

}
void test()
{
	srand((unsigned int)time(NULL));
	int input = 0;

	do
	{
		menu();
		printf("請(qǐng)選擇:->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲!\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n");
			break;
		}
	} while (input);
}

//初始化棋盤(pán)
void InitBoard(char board[][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] = ' ';
		}
	}
}
//打印棋盤(pán)
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		printf("+---+---+---+\n");
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("| %c ", board[i][j]);
		}
		printf("|\n");
	}
	printf("+---+---+---+\n");
}
//玩家下棋
void Player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋:->");
		scanf("%d %d", &x, &y);

		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'O';
				break;
			}
			else
			{
				printf("坐標(biāo)已被占用!\n");
			}
		}
		else
		{
			printf("坐標(biāo)非法,請(qǐng)重新輸入!\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] = 'X';
			break;
		}
	}
}
//判斷棋盤(pá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;
}
//判斷輸贏
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])
		{
			return board[i][0];
		}

		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
		{
			return board[0][i];
		}

	}
	//判斷對(duì)角線
	if ((board[0][0] == board[1][1] && board[1][1] == board[2][2])
		|| (board[0][2] == board[1][1] && board[1][1] == board[2][0]))
	{
		return board[1][1];
	}

	if (Is_full(board, row, col))
	{
		return 'D';  //平局
	}
	return 'C'; //Continue表示繼續(xù)
}

3.game.h

#define _CRT_SECURE_NO_WARNINGS 1

#define ROW 3
#define COL 3

#include<stdio.h>
#include<math.h>
#include<time.h>

void test();
void menu();

void InitBoard(char board[ROW][COL], int, int);
void DisplayBoard(char board[ROW][COL], int, int);
void Player_move(char board[ROW][COL], int, int);
void Computer_move(char board[ROW][COL], int, int);
char Is_win(char board[ROW][COL], int, int);

總結(jié)

以上就是一個(gè)完整的三子棋小游戲的C語(yǔ)言實(shí)現(xiàn)版本,謝謝觀看!

以上就是詳解用C語(yǔ)言實(shí)現(xiàn)三子棋游戲流程的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言 三子棋的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù)

    C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù)

    這篇文章主要介紹了C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù),分別為getpid()函數(shù)和getppid()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • vscode調(diào)試使用make編譯的項(xiàng)目

    vscode調(diào)試使用make編譯的項(xiàng)目

    VSCode本身是一個(gè)代碼編輯器,自帶的編譯功能比較弱,本文主要介紹了vscode調(diào)試使用make編譯的項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 一文帶你深入了解C++中音頻PCM數(shù)據(jù)

    一文帶你深入了解C++中音頻PCM數(shù)據(jù)

    PCM(Pulse Code Modulation)也被稱(chēng)為脈沖編碼調(diào)制,是數(shù)字通信的編碼方式之一。這篇文章主要和大家聊聊C++中音頻PCM數(shù)據(jù)的相關(guān)操作,需要的可以參考一下
    2023-02-02
  • C++實(shí)現(xiàn)哈夫曼樹(shù)編碼解碼

    C++實(shí)現(xiàn)哈夫曼樹(shù)編碼解碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)哈夫曼樹(shù)編碼解碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 在C語(yǔ)言中輸入中文字符串講解

    在C語(yǔ)言中輸入中文字符串講解

    這篇文章主要介紹了在C語(yǔ)言中輸入中文字符串講解,本文通過(guò)概念和案例相結(jié)合講述了如何在C語(yǔ)言中使用中文,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言利用sprintf固定字符串輸出位數(shù)

    C語(yǔ)言利用sprintf固定字符串輸出位數(shù)

    sprintf?函數(shù)是一個(gè)?C?語(yǔ)言中的函數(shù),也被許多其他編程語(yǔ)言所支持。這篇文章主要介紹了C語(yǔ)言如何利用sprintf固定字符串輸出位數(shù),需要的可以參考一下
    2023-03-03
  • C語(yǔ)言中循環(huán)嵌套的應(yīng)用方式

    C語(yǔ)言中循環(huán)嵌套的應(yīng)用方式

    這篇文章主要介紹了C語(yǔ)言中循環(huán)嵌套的應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼

    C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn)

    使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn)

    這篇文章主要介紹了使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳解Matlab繪制3D玫瑰花的方法(內(nèi)附旋轉(zhuǎn)版本)

    詳解Matlab繪制3D玫瑰花的方法(內(nèi)附旋轉(zhuǎn)版本)

    這篇文章主要為大家介紹了如何利用Matlab繪制3D版的玫瑰花以及旋轉(zhuǎn)版的3D玫瑰花,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試
    2022-03-03

最新評(píng)論