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

C語(yǔ)言數(shù)組超詳細(xì)講解中篇三子棋

 更新時(shí)間:2022年04月13日 17:04:00   作者:初學(xué)C語(yǔ)言者  
數(shù)組是一組有序的數(shù)據(jù)的集合,本篇將帶你結(jié)合數(shù)組來(lái)實(shí)現(xiàn)三子棋小游戲,上手實(shí)練更快的能夠掌握數(shù)組使用,感興趣的朋友來(lái)看看吧

前言

本文主要是對(duì)前面所學(xué)內(nèi)容進(jìn)行復(fù)習(xí)和練習(xí),學(xué)習(xí)內(nèi)容包括但不限于:

  • 分支與循環(huán)語(yǔ)句
  • 函數(shù)
  • 數(shù)組

本文要通過(guò)編寫(xiě)三子棋的游戲來(lái)進(jìn)行知識(shí)點(diǎn)的再學(xué)習(xí)。

1、三子棋是什么?

1.1 百度百科

三子棋是黑白棋的一種。三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來(lái),相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了。但是,有很多時(shí)候會(huì)出現(xiàn)和棋的情況。

在這里插入圖片描述

1.2 游戲編程準(zhǔn)備工作

通過(guò)觀察上圖,三子棋是下在一個(gè)井字形或者九宮格的棋盤(pán)內(nèi)的。因此,我們可以先從打印一個(gè)棋盤(pán)入手開(kāi)始編寫(xiě)程序。為了方便起見(jiàn),我們規(guī)定輸出下面這樣的九宮格棋盤(pán)。

在這里插入圖片描述

參照三子棋的下棋規(guī)則,制定初步的編程思路:

1、在玩游戲開(kāi)始前輸出一些符號(hào)和文字,讓界面更加有儀式感,例如:

	printf("*********************\n");
	printf("*****1. 開(kāi)始游戲*****\n");
	printf("*****0. 退出游戲*****\n");
	printf("*********************\n");

2、提示玩家選擇:

  • 輸入1代表玩游戲
  • 輸入0代表退出游戲
  • 輸入其他,提示輸入錯(cuò)誤,需要玩家重新輸入

3、下棋開(kāi)始前先初始化棋盤(pán),在打印出棋盤(pán)

4、玩家下棋后,再次打印出棋盤(pán)

5、電腦下棋后,再次打印出棋盤(pán)

6,如此循環(huán)往復(fù)幾步后,判斷贏家是誰(shuí),下棋結(jié)束

7、玩家可選擇繼續(xù)玩還是退出程序

2. 程序?qū)崿F(xiàn)

2.1 搭建程序框架

我們首先搭建程序框架,讓程序能夠跑起來(lái),再接著修改程序,實(shí)現(xiàn)基本功能。

因?yàn)橛螒蚴嵌啻芜M(jìn)行的,選擇do-while循環(huán)結(jié)構(gòu),編寫(xiě)程序主題結(jié)構(gòu)。

void menu()
{//輸出提示字符
	printf("*********************\n");
	printf("*****1. 開(kāi)始游戲*****\n");
	printf("*****0. 退出游戲*****\n");
	printf("*********************\n");
}
void play()
{//玩游戲的代碼
	printf("玩家選擇玩游戲!\n");
}

int main()
{//利用do-while循環(huán),寫(xiě)成主體結(jié)構(gòu)
	int input = 0;
	do
	{
		menu();//輸出提示信息
		printf("請(qǐng)選擇1或者0==> ");//1代表玩,0代表退出游戲
		scanf("%d", &input);//玩家輸入
		switch (input)
		{//通過(guò)分支結(jié)構(gòu),決定輸入是什么
			case 1://玩游戲
				play();//調(diào)用玩游戲的函數(shù)
				break;
			case 0://退出游戲
				printf("退出游戲!\n");
				break;
			default://重新輸入
				printf("輸入錯(cuò)誤,請(qǐng)重新輸入1或0 \n");
				break;
		}//先進(jìn)入循環(huán)輸出提示信息,當(dāng)輸入1時(shí),滿足循環(huán)條件,接著執(zhí)行循環(huán)里面的程序,也就是玩游戲
		//當(dāng)輸入0時(shí),不滿足循環(huán)條件,也就是退出游戲
		//使用do-while循環(huán)符合邏輯
	} while (input);
	return 0;
}

運(yùn)行程序,分別輸入1 2 0,輸出結(jié)果如下所示,達(dá)到了預(yù)期的界面效果:

  • 輸入1代表玩游戲
  • 輸入其他,提示輸入錯(cuò)誤,需要玩家重新輸入
  • 輸入0代表退出游戲

在這里插入圖片描述

2.2 模塊化編程

上面一小節(jié)的代碼搭建了程序的框架,能實(shí)現(xiàn)程序的基礎(chǔ)功能,我們接著進(jìn)一步play函數(shù)中添加代碼,完善玩游戲的功能

由于代碼較多,將采用模塊化編程,這一使代碼可讀性更高一點(diǎn)。將不同功能的函數(shù)實(shí)現(xiàn)放在不同的源文件中。

2.2.1 源文件test.c

將函數(shù)main 、test、menu、play放入源文件test.c中,這里只是初步規(guī)劃,代碼會(huì)隨著實(shí)現(xiàn)功能慢慢增加。

//后續(xù)將會(huì)逐步添加,不表明只有這些
#include "play.h"http://頭文件必須添加,printf等函數(shù)正常工作

void menu()
{//輸出提示字符
	printf("*********************\n");
	printf("*****1. 開(kāi)始游戲*****\n");
	printf("*****0. 退出游戲*****\n");
	printf("*********************\n");
}
void play()
{//玩游戲的具體實(shí)現(xiàn)代碼
	printf("玩家選擇玩游戲!\n");
	//存放下棋的數(shù)據(jù)
	char board[ROW][COL] = { 0 };
	//初始化棋盤(pán)為全空格
	InitBoard(board, ROW, COL);
}
void test()
{//游戲界面代碼
	int input = 0;
	do
	{
		menu();
		printf("請(qǐng)選擇1或者0==> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			break;
		case 0:
			printf("退出游戲!\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請(qǐng)重新輸入1或0 \n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

2.2.2 源文件play.c

將函數(shù)初始化棋盤(pán)、打印棋盤(pán)、玩家下棋,等等放入源文件play.c,這里只是初步規(guī)劃,代碼會(huì)隨著實(shí)現(xiàn)功能慢慢增加。

//后續(xù)將會(huì)逐步添加,不表明只有這些
#include "play.h"http://頭文件必須添加,包含stdio.h,使printf等函數(shù)正常工作
//初始化棋盤(pán)
void InitBoard(char board[ROW][COL], int row, int col)
{
}
//打印棋盤(pán)
void DisplayBoard(char board[ROW][COL], int row, int col)
{
}
//玩家下棋
void PlayMover(char board[ROW][COL], int row, int col)
{
}
//電腦下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
}

2.2.3 頭文件play.h

將宏定義,函數(shù)聲明放在這個(gè)頭文件件play.h,這里只是初步規(guī)劃,代碼會(huì)隨著實(shí)現(xiàn)功能慢慢增加。

//后續(xù)將會(huì)逐步添加,不表明只有這些
#include<stdio.h>//添加頭文件

#define ROW 3//棋盤(pán)行數(shù)
#define COL 3//棋盤(pán)列數(shù)

void play();
//初始化棋盤(pán)
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盤(pán)
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayMover(char board[ROW][COL], int row, int col);
//電腦下棋
void ComputerMove(char board[ROW][COL], int row, int col);


2.3 程序?qū)崿F(xiàn)—拓展play函數(shù)

2.3.1 棋盤(pán)初始化與打印函數(shù)

在玩家下棋前,需要完成兩件事情

  • 使用函數(shù) InitBoard: 初始化棋盤(pán),用空格初始化
  • 使用函數(shù) DisplayBoard: 將棋盤(pán)打印出來(lái)。
//test.c
void play()
{
	printf("玩家選擇玩游戲!\n");
	//存放下棋的數(shù)據(jù) ROW代表棋盤(pán)行數(shù),COL代表棋盤(pán)列數(shù)
	char board[ROW][COL] = { 0 };
	//初始化棋盤(pán)為全空格
	InitBoard(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
}
//play.c
void InitBoard(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] = ' ';//賦值空格,進(jìn)行格式化
		}
	}
}
//第一稿
void DisplayBoard(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++)
		{//此時(shí)數(shù)組里都是空格
			printf("%c", board[i][j]);//都是空格看不見(jiàn)
		}
		printf("\n");
	}
}

運(yùn)行結(jié)果顯示,函數(shù)InitBoard使用空格完成初始化,但是空格直接打印都是空白,看不見(jiàn),因此需要修改打印函數(shù)DisplayBoard

在這里插入圖片描述

  • 2.3.1.1 打印函數(shù)DisplayBoard——修改1
//第二稿
void DisplayBoard(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]);
		//打印分隔符
		printf("---|---|---\n");
	}ruxiat
}

在這里插入圖片描述

打印結(jié)果如上圖,基本上是一個(gè)九宮格棋盤(pán)了。但是第三行的字符是多余的,需要再次修改。

  • 2.3.1.2 打印函數(shù)DisplayBoard——修改2
//第三稿
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{//但是這里有問(wèn)題,每行的輸出是固定的3個(gè),當(dāng)行列改變時(shí),這里就不能用了
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		//打印分隔符
		if(i<ROW-1)//第三行不打印
			printf("---|---|---\n");
	}
}

在這里插入圖片描述

運(yùn)行結(jié)果如上所示。但是上面的代碼也存在問(wèn)題,每行字符輸出是固定的3個(gè),當(dāng)行列改變時(shí),這里就會(huì)出問(wèn)題。

printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);

將棋盤(pán)的行數(shù)、列數(shù)改為10 ,運(yùn)行結(jié)果如下:

在這里插入圖片描述

因此,這行代碼需要修改。

  • 2.3.1.3 打印函數(shù)DisplayBoard——修改3
//第四稿
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (int  j = 0; j < col; j++)
		{//將這里改為自動(dòng)化輸出
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf("\n");
		//打印分隔符
		if (i < row - 1)//第三行不打印
			printf("---|---|---\n");
	}
}

在這里插入圖片描述

上圖為顯示結(jié)果,第三列有問(wèn)題,對(duì)代碼進(jìn)行修改。

  • 2.3.1.4 打印函數(shù)DisplayBoard——修改4
//第五稿
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)第三列不打印
				printf("|");
		}
		printf("\n");
		//打印分隔符
		if (i < row - 1)//第三行不打印
			printf("---|---|---\n");//這里也有問(wèn)題,寫(xiě)成固定的
	}
}

在這里插入圖片描述

上面是運(yùn)行結(jié)果,**程序代碼也存在問(wèn)題,同前面一樣,輸出的字符是固定的,**因此再次修改代碼。

	printf("---|---|---\n");//這里也有問(wèn)題,寫(xiě)成固定的
  • 2.3.1.5 打印函數(shù)DisplayBoard——修改5
//第六稿,至此改完
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)第三列不打印
				printf("|");
		}
		printf("\n");//每一行打完就換行
		//打印分隔符
		if (i < row - 1)//第三行不打印
		{
			for (int j = 0; j < col; j++)
			{//此時(shí)可以測(cè)試10行10列了
				printf("---");//純粹的符號(hào)打印,沒(méi)有輸入的字符
				if (j < col - 1)//第三列不打印
					printf("|");
			}
			printf("\n");//每一行打完就換行
		}
	}
}

在這里插入圖片描述

運(yùn)行結(jié)果如上圖。將棋盤(pán)行數(shù)、列數(shù)改為10,再次運(yùn)行,結(jié)果見(jiàn)下圖,由此,打印函數(shù)DisplayBoard修改結(jié)束,符合使用要求了。

在這里插入圖片描述

2.3.2 玩家下棋函數(shù) PlayMover

在初始化并打印棋盤(pán)后,接著就要邀請(qǐng)玩家下棋了,下完后也要打印出棋盤(pán)。在函數(shù) paly 里添加 PlayMover 和 DisplayBoard。

void play()
{
	printf("玩家選擇玩游戲!\n");
	//存放下棋的數(shù)據(jù)
	char board[ROW][COL] = { 0 };
	//初始化棋盤(pán)為全空格
	InitBoard(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
	//玩家下棋
	PlayMover(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
}

玩家下棋函數(shù) PlayMover,根據(jù)玩家輸入的坐標(biāo)信息,在對(duì)應(yīng)的位置輸入*,代表落下棋子。

void PlayMover(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("游戲已開(kāi)始,請(qǐng)玩家下棋\n");
	while (1)
	{
		printf("請(qǐng)輸入落棋子位置 ==> ");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{//玩家的角度,行列都是1開(kāi)始的
			//下棋
			if (board[x - 1][y - 1] == ' ')//數(shù)組角度,代碼要減1
			{//落棋位置,就是前面打印棋盤(pán) %c 的位置
				board[x - 1][y - 1] = '*';//輸入字符,代表落下棋子
				break;
			}
			else
			{
				printf("該位置已有棋子,請(qǐng)重新選擇落子位置\n");
			}
		}
		else
		{
			printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
		}
	}
}

輸入坐標(biāo)1 1,結(jié)果顯示:在對(duì)應(yīng)位置輸出*,代表落下棋子。由此表明,玩家下棋函數(shù) PlayMover符合預(yù)期效果。

在這里插入圖片描述

2.3.3 電腦下棋函數(shù) ComputerMove

玩家下棋后,打印出棋盤(pán),緊接著就輪到電腦下棋了,同樣打印出棋盤(pán)。在函數(shù) paly 里添加 ComputerMove 和 DisplayBoard。

void play()
{
	printf("玩家選擇玩游戲!\n");
	//存放下棋的數(shù)據(jù)
	char board[ROW][COL] = { 0 };
	//初始化棋盤(pán)為全空格
	InitBoard(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
	//玩家下棋
	PlayMover(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
	//電腦下棋
	ComputerMove(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
}

電腦是自己隨機(jī)下棋的,電腦的行數(shù)、列數(shù)先隨機(jī)產(chǎn)生一個(gè)0-2的坐標(biāo)位置,再判斷這個(gè)位置是否為空:

  • 為空,輸入字符#,代表電腦在此落下棋子
  • 否則,會(huì)循環(huán)再次產(chǎn)生隨機(jī)數(shù),直到為空

下面將在源文件 play.c 中添加函數(shù) ComputerMove 的實(shí)現(xiàn)代碼,并在頭文件 play.h 中添加函數(shù)聲明。

//頭文件 play.h中
void ComputerMove(char board[ROW][COL], int row, int col);

//源文件 play.c中
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("電腦下棋 ==> \n");
	while (1)
	{//電腦下棋是隨機(jī)的
		x = rand() % row;//輸出0-2之間的隨機(jī)數(shù) 0 1 2
		y = rand() % col;//輸出0-2之間的隨機(jī)數(shù) 0 1 2
		if (board[x][y]==' ')//先判斷對(duì)應(yīng)坐標(biāo)是否為空格
		{//空格代表沒(méi)有棋子,則電腦將落下棋子 
			board[x][y] = '#';//#代表電腦下棋
			break;//下完就跳出循環(huán)
		}
	}
}

由于坐標(biāo)位置隨機(jī)產(chǎn)生的,要在 頭文件 play.h 中添加兩個(gè)頭文件

#include <stdlib.h>//庫(kù)函數(shù)
#include <time.h>//與系統(tǒng)時(shí)間有關(guān)的

在源文件 test.c 中的函數(shù)test中,添加函數(shù)srand,放在do-while循環(huán)之前,這樣電腦下棋的位置將是真正的隨機(jī)產(chǎn)生。

srand((unsigned int)time(NULL));

在這里插入圖片描述

運(yùn)行結(jié)果見(jiàn)上圖,由于下棋是雙方輪流下棋的,所以玩家下棋和電腦下棋是一個(gè)循環(huán)的動(dòng)作。在此在函數(shù)play 添加while循環(huán):

void play()
{
	printf("玩家選擇玩游戲!\n");
	//存放下棋的數(shù)據(jù)
	char board[ROW][COL] = { 0 };
	//初始化棋盤(pán)為全空格
	InitBoard(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		PlayMover(board, ROW, COL);
		//展示棋盤(pán),打印
		DisplayBoard(board, ROW, COL);
		//電腦下棋
		ComputerMove(board, ROW, COL);
		//展示棋盤(pán),打印
		DisplayBoard(board, ROW, COL);
	}
}

在這里插入圖片描述

運(yùn)行結(jié)果見(jiàn)上圖。到此,代碼已經(jīng)實(shí)現(xiàn)了正常的下棋功能并顯示出來(lái)。

2.2.4 判斷贏家函數(shù) WhoIsWin

三子棋棋盤(pán)一共只能下9個(gè)棋子,因此經(jīng)過(guò)雙方幾輪下棋后,勢(shì)必會(huì)分出勝負(fù),結(jié)果分為三種:

  • 玩家贏,約定返回 *
  • 電腦贏,約定返回 #
  • 平局,約定返回 q,此時(shí)棋盤(pán)已滿是棋子,不分勝負(fù)
  • 其他情況,約定返回 c,繼續(xù)下棋

當(dāng)然,以上結(jié)果是不包括掀了棋盤(pán)的。

基于前面的代碼基礎(chǔ)上,在函數(shù) paly 里添加判斷贏家的函數(shù)WhoIsWin ,修改后的函數(shù) play邏輯是:

  • 在while循環(huán)中,玩家先下棋
  • 函數(shù) WhoIsWin 會(huì)判斷棋盤(pán)的結(jié)果,并以字符的方式返回,賦值給result
  • if判斷result的值

(1)若返回的字符是c,則程序往下運(yùn)行,輪到電腦下棋

(2)若返回的字符不是c,說(shuō)明下棋出結(jié)果了,break直接跳出while循環(huán),進(jìn)行剩下的3個(gè)if判斷

(3)返回 *,代表玩家贏; 返回 #,代表電腦贏;返回 c,代表平局;

void play()
{
	printf("玩家選擇玩游戲!\n");
	char result = 0;//棋盤(pán)最終結(jié)果根據(jù)result判斷
	//存放下棋的數(shù)據(jù)
	char board[ROW][COL] = { 0 };
	//初始化棋盤(pán)為全空格
	InitBoard(board, ROW, COL);
	//展示棋盤(pán),打印
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		PlayMover(board, ROW, COL);
		//展示棋盤(pán),打印
		DisplayBoard(board, ROW, COL);
		result = WhoIsWin(board, ROW, COL);//函數(shù)判斷下棋結(jié)果后,返回對(duì)應(yīng)的字符
		if (result !='c')//玩家下棋后進(jìn)行一次判斷
		{//不繼續(xù)下棋,說(shuō)明已經(jīng)分出勝負(fù)了
			break;
		}
		//電腦下棋
		ComputerMove(board, ROW, COL);
		//展示棋盤(pán),打印
		DisplayBoard(board, ROW, COL);
		result = WhoIsWin(board, ROW, COL);//函數(shù)判斷下棋結(jié)果后,返回對(duì)應(yīng)的字符
		if (result != 'c')//電腦下棋后進(jìn)行一次判斷
		{//不繼續(xù)下棋,說(shuō)明已經(jīng)分出勝負(fù)了
			break;
		}
	}
	//根據(jù)函數(shù)WhoIsWin返回的字符,輸出下棋結(jié)果
	if (result == '*')
	{
		printf("玩家贏了\n");
	}
	else if (result == '#')
	{
		printf("電腦贏了\n");
	}
	else
	{
		printf("平局\n");
	}
}

在源文件 play.c 添加 WhoIsWin 的代碼,并在**頭文件 play.h **添加函數(shù)聲明:

//頭文件 play.h中
char WhoIsWin(char board[ROW][COL], int row, int col);
int IfFull(char board[ROW][COL], int row, int col);

函數(shù) WhoIsWin 的邏輯:

  • 判斷每一行、每一列、對(duì)角線上,三個(gè)棋子相同嗎?相同且不是空格,直接返回代表棋子的字符, *為玩家,#為電腦
  • 棋盤(pán)棋子都是滿的,則代表平局,返回字符 q
  • 其他情況,代表繼續(xù)下棋,還沒(méi)分出勝負(fù),返回字符 c
//源文件 play.c中
//判斷棋盤(pán)是否滿了? 此函數(shù)包含在 WhoIsWin 中
int IfFull(char board[ROW][COL], int row, int col)
{
	for (int  i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//存在空格棋盤(pán)沒(méi)有滿
			}
		}
	}
}
//判斷贏家
char WhoIsWin(char board[ROW][COL], int row, int col)
{
	//判斷行,每一行連續(xù)三個(gè)棋子相同
	for (int  i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{//只要連續(xù)三個(gè)棋子相同,就直接返回這個(gè)棋子,這里不用區(qū)分* 還是#
			return board[i][1];
		}
	}
	//判斷列,每一列連續(xù)三個(gè)棋子相同
	for (int j = 0; j < row; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//對(duì)角線,連續(xù)三個(gè)棋子相同
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{//主對(duì)角線
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{//副對(duì)角線
		return board[1][1];
	}
	//判斷平局,棋盤(pán)滿了,不分勝負(fù)
	if (IfFull(board, row, col) == 1)
	{
		return 'q';//quit表示平局
	}
	//沒(méi)有贏家,棋盤(pán)也沒(méi)滿,繼續(xù)下棋
	return 'c';//continue,表示繼續(xù)
}

運(yùn)行結(jié)果見(jiàn)下圖,基本上一個(gè)完整的三子棋游戲代碼已經(jīng)實(shí)現(xiàn)了。

但是上述代碼還有一個(gè)小問(wèn)題,在判斷每一行、每一列、對(duì)角線上,三個(gè)棋子是否相同時(shí),代碼直接寫(xiě)固定的3個(gè),如果將棋盤(pán)改成5行5列的五子棋時(shí),這里就會(huì)出現(xiàn)問(wèn)題了。這里留到以后在修改成能適應(yīng)五子棋的游戲。三子棋的代碼實(shí)現(xiàn)就告一段落了。

在這里插入圖片描述

完整代碼放入gitee中:

三子棋完整代碼

總結(jié)

本文主要是游戲三子棋的實(shí)現(xiàn),從零開(kāi)始,介紹了代碼實(shí)現(xiàn)的思路,應(yīng)該從簡(jiǎn)單的代碼實(shí)現(xiàn),然后再逐步添加代碼功能,及時(shí)打印結(jié)果進(jìn)行調(diào)試,查看代碼是否達(dá)到預(yù)期要求,最終完善代碼。

代碼是從簡(jiǎn)單代碼慢慢增加,刪減、優(yōu)化變成復(fù)雜的代碼,不可能是從上往下的模式去設(shè)計(jì)代碼,這不科學(xué)。要熟悉三子棋編寫(xiě)代碼的流程,培養(yǎng)好的寫(xiě)代碼的習(xí)慣。

到此這篇關(guān)于C語(yǔ)言數(shù)組超詳細(xì)講解中篇三子棋的文章就介紹到這了,更多相關(guān)C語(yǔ)言 三子棋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)字母大小寫(xiě)轉(zhuǎn)換的方法

    C語(yǔ)言實(shí)現(xiàn)字母大小寫(xiě)轉(zhuǎn)換的方法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)字母大小寫(xiě)轉(zhuǎn)換的方法,涉及C語(yǔ)言字符串的遍歷與轉(zhuǎn)換技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-07-07
  • C語(yǔ)言堆棧幀的介紹與創(chuàng)建

    C語(yǔ)言堆棧幀的介紹與創(chuàng)建

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言堆棧幀的相關(guān)資料,堆棧幀 (stack frame)( 或活動(dòng)記錄 (activation Tecord)) 是一塊堆棧保留區(qū)域,用于存放被傳遞的實(shí)際參數(shù)、子程序的返回值、局部變量以及被保存的寄存器,需要的朋友可以參考下
    2021-08-08
  • 深入解析C++編程中的運(yùn)算符重載

    深入解析C++編程中的運(yùn)算符重載

    這篇文章主要介紹了C++編程中的運(yùn)算符重載,運(yùn)算符重載是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-04-04
  • MFC程序設(shè)計(jì)常用技巧匯總

    MFC程序設(shè)計(jì)常用技巧匯總

    這篇文章主要介紹了MFC程序設(shè)計(jì)常用技巧,實(shí)例匯總了MFC程序設(shè)計(jì)中常見(jiàn)的問(wèn)題與解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • C++通過(guò)自定義函數(shù)求一元二次方程的根

    C++通過(guò)自定義函數(shù)求一元二次方程的根

    這篇文章主要介紹了C++通過(guò)自定義函數(shù)求一元二次方程的根,涉及C++數(shù)學(xué)運(yùn)算相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2016-05-05
  • Qt實(shí)現(xiàn)鬧鐘小程序

    Qt實(shí)現(xiàn)鬧鐘小程序

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)鬧鐘小程序,利用Qt的designer設(shè)計(jì)需要的鬧鐘界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C/C++百行代碼實(shí)現(xiàn)熱門(mén)游戲消消樂(lè)功能的示例代碼

    C/C++百行代碼實(shí)現(xiàn)熱門(mén)游戲消消樂(lè)功能的示例代碼

    這篇文章主要介紹了C/C++百行代碼實(shí)現(xiàn)熱門(mén)游戲消消樂(lè)功能的示例代碼,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C語(yǔ)言JNI的動(dòng)態(tài)注冊(cè)詳解

    C語(yǔ)言JNI的動(dòng)態(tài)注冊(cè)詳解

    這篇文章主要介紹了JAVA JNI的動(dòng)態(tài)注冊(cè),這里提供簡(jiǎn)單實(shí)例代碼,需要的朋友可以參考下,小編覺(jué)得寫(xiě)的還不錯(cuò),希望能給你帶來(lái)幫助
    2021-08-08
  • C++ static的作用解讀

    C++ static的作用解讀

    這篇文章主要介紹了C++ static的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 深入解析Linux下\r\n的問(wèn)題

    深入解析Linux下\r\n的問(wèn)題

    本篇文章是對(duì)Linux下\r\n的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論