C语言三子棋的实现思路到过程详解

目录
  • 一、三子棋小游戏的简单介绍
  • 二、三子棋的思路及代码实现
    • 1、打印游戏菜单
    • 2、选择是否开始游戏
    • 3、创建并且初始化棋盘
      • 3.1、创建棋盘
      • 3.2、初始化棋盘
    • 4、打印格式化棋盘
    • 5、玩家下棋
    • 6、电脑下棋
    • 7、判断是否玩家或者电脑赢
  • 三、整合三子棋游戏代码
    • game.h
    • game.c
    • test.c

一、三子棋小游戏的简单介绍

要说大家都很熟悉的一个小游戏,三子棋算是其中一个了。相信大家都玩过三子棋小游戏,在这里我还是给大家介绍简单的游戏规则:

  • 一次只能下一个棋子;
  • 玩家下完棋子后,电脑下棋子;
  • 不能再重复的位置上下棋子;
  • 不管是玩家还是电脑,谁先达到三个棋子连接在一起的时候获胜;
  • 三个棋子的连接包括:横三个、竖三个、斜三个。

当然,熟悉规则后我们会有一个大概的了解了,那么三子棋游戏的思路及代码到底是怎么实现的呢?接下来我给大家一一详细解析一下。

二、三子棋的思路及代码实现

1、打印游戏菜单

我们实现游戏之前,应该想到先给玩家提供一个菜单。这个菜单的功能就是帮助用户选择是否要开始游戏。菜单的实现我们可以单独自定义一个函数,我们用到菜单的时候调用此函数即可。

void meau()
{
	printf("*********************\n");
	printf("*****  1.play   *****\n");
	printf("*****  0.exit   *****\n");
	printf("*********************\n");
}

通过上面的代码我们可以很容易看出,选择‘1’是开始游戏,选择‘0’是退出游戏。

2、选择是否开始游戏

提到选择,我们这里可以联想到switch-case语句。由上面的菜单可知:选择‘1’是开始游戏,选择‘0’是退出游戏。当然我们不能排除不小心输入错误,所以这里我们还要考虑到选择错误的情况下要给出相应的提示。当选择错误时,给出提示且重新选择,同时再把菜单打印出,提供玩家选择。那怎么实现重新选择呢?我们这里其实可以使用do-while()语句。我们先来看一下代码的实现。

void test()
{
	int input = 0;
	do
	{
		meau();
		printf("请选择是否要开始游戏:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();  //开始三子棋游戏
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
		}
	} while (input);
}

我们看上面的代码是放在的一个自定义的test()函数中,我们只要再主函数中调用一下即可。上面的代码很巧妙,当我们输入‘1’的时候,开始游戏。当游戏结束时,循环继续。其实是实现了一个玩完一局可以反复玩的效果。当我们输入‘0’的时候,循环结束,就是相当于结束游戏了。当我们输入错误时,循环仍然继续,再次打印菜单提供我们选择。这也是 do-while()语句的巧妙之处。

3、创建并且初始化棋盘

3.1、创建棋盘

创建棋盘很简单,我们这里需要的是一个二维数组。那么棋盘的大小呢?我们首先想到的是3x3的棋盘——char board[3][3]。那要是想改成5x5的棋盘呢?我们是把整个工程中的board[3][3]改成board[5][5]吗?这样太麻烦了,当然也不现实。这里我们可以引用#define 定义的标识符常量。这时候我们可以写成char board[ROW][COL]。改变大小的时候只需要改变#define 定义的标识符常量的值就行。

#define ROW 3
#define COL 3
char board[ROW][COL];

3.2、初始化棋盘

我们这里将初始化棋盘放在一个init_board(board, ROW, COL)函数中。为什么要初始化棋盘呢?当我们不初始化的时候,期盼中的每个位置放的是‘\0’。而我们想要得到的棋盘是一个空棋盘,这样的话更加有利于玩家操作下棋。空棋盘看起开也比较整洁。我们看一下初始化代码的实现。

void init_board(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] = ' ';
		}
	}
}

4、打印格式化棋盘

当我们初始化完棋盘后,我们就应该把棋盘打印出来让玩家看到并且选择要下棋的位置。这里我们先来看打印棋盘。打印出来的棋盘应该格式鲜明,每个位置独立分开,而不是一片空白。我们先看一下棋盘的格式:

3x3

5x5

通过上面的两个图,我们就可以建立一个大概的打印棋盘的思路了。其实我们可以把”_ _ _|_ _ _|_ _ _“看作我们要打印的第一行内容,但是要注意最后一行是” | | “。打印的思路有了,把打印棋盘内容放在print_board(board, ROW, COL)函数中。我们来看一下代码的实现。

void print_board(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]);
			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");
	}
}

5、玩家下棋

当我们把棋盘打印出来后,这时候就要提示玩家选择下棋了。我们采用的是坐标的形式让玩家进行选择下棋位置。这里要有几点要注意的事项

  • 玩家选择的位置就是所看到的位置,跟代码中的数组下标访问还是有所差距的;
  • 玩家输入的坐标后,要判断该坐标是否已经被占用,也就是不能重复在同一个位置上下棋;
  • 玩家输入坐标后,要判断坐标是否合法,不合法的话要给出提示,并且重新输入。
  • 当玩家输入的坐标合法后,电脑玩家进行下棋;
  • 玩家下完棋后要再次调用打印棋盘函数print_board(board, ROW, COL),使玩家更方便的观看已经下棋的位置;
  • 我们把玩家下的坐标用 ‘ * ’ 来代表。

我们将玩家下棋内容放在player_move(board, ROW, COL)函数中,我们来看一下玩家下棋的代码实现。

void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请选择你要下棋的坐标:");
	while (1)
	{
		scanf("%d %d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已经被占有,请重新选择:");
			}
		}
		else
		{
			printf("该坐标非法,请输入合法坐标:");
		}
	}
}

6、电脑下棋

玩家下棋后,就该电脑下棋了。电脑下棋其实就是随机下棋。当然电脑下棋也是不能重复在同一个位置上下棋,且是合法的。提到随机,我们就因该联想到rand()函数和srand()函数,在这里我就不详细介绍这两个函数的使用方法了,在之前的猜数字小游戏中有详细的解释,可以去了解一下。电脑下完棋后也要调用打印棋盘函数print_board(board, ROW, COL),使玩家更方便的观看已经下棋的位置。我们把玩家下的坐标用 ‘ #’ 来代表。把电脑下棋代码放在computer_move(board, ROW, COL)函数中。那我们来看一下电脑下棋的代码实现。

void computer_move(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

7、判断是否玩家或者电脑赢

其实,每当玩家或者电脑下完一次棋后,我们都需要判断一下是否有赢的。如果没有赢的,我们就进行反复下棋。如果有赢的,我们就停止下棋,并输出”玩家赢“或者”电脑赢“。我们同时还要想到是否为平局,如果为平局的话,就输出”平局“。判断输赢的函数我们定义成char is_win(board[ROW][COL], ROW, COL)。

判断输赢函数返回值注意:

  • 我们这个判断输赢的函数是有返回值的,返回类型为char;
  • 当返回 ‘*’ 时,玩家胜利;
  • 当返回 ‘#’ 时,电脑胜利;
  • 当返回 ‘Q’ 时,平局;
  • 当返回 ‘C’ 时,游戏继续。

当我们在编写输赢函数时,我们要注意不能数组越界访问。我们先来看一下判断输赢函数的实现。

char is_win(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 (j == 0)
			{
				if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' '))
					return board[i][0];
			}
			else if (j == 1)
			{
				if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ')
					|| (board[i][1] == board[i][2]) && (board[i][2] == board[i][23]) && (board[i][1] != ' '))
					return board[i][1];
			}
			else if (j == col - 1)
			{
				if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' '))
					return board[i][j];
			}
			else if (j == col - 2)
			{
				if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' '))
				return board[i][j];
			}
			else
			{
				if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2]) && (board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		for (i = 0; i < row; i++)
		{
			if (i == 0)
			{
				if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' '))
					return board[0][j];
			}
			else if (i == 1)
			{
				if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' ')
					|| (board[1][j] == board[2][j]) && (board[2][j] == board[3][j]) && (board[1][j] != ' '))
					return board[1][j];
			}
			else if (i == row - 1)
			{
				if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' '))
					return board[i][j];
			}
			else if (i == row - 2)
			{
				if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' '))
					return board[i][j];
			}
			else
			{
				if ((board[i][j] == board[i + 1][j]) && (board[i + 1][j] == board[i + 2][j]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断主对角线
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (i<row-2&&j<col-2)
			{
				if((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' '))
					return board[i][j];
			}
			if (i>0&&i<row-1&&j>0&&j<col-1)
			{
				if ((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i - 1][j - 1] && board[i][j] != ' '))
					return board[i][j];
			}
			if (i >1&&j>1)
			{
				if ((board[i][j] == board[i - 1][j - 1] && board[i][j] == board[i - 2][j - 2] && board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断次对角线
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (i<row-2&&j>1)
			{
				if ((board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] != ' '))
					return board[i][j];
			}
			if (j>0&&j<col-1&&i>0&&i<row-1)
			{
				if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i + 1][j - 1] && board[i][j] != ' '))
					return board[i][j];
			}
			if (i>1&&j<col-2)
			{
				if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i - 2][j + 2] && board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断平局
	int flag = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				flag = 1;
		}
	}
	if (flag == 0)
		return 'Q';
	return 'C';
}

我们这里再看一下反复调用玩家下棋player_move(board, ROW, COL)函数和电脑下棋computer_move(board, ROW, COL)函数和打印棋盘函数print_board(board, ROW, COL)函数到终止循环的代码。反复调用这几个函数也就是实现了反复下棋的效果。如果没有赢的,我们就进行反复下棋。如果有赢的或者平局,我们就停止下棋。我们来看代码实现。

	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断是否结束
		// * 玩家胜利
		// # 电脑胜利
		// Q 平局
		// C 继续游戏
		ret=is_win(board, ROW, COL);
		if (ret != 'C')
			break;
		//电脑下棋
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}

综上就是我整个三子棋游戏实现的思路了。总体来说还是比较简单的。我们把上面的代码整合一下来看。

三、整合三子棋游戏代码

由于代码量相对来说有一点多,所以我们就将函数的声明的定义分开,这样有利于提高代码的可读性,同时会保持一个良好的思路,且方便编写代码。

我们将函数的声明放在单独的一个game.h的头文件,函数的实现放在一个单独的game.c源文件,函数的主方法及调用放在另一个单独的test.c源文件。

game.h

#include<stdio.h>
//数组行和列的大小
#define ROW 3
#define COL 3
//初始化数组
void init_board(char board[ROW][COL],int row,int col);
//打印格式化数组
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋 *
void player_move(char board[ROW][COL], int row, int col);
//电脑下棋 #
void computer_move(char board[ROW][COL], int row, int col);
//判断输赢或者平局
char is_win(char board[ROW][COL], int row, int col);

game.c

#include "game.h"
void init_board(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 print_board(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]);
			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");
	}
}
void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请选择你要下棋的坐标:");
	while (1)
	{
		scanf("%d %d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已经被占有,请重新选择:");
			}
		}
		else
		{
			printf("该坐标非法,请输入合法坐标:");
		}
	}
}
void computer_move(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
char is_win(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 (j == 0)
			{
				if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' '))
					return board[i][0];
			}
			else if (j == 1)
			{
				if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ')
					|| (board[i][1] == board[i][2]) && (board[i][2] == board[i][23]) && (board[i][1] != ' '))
					return board[i][1];
			}
			else if (j == col - 1)
			{
				if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' '))
					return board[i][j];
			}
			else if (j == col - 2)
			{
				if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' '))
				return board[i][j];
			}
			else
			{
				if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2]) && (board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		for (i = 0; i < row; i++)
		{
			if (i == 0)
			{
				if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' '))
					return board[0][j];
			}
			else if (i == 1)
			{
				if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' ')
					|| (board[1][j] == board[2][j]) && (board[2][j] == board[3][j]) && (board[1][j] != ' '))
					return board[1][j];
			}
			else if (i == row - 1)
			{
				if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' '))
					return board[i][j];
			}
			else if (i == row - 2)
			{
				if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' '))
					return board[i][j];
			}
			else
			{
				if ((board[i][j] == board[i + 1][j]) && (board[i + 1][j] == board[i + 2][j]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' ')
					|| (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断主对角线
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (i<row-2&&j<col-2)
			{
				if((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' '))
					return board[i][j];
			}
			if (i>0&&i<row-1&&j>0&&j<col-1)
			{
				if ((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i - 1][j - 1] && board[i][j] != ' '))
					return board[i][j];
			}
			if (i >1&&j>1)
			{
				if ((board[i][j] == board[i - 1][j - 1] && board[i][j] == board[i - 2][j - 2] && board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断次对角线
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (i<row-2&&j>1)
			{
				if ((board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] != ' '))
					return board[i][j];
			}
			if (j>0&&j<col-1&&i>0&&i<row-1)
			{
				if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i + 1][j - 1] && board[i][j] != ' '))
					return board[i][j];
			}
			if (i>1&&j<col-2)
			{
				if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i - 2][j + 2] && board[i][j] != ' '))
					return board[i][j];
			}
		}
	}
	//判断平局
	int flag = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				flag = 1;
		}
	}
	if (flag == 0)
		return 'Q';
	return 'C';
}

test.c

#include "game.h"
void game()
{
	char ret = 0;
	srand(time(NULL));
	char board[ROW][COL];
	//初始化数组 全为空格
	init_board(board, ROW, COL);
	//打印格式化数组
	print_board(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断是否结束
		// * 玩家胜利
		// # 电脑胜利
		// Q 平局
		// C 继续游戏
		ret=is_win(board, ROW, COL);
		if (ret != 'C')
			break;
		//电脑下棋
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("恭喜玩家取得胜利!\n");
	else if (ret == '#')
		printf("电脑取得胜利。\n");
	else if (ret == 'Q')
		printf("平局了哦。\n");
}
void meau()
{
	printf("*********************\n");
	printf("*****  1.play   *****\n");
	printf("*****  0.exit   *****\n");
	printf("*********************\n");
}
void test()
{
	int input = 0;
	do
	{
		meau();
		printf("请选择是否要开始游戏:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

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

(0)

相关推荐

  • 基于C语言实现三子棋游戏的示例代码

    1.创建文件  test.c (游戏的测试逻辑)game.c(游戏的实现逻辑)gane.h(游戏实现函数的声明) game.c 和game.h属于游戏实现 test.c属于游戏测试 test.c 源文件(源文件添加)——game.c 源文件(源文件添加)——game.h(头文件添加) 三个文件 2.首先在test.c文件写一个主函数,主函数里面有一个测试函数,测试函数里面写菜单.进入游戏.退出游戏 代码展示: void menu() { printf("*********************

  • 使用C语言实现三子棋小游戏

    目录 1.实现原理 2.实现模块 3.实现逻辑 4.实现结果 本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 1.实现原理 采用二位数组保存棋盘信息,棋盘上面的任何一个位置,里头可以放三个信息: 1.空2.用户落子3.电脑落子 下三子棋就是在二维数组种找对应的空位置,进行落子,落完之后立即就要判断落子位置是否有三字连珠,从而判断谁数输谁赢.每走一次棋会有四种情况: *用户1赢*用户2赢*平局(棋盘被沾满)**没有出结果 继续下棋 2.实现模块 文件名      

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

    目录 一.问题描述 二.基本流程 三.步骤 1. 菜单界面 2. 创建棋盘 3. 棋盘初始化 4.打印棋盘 5.玩家落子 6.电脑落子 7.判断胜负 四.结果演示 五.代码实现 一.问题描述 用 c 语言实现三子棋. 二.基本流程 在写三子棋的代码之前,我们来看看实现这个游戏的逻辑: 1.菜单界面选择开始或者退出游戏. 2.创建棋盘并初始化. 3.打印棋盘. 4.玩家落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子. 5.判定胜负关系(输,赢,和棋),'q’表示和棋. 6.电脑落子(随机

  • C语言如何实现三子棋

    目录 三子棋 测试逻辑 游戏逻辑 初始化棋盘 下棋 判断胜利 总结 相信在座的各位都玩过三子棋和扫雷,但是有哪一位想过自己能够在电脑上实现三子棋呢?今天我们就一起来实现一下吧. 三子棋 首先我们看三子棋,三子棋的实现分两步走,首先是测试逻辑,再是游戏逻辑. 测试逻辑 #define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("******************\n"); pri

  • C语言实现三子棋小游戏的示例代码

    目录 一.三子棋 1.演示效果 2.完整代码 二.代码解析 1.初始化棋盘 2.打印棋盘 3.玩家下棋 4.电脑下棋 5.判断输赢 6.游戏主体函数 7.菜单函数 8.头文件及主函数 一.三子棋 三子棋小游戏的实现主要依赖于循环语句.函数和数组. 主要思路:设计棋盘.初始化棋盘.玩家下棋.电脑下棋及判断输赢. 判断输赢条件:当任一方连续三个棋子成一条直线,即为获胜. 1.演示效果 2.完整代码 #include <stdio.h> #include <stdlib.h> #incl

  • C语言实现简易的三子棋小游戏

    本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 1.基本流程 1.菜单界面选择开始或者退出游戏.2.创建棋盘并初始化.3.打印棋盘.4.玩家落子并打印棋盘5.电脑落子并打印棋盘6.判定胜负关系(输,赢,平局) 2. 配置运行环境 本次游戏用到三个文件,两个源文件test.c,game.c,一个头game.h.其中,game.c,game.h可以称作一个游戏模块,为什么要这样做呢?因为多个文件可以分别处理各自模块的功能,能更好处理各个模块之间的逻辑并且便于后期调试,

  • 用C语言实现简单的三子棋

    三子棋代码的实现需要一个简单的思路做指引,所以我们先来做一下思路的整理,代码的实现主要分为以下几个步骤: 1.初始化数组2.显示数组3.电脑走4.玩家走5.判断输赢 所以,先写出源文件game.h,如下. #ifndef __GAME_H__   #define __GAME_H__   #define ROWS 3   //定义行   #define COLS 3   //定义列   //初始化数组 void init_board(char board[ROWS][COLS], int row

  • C语言实现三子棋游戏的示例代码

    目录 1. 前言 2. 准备工作 3. 使用二维数组存储下棋的数据 4. 初始化棋盘为全空格 5. 打印棋盘 6. 玩家下棋 7. 电脑下棋 8. 判断输赢 9. 效果展示 10. 完整代码 game.h game.c test.c 1. 前言 大家好,我是努力学习游泳的鱼,今天我们会用C语言实现三子棋.所谓三子棋,就是三行三列的棋盘,玩家可以和电脑下棋,率先连成三个的获胜.话不多说,我们开始吧. 2. 准备工作 我们可以在一个项目中创建三个文件,分别是: test.c,测试游戏的逻辑. gam

  • C语言三子棋的实现思路到过程详解

    目录 一.三子棋小游戏的简单介绍 二.三子棋的思路及代码实现 1.打印游戏菜单 2.选择是否开始游戏 3.创建并且初始化棋盘 3.1.创建棋盘 3.2.初始化棋盘 4.打印格式化棋盘 5.玩家下棋 6.电脑下棋 7.判断是否玩家或者电脑赢 三.整合三子棋游戏代码 game.h game.c test.c 一.三子棋小游戏的简单介绍 要说大家都很熟悉的一个小游戏,三子棋算是其中一个了.相信大家都玩过三子棋小游戏,在这里我还是给大家介绍简单的游戏规则: 一次只能下一个棋子: 玩家下完棋子后,电脑下棋

  • R语言刷题检验数据缺失类型过程详解

    目录 题目 解答 下面考虑三种情况: 1. a = 0, b = 0 2. a = 2, b = 0 3. a = 0, b = 2 题目 解答 由于题目要求需要重复三次类似的操作,故首先载入所需要的包,构造生成数据的函数以及绘图的函数: library(tidyr) # 绘图所需 library(ggplot2) # 绘图所需 # 生成数据 GenerateData <- function(a = 0, b = 0, seed = 2018) { set.seed(seed) z1 <- r

  • C语言三子棋游戏实现代码解析

    本文实例为大家分享了C语言三子棋游戏的具体代码,供大家参考,具体内容如下 编程环境:Visual Studio 2019 (一)创建文件 为了逻辑清晰的编程,我们先创建一个叫game.h的头文件用以游戏函数的声明,两个源文件,一个是text,c用以测试,另一个game,c用以游戏函数的实现,如图所示. (二)思路分析 首先是进入游戏界面,进行界面打印,在主函数内引用菜单函数,为了使游戏能够重复玩,将函数放在do-while循环内部.然后玩家进行游戏选择,在主函数内运用switch语句判断所选内容

  • 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语言三子棋小游戏实现全程

    目录 前言 game.h test.c game.c 游戏代码实现的过程 1 初始化棋盘 2 打印棋盘 3 玩家下 4 电脑下 5 判断棋盘是否已满 6 判断输赢 前言 很高兴为大家带来三字棋的扩展版本 game.h 在这个文件中我们完成对代码的函数声明,常量的定义和头文件的包含. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> #include<stdlib.h> //定义行和列 #

  • C语言三子棋小游戏的实现代码

    本文实例为大家分享了C语言三子棋小游戏的具体代码,供大家参考,具体内容如下 一.介绍: 运用C语言的数组等相关知识:实现一个简易的三子棋小游戏: 三子棋小游戏的大概内容为 此游戏在设计时:总共设计了三个文件: game.h: 类型的声明和函数的声明 game.c:函数功能的具体实现 test.c: 测试文件 二.具体实现: (1).game.h模块: 代码实现如下: #define _CRT_SECURE_NO_WARNINGS 1 //头文件包含 #include <stdio.h> #in

  • C语言三子棋游戏的简单设计

    本文实例为大家分享了C语言三子棋游戏简单设计的具体代码,供大家参考,具体内容如下 题目思想: 用 3×3 的二维数组表示棋盘 每一个棋子的格子,也就是每个元素表示三种状态:分别是 1.未落子 ' ' 2.玩家落子 'X' 3.电脑落子 'O' 玩家通过输入数字作为落子位置的坐标(输入的行数与输入的列数) 直接上代码解析 1.创建出棋盘 #define _CRT_SECURE_NO_WARNINGS //利用宏定义行和列 #define MAX_ROW 3 #define MAX_COL 3 #i

  • C语言*与&在操作线性表的作用详解

    在数据结构线性表一章,对线性表有这些操作方法(Operation): /*Operation*/ Initlist(*L);/*初始化操作,建立一个空的线性表L*/ ListEmpty(L):/*判断线性表是否为空表,若线性表为空,返回值为true,否则返回false*/ ClearList(*L):/*将线性表清空*/ GetElem(L,i,*e):/*性表L中的第i个位置元素值返回给e*/ LocateElem(L,e):/*在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在

  • C语言 风靡一时的黄金矿工游戏实现流程详解

    游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分.只有完成任务目标,才可以通过相应的关卡.游戏画面中沙滩上的人物便是玩家的角色,下方深褐色的部分是地下,而黄金和钻石就是玩家需要采集的物品.人物右边的四个方框里的物品是游戏中可以使用的道具. 画面中的虚线就是游戏中的探测器,探测器会不断的左右摆动,当摆动到地下的黄金和钻石的位置时,只需要点击矿坑任意处,便可以发射勘探头采集到这些物品,当然一定要瞄准好再出手呦. 当然想要顺利采集到丰富的资源也不是那么简单的,地下矿坑中,会有各式各样的困

  • C语言实现字符串字符反向排列的方法详解

    目录 前言 非递归方法 1.循环实现 2.函数实现 递归方法 1.递归方法 2.递归方法 小结 前言 重点的话说在前头,注意不是逆序打印 今天写题,碰到一个很好的题,在这里来个大家做个分享,我会用多种方法来解决 题目具体内容如下: 编写一个函数(递归实现) 实现:将参数字符串中的字符反向排列,不是逆序打印. 要求:不能使用C函数库中的字符串操作函数 但是这里我不会仅仅局限于题目的要求 非递归方法 1.循环实现 1.1循环实现(sizeof) #include <stdio.h> int mai

随机推荐