C语言数组超详细讲解中篇三子棋

目录
  • 前言
  • 1、三子棋是什么?
    • 1.1 百度百科
    • 1.2 游戏编程准备工作
  • 2. 程序实现
    • 2.1 搭建程序框架
    • 2.2 模块化编程
      • 2.2.1 源文件test.c
      • 2.2.2 源文件play.c
      • 2.2.3 头文件play.h
    • 2.3 程序实现—拓展play函数
      • 2.3.1 棋盘初始化与打印函数
      • 2.3.2 玩家下棋函数 PlayMover
      • 2.3.3 电脑下棋函数 ComputerMove
      • 2.2.4 判断赢家函数 WhoIsWin
  • 总结

前言

本文主要是对前面所学内容进行复习和练习,学习内容包括但不限于:

  • 分支与循环语句
  • 函数
  • 数组

本文要通过编写三子棋的游戏来进行知识点的再学习。

1、三子棋是什么?

1.1 百度百科

三子棋是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。

1.2 游戏编程准备工作

通过观察上图,三子棋是下在一个井字形或者九宫格的棋盘内的。因此,我们可以先从打印一个棋盘入手开始编写程序。为了方便起见,我们规定输出下面这样的九宫格棋盘。

参照三子棋的下棋规则,制定初步的编程思路:

1、在玩游戏开始前输出一些符号和文字,让界面更加有仪式感,例如:

	printf("*********************\n");
	printf("*****1. 开始游戏*****\n");
	printf("*****0. 退出游戏*****\n");
	printf("*********************\n");

2、提示玩家选择:

  • 输入1代表玩游戏
  • 输入0代表退出游戏
  • 输入其他,提示输入错误,需要玩家重新输入

3、下棋开始前先初始化棋盘,在打印出棋盘

4、玩家下棋后,再次打印出棋盘

5、电脑下棋后,再次打印出棋盘

6,如此循环往复几步后,判断赢家是谁,下棋结束

7、玩家可选择继续玩还是退出程序

2. 程序实现

2.1 搭建程序框架

我们首先搭建程序框架,让程序能够跑起来,再接着修改程序,实现基本功能。

因为游戏是多次进行的,选择do-while循环结构,编写程序主题结构。

void menu()
{//输出提示字符
	printf("*********************\n");
	printf("*****1. 开始游戏*****\n");
	printf("*****0. 退出游戏*****\n");
	printf("*********************\n");
}
void play()
{//玩游戏的代码
	printf("玩家选择玩游戏!\n");
}

int main()
{//利用do-while循环,写成主体结构
	int input = 0;
	do
	{
		menu();//输出提示信息
		printf("请选择1或者0==> ");//1代表玩,0代表退出游戏
		scanf("%d", &input);//玩家输入
		switch (input)
		{//通过分支结构,决定输入是什么
			case 1://玩游戏
				play();//调用玩游戏的函数
				break;
			case 0://退出游戏
				printf("退出游戏!\n");
				break;
			default://重新输入
				printf("输入错误,请重新输入1或0 \n");
				break;
		}//先进入循环输出提示信息,当输入1时,满足循环条件,接着执行循环里面的程序,也就是玩游戏
		//当输入0时,不满足循环条件,也就是退出游戏
		//使用do-while循环符合逻辑
	} while (input);
	return 0;
}

运行程序,分别输入1 2 0,输出结果如下所示,达到了预期的界面效果:

  • 输入1代表玩游戏
  • 输入其他,提示输入错误,需要玩家重新输入
  • 输入0代表退出游戏

2.2 模块化编程

上面一小节的代码搭建了程序的框架,能实现程序的基础功能,我们接着进一步play函数中添加代码,完善玩游戏的功能

由于代码较多,将采用模块化编程,这一使代码可读性更高一点。将不同功能的函数实现放在不同的源文件中。

2.2.1 源文件test.c

将函数main 、test、menu、play放入源文件test.c中,这里只是初步规划,代码会随着实现功能慢慢增加。

//后续将会逐步添加,不表明只有这些
#include "play.h"//头文件必须添加,printf等函数正常工作

void menu()
{//输出提示字符
	printf("*********************\n");
	printf("*****1. 开始游戏*****\n");
	printf("*****0. 退出游戏*****\n");
	printf("*********************\n");
}
void play()
{//玩游戏的具体实现代码
	printf("玩家选择玩游戏!\n");
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
}
void test()
{//游戏界面代码
	int input = 0;
	do
	{
		menu();
		printf("请选择1或者0==> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			play();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新输入1或0 \n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

2.2.2 源文件play.c

将函数初始化棋盘、打印棋盘、玩家下棋,等等放入源文件play.c,这里只是初步规划,代码会随着实现功能慢慢增加。

//后续将会逐步添加,不表明只有这些
#include "play.h"//头文件必须添加,包含stdio.h,使printf等函数正常工作
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
}
//打印棋盘
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

将宏定义,函数声明放在这个头文件件play.h,这里只是初步规划,代码会随着实现功能慢慢增加。

//后续将会逐步添加,不表明只有这些
#include<stdio.h>//添加头文件

#define ROW 3//棋盘行数
#define COL 3//棋盘列数

void play();
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
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 程序实现—拓展play函数

2.3.1 棋盘初始化与打印函数

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

  • 使用函数 InitBoard: 初始化棋盘,用空格初始化
  • 使用函数 DisplayBoard: 将棋盘打印出来。
//test.c
void play()
{
	printf("玩家选择玩游戏!\n");
	//存放下棋的数据 ROW代表棋盘行数,COL代表棋盘列数
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//展示棋盘,打印
	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] = ' ';//赋值空格,进行格式化
		}
	}
}
//第一稿
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++)
		{//此时数组里都是空格
			printf("%c", board[i][j]);//都是空格看不见
		}
		printf("\n");
	}
}

运行结果显示,函数InitBoard使用空格完成初始化,但是空格直接打印都是空白,看不见,因此需要修改打印函数DisplayBoard

  • 2.3.1.1 打印函数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
}

打印结果如上图,基本上是一个九宫格棋盘了。但是第三行的字符是多余的,需要再次修改。

  • 2.3.1.2 打印函数DisplayBoard——修改2
//第三稿
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{//但是这里有问题,每行的输出是固定的3个,当行列改变时,这里就不能用了
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		//打印分隔符
		if(i<ROW-1)//第三行不打印
			printf("---|---|---\n");
	}
}

运行结果如上所示。但是上面的代码也存在问题,每行字符输出是固定的3个,当行列改变时,这里就会出问题。

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

将棋盘的行数、列数改为10 ,运行结果如下:

因此,这行代码需要修改。

  • 2.3.1.3 打印函数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++)
		{//将这里改为自动化输出
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf("\n");
		//打印分隔符
		if (i < row - 1)//第三行不打印
			printf("---|---|---\n");
	}
}

上图为显示结果,第三列有问题,对代码进行修改。

  • 2.3.1.4 打印函数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");//这里也有问题,写成固定的
	}
}

上面是运行结果,**程序代码也存在问题,同前面一样,输出的字符是固定的,**因此再次修改代码。

	printf("---|---|---\n");//这里也有问题,写成固定的
  • 2.3.1.5 打印函数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++)
			{//此时可以测试10行10列了
				printf("---");//纯粹的符号打印,没有输入的字符
				if (j < col - 1)//第三列不打印
					printf("|");
			}
			printf("\n");//每一行打完就换行
		}
	}
}

运行结果如上图。将棋盘行数、列数改为10,再次运行,结果见下图,由此,打印函数DisplayBoard修改结束,符合使用要求了。

2.3.2 玩家下棋函数 PlayMover

在初始化并打印棋盘后,接着就要邀请玩家下棋了,下完后也要打印出棋盘。在函数 paly 里添加 PlayMover 和 DisplayBoard。

void play()
{
	printf("玩家选择玩游戏!\n");
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//展示棋盘,打印
	DisplayBoard(board, ROW, COL);
	//玩家下棋
	PlayMover(board, ROW, COL);
	//展示棋盘,打印
	DisplayBoard(board, ROW, COL);
}

玩家下棋函数 PlayMover,根据玩家输入的坐标信息,在对应的位置输入*,代表落下棋子。

void PlayMover(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("游戏已开始,请玩家下棋\n");
	while (1)
	{
		printf("请输入落棋子位置 ==> ");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{//玩家的角度,行列都是1开始的
			//下棋
			if (board[x - 1][y - 1] == ' ')//数组角度,代码要减1
			{//落棋位置,就是前面打印棋盘 %c 的位置
				board[x - 1][y - 1] = '*';//输入字符,代表落下棋子
				break;
			}
			else
			{
				printf("该位置已有棋子,请重新选择落子位置\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

输入坐标1 1,结果显示:在对应位置输出*,代表落下棋子。由此表明,玩家下棋函数 PlayMover符合预期效果。

2.3.3 电脑下棋函数 ComputerMove

玩家下棋后,打印出棋盘,紧接着就轮到电脑下棋了,同样打印出棋盘。在函数 paly 里添加 ComputerMove 和 DisplayBoard。

void play()
{
	printf("玩家选择玩游戏!\n");
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//展示棋盘,打印
	DisplayBoard(board, ROW, COL);
	//玩家下棋
	PlayMover(board, ROW, COL);
	//展示棋盘,打印
	DisplayBoard(board, ROW, COL);
	//电脑下棋
	ComputerMove(board, ROW, COL);
	//展示棋盘,打印
	DisplayBoard(board, ROW, COL);
}

电脑是自己随机下棋的,电脑的行数、列数先随机产生一个0-2的坐标位置,再判断这个位置是否为空:

  • 为空,输入字符#,代表电脑在此落下棋子
  • 否则,会循环再次产生随机数,直到为空

下面将在源文件 play.c 中添加函数 ComputerMove 的实现代码,并在头文件 play.h 中添加函数声明。

//头文件 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)
	{//电脑下棋是随机的
		x = rand() % row;//输出0-2之间的随机数 0 1 2
		y = rand() % col;//输出0-2之间的随机数 0 1 2
		if (board[x][y]==' ')//先判断对应坐标是否为空格
		{//空格代表没有棋子,则电脑将落下棋子
			board[x][y] = '#';//#代表电脑下棋
			break;//下完就跳出循环
		}
	}
}

由于坐标位置随机产生的,要在 头文件 play.h 中添加两个头文件

#include <stdlib.h>//库函数
#include <time.h>//与系统时间有关的

在源文件 test.c 中的函数test中,添加函数srand,放在do-while循环之前,这样电脑下棋的位置将是真正的随机产生。

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

运行结果见上图,由于下棋是双方轮流下棋的,所以玩家下棋和电脑下棋是一个循环的动作。在此在函数play 添加while循环:

void play()
{
	printf("玩家选择玩游戏!\n");
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//展示棋盘,打印
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		PlayMover(board, ROW, COL);
		//展示棋盘,打印
		DisplayBoard(board, ROW, COL);
		//电脑下棋
		ComputerMove(board, ROW, COL);
		//展示棋盘,打印
		DisplayBoard(board, ROW, COL);
	}
}

运行结果见上图。到此,代码已经实现了正常的下棋功能并显示出来。

2.2.4 判断赢家函数 WhoIsWin

三子棋棋盘一共只能下9个棋子,因此经过双方几轮下棋后,势必会分出胜负,结果分为三种:

  • 玩家赢,约定返回 *
  • 电脑赢,约定返回 #
  • 平局,约定返回 q,此时棋盘已满是棋子,不分胜负
  • 其他情况,约定返回 c,继续下棋

当然,以上结果是不包括掀了棋盘的。

基于前面的代码基础上,在函数 paly 里添加判断赢家的函数WhoIsWin ,修改后的函数 play逻辑是:

  • 在while循环中,玩家先下棋
  • 函数 WhoIsWin 会判断棋盘的结果,并以字符的方式返回,赋值给result
  • if判断result的值

(1)若返回的字符是c,则程序往下运行,轮到电脑下棋

(2)若返回的字符不是c,说明下棋出结果了,break直接跳出while循环,进行剩下的3个if判断

(3)返回 *,代表玩家赢; 返回 #,代表电脑赢;返回 c,代表平局;

void play()
{
	printf("玩家选择玩游戏!\n");
	char result = 0;//棋盘最终结果根据result判断
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//展示棋盘,打印
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		PlayMover(board, ROW, COL);
		//展示棋盘,打印
		DisplayBoard(board, ROW, COL);
		result = WhoIsWin(board, ROW, COL);//函数判断下棋结果后,返回对应的字符
		if (result !='c')//玩家下棋后进行一次判断
		{//不继续下棋,说明已经分出胜负了
			break;
		}
		//电脑下棋
		ComputerMove(board, ROW, COL);
		//展示棋盘,打印
		DisplayBoard(board, ROW, COL);
		result = WhoIsWin(board, ROW, COL);//函数判断下棋结果后,返回对应的字符
		if (result != 'c')//电脑下棋后进行一次判断
		{//不继续下棋,说明已经分出胜负了
			break;
		}
	}
	//根据函数WhoIsWin返回的字符,输出下棋结果
	if (result == '*')
	{
		printf("玩家赢了\n");
	}
	else if (result == '#')
	{
		printf("电脑赢了\n");
	}
	else
	{
		printf("平局\n");
	}
}

在源文件 play.c 添加 WhoIsWin 的代码,并在**头文件 play.h **添加函数声明:

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

函数 WhoIsWin 的逻辑:

  • 判断每一行、每一列、对角线上,三个棋子相同吗?相同且不是空格,直接返回代表棋子的字符, *为玩家,#为电脑
  • 棋盘棋子都是满的,则代表平局,返回字符 q
  • 其他情况,代表继续下棋,还没分出胜负,返回字符 c
//源文件 play.c中
//判断棋盘是否满了? 此函数包含在 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;//存在空格棋盘没有满
			}
		}
	}
}
//判断赢家
char WhoIsWin(char board[ROW][COL], int row, int col)
{
	//判断行,每一行连续三个棋子相同
	for (int  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 (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];
		}
	}
	//对角线,连续三个棋子相同
	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 (IfFull(board, row, col) == 1)
	{
		return 'q';//quit表示平局
	}
	//没有赢家,棋盘也没满,继续下棋
	return 'c';//continue,表示继续
}

运行结果见下图,基本上一个完整的三子棋游戏代码已经实现了。

但是上述代码还有一个小问题,在判断每一行、每一列、对角线上,三个棋子是否相同时,代码直接写固定的3个,如果将棋盘改成5行5列的五子棋时,这里就会出现问题了。这里留到以后在修改成能适应五子棋的游戏。三子棋的代码实现就告一段落了。

完整代码放入gitee中:

三子棋完整代码

总结

本文主要是游戏三子棋的实现,从零开始,介绍了代码实现的思路,应该从简单的代码实现,然后再逐步添加代码功能,及时打印结果进行调试,查看代码是否达到预期要求,最终完善代码。

代码是从简单代码慢慢增加,删减、优化变成复杂的代码,不可能是从上往下的模式去设计代码,这不科学。要熟悉三子棋编写代码的流程,培养好的写代码的习惯。

到此这篇关于C语言数组超详细讲解中篇三子棋的文章就介绍到这了,更多相关C语言 三子棋内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言三子棋一步步实现详程

    目录 一.创建菜单(在test.c中) 二.创建游戏内容 1.棋盘的创建和初始化 2.打印棋盘 3.玩家下棋 4.电脑下棋 5.判断输赢 完整代码 1.game.h 2.game.c 3.test.c 游戏思路: 1.创建初始游戏界面菜单 2.创建游戏内容: 初始化棋盘  打印棋盘 设置两方棋子 玩家下  电脑下  判断输赢 代码行数较多,这里我们 : 创建 game.h 头文件来声明函数 创建 game.c 源文件来定义函数 创建   test.c   源文件来运行游戏 一.创建菜单(在tes

  • C语言新手初阶教程之三子棋实现

    目录 三子棋 创建项目环境 头文件内容 编写main函数(test.c) 实现每一个接口函数 1.board 2.printfboard 3.play 4.computerplay 5.win 总结 三子棋 大家小时候应该都玩过三子棋吧,学习了这么久的C语言,我们其实已经具备了做三子棋这种小型项目的能力,今天我会尽量沉浸式的教大家实现三子棋,如果看完这篇博客还是不会的可以去我最后附上的gitee仓库链接中寻找.但我还是希望大家能自己完成,在三子棋中体现自己的风格. 创建项目环境 首先,第一步,打

  • 基于C语言实现简易三子棋游戏

    用C语言写三子棋的具体代码,供大家参考,具体内容如下 1.头文件 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //标识符定义 #define ROW 3 #define COL 3 //函数定义 //棋盘初始化 void init_board(char board[ROW][COL], int row, int col); //打印棋盘 void display_board(char

  • 一盘王者的时间用C语言实现三子棋

    目录 1.先进行环境的配置 2.各种功能实现的逻辑关系 2.1实现游戏的开始退出流程 2.2 创建一个名为board的二维数组,并进行初始化 2.3 棋盘的搭建 2.4 玩家下棋,并打印新的棋盘 2.5 电脑下棋,并打印新的棋盘 2.6.判断结果 3.程序实现的代码 3.1 text.c 3.2 game.h 3.3 game.c 1.先进行环境的配置 一共会用到三个文件,分别是两个源文件test.c game.c ,还有一个头文件game.h 他们的关系分别是: test.c是主体,是游戏的测

  • c语言实现简易版三子棋(附完整代码)

    目录 一.菜单栏 二.初始化棋盘 三.打印棋盘 四.玩家下棋 五.电脑下棋 六.判断输赢 七.调用玩家.电脑下棋函数和判断输赢函数 八.全部代码 总结 一.菜单栏 1.制作一个简易版的菜单,并附上选项提示 2.因为该程序想至少运行一次,所有选择用do while循环,而选择玩与不玩游戏时,则采用switch case语句比较合适,然后调用相应的函数即可 二.初始化棋盘 1.先创建一个棋盘 为了便于更改棋盘大小,所有采用宏定义的方式来定义其行与列 2.对棋盘进行初始化 起初未下棋时,棋盘应该是空白

  • C语言实现简单的三子棋游戏源码

    本文实例为大家分享了C语言实现简单的三子棋游戏的具体代码,供大家参考,具体内容如下 1.游戏的整体划分 因为C语言是面向过程的,我将游戏抽象出来玩家下棋,电脑下棋,在判断输赢这一过程,又通过对过程的分析,进行了具体函数的实现,分为如下模块: 游戏主菜单函数 void menu(); 初始化棋盘函数 void InitBoard(char board[ROW][COL], int row, int col): 打印棋盘函数 void DisplayBoard(char board[ROW][COL

  • C语言实现三子棋实例代码

    我是半自主的完成了这个程序,看了B站鹏哥视频并仔细思索后才做出来的,我没有完全采用他的方法,导致程序还有一些不足之处,还请各位大佬指出. 首先,我将该程序的实现分为3个板块,main,game.h,和game.c; 代码如下: #define _CRT_SECURE_NO_WARNINGS #include"game.h" void menu() { printf("****************************************\n"); prin

  • C语言数组实现三子棋应用实例

    本文实例为大家分享了C语言数组实现三子棋应用的具体代码,供大家参考,具体内容如下 三子棋:(拆分部分如下) test.c 测试游戏逻辑 game.h关于游戏相关的函数声明,符号声明 头文件的包含 game.c游戏相关函数的实现 游戏进行的过程:(4种) 1.玩家获胜--*(游戏结束) 2.电脑获胜--#(游戏结束) 3.平局--Q(游戏结束) 4.游戏继续--C IsWin函数 用来判断游戏的状态 game.c #include"game.h" #include<stdio.h&

  • C语言数组超详细讲解中篇三子棋

    目录 前言 1.三子棋是什么? 1.1 百度百科 1.2 游戏编程准备工作 2. 程序实现 2.1 搭建程序框架 2.2 模块化编程 2.2.1 源文件test.c 2.2.2 源文件play.c 2.2.3 头文件play.h 2.3 程序实现—拓展play函数 2.3.1 棋盘初始化与打印函数 2.3.2 玩家下棋函数 PlayMover 2.3.3 电脑下棋函数 ComputerMove 2.2.4 判断赢家函数 WhoIsWin 总结 前言 本文主要是对前面所学内容进行复习和练习,学习内

  • C语言数组超详细讲解下篇扫雷

    目录 前言 1.扫雷是什么? 2.程序框架 2.1 主函数 2.2 函数menu 2.3 函数game 2.3.1 函数init_board 2.3.2 函数show_board 2.3.3 函数set_mine 2.3.4 函数find_mine 2.3.5 函数get_mine_count 3.头文件.h 4.游戏试玩 总结 前言 本文接着复习前面所学知识,以扫雷游戏为例. 1.扫雷是什么? 百度百科:<扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子

  • C语言数组超详细讲解上

    目录 前言 1.一维数组的创建和初始化 1.1 一维数组的创建 1.2 一维数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2.二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3.数组越界 4.数组作为函数参数 4.1 冒泡排序函数的错误设计 4.2 数组名是什么? 4.3 对数组名的用法进行总结 4.4 冒泡排序函数的正确设计 总结 前言 本文主要介绍数组相关的内容,主要内容包括: 一维数组

  • C语言数据的存储超详细讲解中篇练习

    目录 前言 数据的存储的知识点练习 练习 1 练习 2 练习 3 练习 4 练习 5 练习 6 练习 7 总结 前言 本文继续学习数据在内存中存储的相关知识点. 数据存储 整型提升 数据的存储的知识点练习 通过几个练习来深入学习数据在内存中存储的知识点,先复习前面学过的整形提升的知识点:C语言操作符超详细讲解下篇 整形提升是按照变量的数据类型的符号来提升的 负数的整形提升,最高位补充符号位,即1,例如 char a=-1;11111111 截断后的补码1111111111111111111111

  • C语言指针超详细讲解上篇

    目录 前言 1.指针是什么 1.1 指针变量 1.2 指针是内存中一个最小单元的编号 2.指针和指针类型 2.1 指针±类型 2.2 指针的解引用 2.2.1 int* 类型的解引用 2.2.2 char* 类型的解引用 3.野指针 3.1 野指针成因 3.1.1 指针未初始化 3.1.2 指针越界访问 3.1.3 指针指向的空间释放 3.2 如何规避野指针 总结 前言 本文开始指针相关内容的学习,主要内容包括: 指针是什么 指针和指针类型 野指针 指针运算 指针和数组 二级指针 指针数组 1.

  • C语言操作符超详细讲解下篇

    目录 前言 赋值操作符 单目操作符 单目操作符介绍 sizeof 和 数组 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用与函数调用和结构成员 [ ] 下标引用操作符 ( ) 函数调用操作符 访问一个结构的成员 表达式求值 隐式类型转换-整形提升 算术转换 操作符的属性 总结 前言 本文接着学习操作符的内容. 赋值操作符 赋值操作符就是能够重新赋值 int weight = 120;//体重 weight = 89;//不满意就赋值 double salary = 10000.0; s

  • C语言指针超详细讲解下篇

    目录 前言 指针运算 指针±整数 4.1 指针±整数 4.2 指针-指针 4.3 指针的关系运算 5.指针和数组 6.二级指针 7.指针数组 7.1 举例 1 7.2 举例 2 总结 前言 本文接着上一篇内容,继续学习指针相关知识点. 指针运算 指针±整数 指针-指针 指针的关系运算 4.1 指针±整数 #define VALUE 5 int main() { float values[VALUE]; float *vp; //指针+-指针,关系运算 for (vp = &values[0];

  • C语言函数超详细讲解下篇

    目录 前言 函数的声明和定义 函数声明 函数定义 举例 简单的求和函数 把加法单独改写成函数 添加函数声明 带头文件和函数声明 静态库(.lib)的生成 静态库文件的使用方法 函数递归 什么是递归? 递归的两个必要条件 练习1 一般方法 递归的方法 练习2 一般方法 递归方法 练习3 一般方法 递归方法 练习4 一般方法 递归方法 递归与迭代 递归隐藏的问题 如何改进 选递归还是迭代 总结 前言 紧接上文,继续学习函数相关内容. 函数的声明和定义 函数声明 告诉编译器有一个函数叫什么,参数是什么

  • C语言函数超详细讲解上篇

    目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.1.1 如何学会使用库函数 2.1.2 自定义函数 3.函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4.函数的调用 4.1 传值调用 4.2 传址调用 4.3 练习 4.3.1 判断一个数是不是素数 4.3.2 判断一年是不是闰年 4.3.3 二分查找 4.3.4 数值自增增加1 5.函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 总结 前言 本文主要学习函数的相关内容. 1.函数是什么?

  • C语言数据结构超详细讲解单向链表

    目录 1.链表概况 1.1 链表的概念及结构 1.2 链表的分类 2. 单向链表的实现 2.1 SList.h(头文件的汇总,函数的声明) 2.2 SList.c(函数的具体实现逻辑) 2.2.1 打印链表 2.2.2 搞出一个新节点(为其他函数服务) 2.2.3 链表尾插 2.2.4 链表头插 2.2.5 链表尾删 2.2.6 链表头删 2.2.7 查找节点 2.2.8 在pos位置之前插入 2.2.9 在pos位置之后插入 2.2.10 删除pos位置 2.2.11 删除pos之后位置 2.

随机推荐