如何用C语言实现三子棋的人机博弈

🎈 🎈 🎈 🎈 🎈

序言:想必各位在童年时都玩过一个特别经典的小游戏——三子棋吧!当我在学习C语言的函数知识后,我想用C语言来实现三子棋的人机博弈,下面我将分享一下如何用C语言实现三子棋的人机博弈,以及我其过程中的收获,记录一下本小白的成果。

目录

1.呈现初始菜单与玩家的选择面板

2.呈现初始棋盘

3.玩家落子

4.电脑落子

5.判断胜负

6.呈现最终结果

7.最终代码展示

8.心得体会


正文 

1.呈现初始菜单

  游戏初始菜单是面向玩家的第一个面板,必须让玩家清晰的知道下一步要怎么做,有什么选择,因此我搭建了如下菜单。

#include<stdio.h>
void menu()
{
	printf("*************菜单*************\n");
	printf("******1.Play******0.Exit******\n");
	printf("******************************\n");
}
void test()
{
	menu();

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

注:在主函数中进入游戏调试的test函数,再从test函数进入菜单menu函数,之后的游戏函数也是在test函数中实现的。

这里想要实现的是玩家输入1为开始游戏,输入0为退出游戏。

  那么,菜单呈现之后就要实现让玩家选择的功能了。玩家可以选择开始游戏或者退出游戏,如果玩家输入了1和0以外的数字,系统则会报错并让玩家重新选择。有多种情况,可以用一个循环和判断的嵌套来实现。如下:

#include<stdio.h>
void menu()
{
	printf("*************菜单*************\n");
	printf("******1.Play******0.Exit******\n");
	printf("******************************\n");
}
void test()
{
	menu();
	int input = 0;
	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//实现游戏内容
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("输入非法,请重新输入");
		}
	} while (input);

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

  通过do while循环,让玩家选择一种结果,如果输入0游戏结束,输入1游戏开始,游戏内容由 game() 函数实现(后面的内容),打完一把之后玩家可选择继续游戏或退出游戏。输入1、0以外的数则提示"输入非法,请重新输入"。

🍭上代码段为游戏的整体框架,接下来主要介绍如何在 game() 函数中实现游戏逻辑。


2.呈现初始棋盘

  在玩家输入1之后,游戏开始。那么,为了更直观的游戏体验,开始我想让玩家能看到一个空棋盘,并且之后能在这个空棋盘上落子。那么,这该如何实现呢?

🎈想法: 我们可以先构建一个三行三列的数组,并将数组中每一个元素都赋为一个空格,再利用一些横杆竖杆字符(-、|)画出一个九宫格,接着将数组和九宫格打印出来,就能很好地呈现一个初始空棋盘了。之后,玩家下子只要改变数组中对应坐标的字符,每次下子打印出一个不同的棋盘,就能实现。下面我们来尝试一下。

🎈实现方法: 构建一个初始化棋盘的函数和一个呈现棋盘的函数。

  由于game函数中的需要定义和引用的函数量较多,因此另起一个以.h为后缀的头文件来声明函数,起一个.c为后缀的源文件来定于函数。 因为二维数组的行和列会被不同函数多次调用,这里不妨在头文件中宏定义行和列为ROW和COL,便于表示。

下面是初始化棋盘函数IntialBoard 和 呈现棋盘函数DisplayBoard的定义。

#include<stdio.h>
#include "game.h"
void InitialBoard(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			arr[i][j] = ' ';
		}
	}//初始化棋盘, 让数组中每一个元素都为空格' '
}
#include<stdio.h>
#include "game.h"
void DisplayBoard(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			printf(" %c ", arr[i][j]);//与数组元素相联系
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0;j < col;j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}//打印棋盘,玩家下子后棋盘发生变化

 ✔最终打印结果:

 该棋盘中n行m列对于了二维数组中的元素board[n-1][m-1]


过渡~

 🌹 接下来就进入了人机博弈的阶段了!那么,既然要博弈,肯定会有很多个回合,每一个回合中玩家落子后判断输赢,电脑落子后再次判断输赢。因此我们可以构建一个循环,只要有一次判断为某一方输或某一方赢或平局,则跳出循环,游戏结束。

  因此我搭建了如下结构。

void game()
{
	char board[ROW][COL] = { ' ' };
	InitialBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		playermove();//玩家落子
		DisplayBoard(board, ROW, COL);
		//判断输赢机制

		computermove();//电脑落子
		DisplayBoard(board, ROW, COL);
		//判断输赢机制
	}

}

 下面,将围绕玩家落子、电脑落子和判断输赢机制的实现进行描述。


3.玩家落子

  初始化阶段我们已经把二维数组board中所有元素赋成了空格,因此,想要实现玩家落子,只需要让玩家输入一个坐标(几行几列),改变这个坐标上的元素为新的元素(这个元素便可视为是一个棋子,我们定义这个棋子为X,便于随后的判断输赢),再用一次呈现棋盘函数DisplayBoard,便可呈现出一个新的带有玩家落子的棋盘。 

 构建玩家落子playermove()函数:

错误版本❌:

void playermove(char arr[ROW][COL], int row, int col)
{
	int x, y;
	scanf("%d%d", &x, &y);
	while (1)
	{
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = 'X';
				break;
			}
			else
			{
				printf("坐标已被占用,请重新输入");
				continue;
			}
		}
		else
		{
			printf("坐标非法,请重新输入");
			continue;
		}
	}
}

 ❗ 这里我在做的时候发生了一个bug,提示坐标非法后进入死循环。这是因为将scanf放在循环外面了,因此玩家只能输入一次,如果坐标被占或坐标非法,则会进入死循环。

⭕改正版本如下: 

void playermove(char arr[ROW][COL], int row, int col)
{
	int x=0, y=0;
	printf("请输入落子坐标(行 列):");
	while (1)
	{
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = 'X';
				break;//直到玩家下入一个棋子便跳出循环,为止
			}
			else
			{
				printf("坐标已被占用,请重新输入:");
				continue;
			}
		}
		else
		{
			printf("坐标非法,请重新输入:");
			continue;
		}
	}
}

测试成功:

4.27 Bug修复 💡

   今天在测试代码时发现了一个bug,就是在玩家下子这块,当玩家输入的坐标并非两个整数,而是其他字符时,系统会进入死循环,导致崩溃,如图所示:

 

  是不是密集恐惧症犯了,太恐怖了!!!

📌这里出现错误的原因是:当玩家输入两个非数字时,scanf函数无法从缓冲区读取两个整数,则坐标x、y依然是初始值0,不满足下子条件。提示"坐标非法,请重新输入"后,进入下一次循环,由于缓冲区里依然有内容,玩家无法重新输入坐标,但scanf函数仍然无法从缓冲区读取两个整数,周而复始,进入了死循环。

   这里我做出了如下修改:

void playermove(char arr[ROW][COL], int row, int col,int* n)
{
	printf("玩家走\n");
	int x = 0;
	int y = 0;
	printf("请输入落子坐标(行 列):");
	while (1)
	{
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = 'X';
				(*n)++;
				break;
			}
			else
			{
				printf("坐标已被占用,请重新输入:");
				continue;
			}
		}
		else
		{
			char clean = '0';
			while ((clean = getchar()) != '\n')
			{
				;
			}
			printf("坐标非法,请重新输入:");
		}
	}
}

 这里我加了一个清除缓冲区的机制,当玩家输入两个非数字的字符时,该机制会先将这两个字符清除了再进入下一次循环,这样一来,下一次循环玩家就可以重新输入正确的坐标了。

📌演示如下:

 


 4.电脑落子

  电脑落子和玩家落子同理,都是通过变换数组元素来实现的(这里我们定义电脑的子为字符O,便于随后的判断输赢), 但玩家可以输入一个坐标,而电脑该如何实现呢?这里我们可以发现,如果电脑能生成一个随机坐标,并且这个坐标在棋盘范围以内,就可以很好的实现了。这里我们要用到c语言中生成随机数的知识。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
  srand((unsigned int)time(NULL));
  int rom=rand();

}

   这是生成随机数的代码,具体原理在此不展开。如果想要获得区间(a,b)内的随机数,则可通过

rom=rand()%(b-a+1)+a 来实现。

⭕下面是我对电脑落子computermove函数的定义:

void computermove(char arr[ROW][COL], int row, int col)
{
	printf("电脑走\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'O';
			break;
		}
		else
			continue;
	}
}//若坐标占用,则重新生成一组随机坐标,直到电脑成功下子,跳出循环,回合结束。

 测试结果:

  4.27 电脑落子的优化💡

今天对电脑落子这一模块做了些许调整,让电脑落子从“人工智障”升级为能够防守玩家落子,增强了游戏的可玩性,具体代码如下:

void computermove(char arr[ROW][COL], int row, int col,int* n,int* m)//防守向
{
	printf("电脑走\n");
	int x = 0;
	int y = 0;
	if ((*m) < 2)//玩家下子小于2时,随机下
	{	
		while (1)
		{
			x = rand() % row;
			y = rand() % col;
			if (arr[x][y] == ' ')
			{
				arr[x][y] = 'O';
				(*n)++;
				return;
			}
		}
	}
	else//防守玩家下棋路线
	{
		int i = 0;
		for (i = 0;i < row;i++)//横二
		{
			if (arr[i][0] == arr[i][1] && arr[i][1] == 'X' && arr[i][2] == ' ')
			{
					arr[i][2] = 'O';
					(*n)++;
					return;
			}
			if (arr[i][0] == arr[i][2] && arr[i][2] == 'X' && arr[i][1] == ' ')
			{
					arr[i][1] = 'O';
					(*n)++;
					return;
			}
			if (arr[i][1] == arr[i][2] && arr[i][2] == 'X' && arr[i][0] == ' ')
			{
					arr[i][0] = 'O';
					(*n)++;
					return;
			}
		}
		for (i = 0;i < col;i++)//竖二
		{
			if (arr[0][i] == arr[1][i] && arr[1][i] == 'X' && arr[2][i] == ' ')
			{
				arr[2][i] = 'O';
				(*n)++;
				return;
			}
			if (arr[0][i] == arr[2][i] && arr[2][i] == 'X' && arr[1][i] == ' ')
			{
				arr[1][i] = 'O';
				(*n)++;
				return;
			}
			if (arr[1][i] == arr[2][i] && arr[2][i] == 'X' && arr[0][i] == ' ')
			{
				arr[0][i] = 'O';
				(*n)++;
				return;
			}
		}
		if (arr[0][0] == arr[1][1] && arr[1][1] == 'X' && arr[2][2] == ' ')//斜二
		{
			arr[2][2] = 'O';
			(*n)++;
			return;
		}
		else if (arr[0][0] == arr[2][2] && arr[2][2] == 'X' && arr[1][1] == ' ')
		{
			arr[1][1] = 'O';
			(*n)++;
			return;
		}
		else if (arr[2][2] == arr[1][1] && arr[1][1] == 'X' && arr[0][0] == ' ')
		{
			arr[0][0] = 'O';
			(*n)++;
			return;
		}

		if (arr[2][0] == arr[1][1] && arr[1][1] == 'X' && arr[0][2] == ' ')//反斜二
		{
			arr[0][2] = 'O';
			(*n)++;
			return;
		}
		else if (arr[2][0] == arr[0][2] && arr[2][2] == 'X' && arr[1][1] == ' ')
		{
			arr[1][1] = 'O';
			(*n)++;
			return;
		}
		else if (arr[0][2] == arr[1][1] && arr[1][1] == 'X' && arr[2][0] == ' ')
		{
			arr[2][0] = 'O';
			(*n)++;
			return;
		}

		while (1)//如果都没有,随机下
		{
			x = rand() % row;
			y = rand() % col;
			if (arr[x][y] == ' ')
			{
				arr[x][y] = 'O';
				(*n)++;
				return;
			}
		}
	}//
}

📌原理:在玩家下子小于2时,电脑随机落子。一旦玩家下子大于等于2时,电脑开始“防守模式”,寻找玩家有无再下一颗子就能取胜的棋子序列,如有,下子堵住玩家。如没有,则继续随机下。 


5.判断输赢

 🎈判断输赢机制是游戏中最重要的机制,它决定着游戏是继续还是结束,以及得出最终结果。

在玩家或电脑每落一枚子时,都应该判断一下是否有无一方获胜,如果有游戏结束,如果没有游戏继续,下面我们来写一个函数实现这样的功能。 

   因为每次判断有四种可能的结果,分别是玩家赢、电脑赢、平局、继续, 我们用四个字符 X、O、Q、C分别来表示四种结果。我们可以定义判断函数的返回值是一个字符并且该返回值的结果有X、O、Q、C四种,根据判断函数返回值来判断本回的结果。如下:

char Judge(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0;i < row;i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			return arr[i][0];//返回值可以是'X'和'O',返回谁就是谁赢了
	}

	int j = 0;
	for (j = 0;j < col;j++)
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')
			return arr[0][j];
	}

	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
		return arr[1][1];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
		return arr[1][1];

	if (Is_full(arr, ROW, COL) == 1)
	{
		return 'Q';
	}

	return 'C';


​

由于棋盘下满后才有可能平局,因此我们再构建一个函数Is_full判断棋盘是否已满,用整数返回值1/0表示。

int Is_full(char arr[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 (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

⭕判断函数Judge的逻辑是先判断 横三行竖三列是否三连,再判断 两条对角线是否三连,如果这两种都不成立则判断棋盘是否下满,若满了则平局,若没满则继续游戏。

-------------------------------------------------------------------------------------------------------------------------------- 

💚优化版💚

因为只有当玩家或电脑的某一方下满3颗棋子才会有输赢结果,因此我们可以在playermove和computermove函数中加上一个计数器,每次下一颗棋子加一,当计数器等于3时,判断函数Judge再进行判断。

void game()
{
	int count1 = 0;
	int count2 = 0;
	srand((unsigned int)time(NULL));
	char board[ROW][COL] = { ' ' };
	InitialBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL,NULL);
	while (1)
	{
		playermove(board, ROW, COL, &count1);//计数器在此函数外,因此需传址
		DisplayBoard(board, ROW, COL);
		if (count1 >= 3)
		{
			if (Judge(board, ROW, COL) != 'C')
				break;
		}
		
		computermove(board, ROW, COL,&count2);
		DisplayBoard(board, ROW, COL);
		if (count2 >= 3)
		{
			if (Judge(board, ROW, COL) != 'C')
				break;
		}
	}
	Result(Judge(board, ROW, COL));
	printf("选择继续游戏或退出:\n");
}
void computermove(char arr[ROW][COL], int row, int col,int* n)
{
	printf("电脑走\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'O';
			(*n)++;//落子后自增加1
			break;
		}
		else
			continue;
	}
}

玩家下子同理,不再贴出代码段。


6.呈现最终结果

void game()
{
	srand((unsigned int)time(NULL));
	char board[ROW][COL] = { ' ' };
	InitialBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		playermove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		if (Judge(board, ROW, COL) != 'C')
			break;

		computermove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		if (Judge(board, ROW, COL) != 'C')
			break;
	}
	Result(Judge(board, ROW, COL));
	printf("选择继续游戏或退出:\n");
}

最后,game()函数的总体实现如上代码块所示。每一回合中某一方落子判断一次,直到有一次判断的字符结果不为'C'(既不再继续),才跳出循环,再判断(在Result函数中实现,如下代码块)该字符为‘X’ ‘O’ 'Q'中的哪一个,从而得出最终结果。

void Result(char ch)
{
	switch (ch)
	{
	case 'X':
		printf("玩家获胜\n");
		break;
	case 'O':
		printf("电脑获胜\n");
		break;
	case 'Q':
		printf("平局\n");
		break;
	}
}

测试结果:


7.最终代码展示 (有点长,可以跳过)

  test.c文件 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"

void game()
{
	int count1 = 0;
	int count2 = 0;
	srand((unsigned int)time(NULL));
	char board[ROW][COL] = { ' ' };
	InitialBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL,NULL);
	while (1)
	{
		playermove(board, ROW, COL, &count1);
		DisplayBoard(board, ROW, COL);
		if (count1 >= 3)
		{
			if (Judge(board, ROW, COL) != 'C')
				break;
		}
		//
		computermove(board, ROW, COL,&count2);
		DisplayBoard(board, ROW, COL);
		if (count2 >= 3)
		{
			if (Judge(board, ROW, COL) != 'C')
				break;
		}
	}
	Result(Judge(board, ROW, COL));
	printf("选择继续游戏或退出:\n");
}
void menu()
{
	printf("*************菜单*************\n");
	printf("******1.Play******0.Exit******\n");
	printf("******************************\n");
}
void test()
{
	int input = 0;
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入非法,请重新输入:\n");
		}
	} while (input);

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

game.h文件(函数声明)

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void InitialBoard(char arr[ROW][COL], int row, int col);
void DisplayBoard(char arr[ROW][COL], int row, int col);
void playermove(char arr[ROW][COL], int row, int col,int* n);
void computermove(char arr[ROW][COL], int row, int col,int* n);
char Judge(char arr[ROW][COL], int row, int col);
int Is_full(char arr[ROW][COL], int row, int col);
void Result(char ch);

game.c文件(函数定义)

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void Result(char ch)
{
	switch (ch)
	{
	case 'X':
		printf("玩家获胜\n");
		break;
	case 'O':
		printf("电脑获胜\n");
		break;
	case 'Q':
		printf("平局\n");
		break;
	}
}
int Is_full(char arr[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 (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char Judge(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0;i < row;i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			return arr[i][0];
	}

	int j = 0;
	for (j = 0;j < col;j++)
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')
			return arr[0][j];
	}

	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
		return arr[1][1];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
		return arr[1][1];

	if (Is_full(arr, ROW, COL) == 1)
	{
		return 'Q';
	}

	return 'C';
}

void computermove(char arr[ROW][COL], int row, int col,int* n)
{
	printf("电脑走\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'O';
			(*n)++;
			break;
		}
		else
			continue;
	}
}

void playermove(char arr[ROW][COL], int row, int col,int* n)
{
	printf("玩家走\n");
	int x = 0;
	int y = 0;
	printf("请输入落子坐标(行 列):");
	while (1)
	{
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = 'X';
				(*n)++;
				break;
			}
			else
			{
				printf("坐标已被占用,请重新输入:");
				continue;
			}
		}
		else
		{
			printf("坐标非法,请重新输入:");
			continue;
		}
	}
}

void DisplayBoard(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			printf(" %c ", arr[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0;j < col;j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void InitialBoard(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			arr[i][j] = ' ';
		}
	}
}

下面让我们跟电脑来一场酣畅淋漓的较量吧!! 

很显然,这个游戏难就难在怎么让电脑赢/doge


8.心得体会 🧐

  经过大概两天的学习和coding最终写出这篇博客,收获颇多,在学习完函数模块后以此巩固了对知识的掌握、加深了对知识的理解。错误和bug是在所难免的,虽然寻找它和修改它的过程很艰辛,但是每修一个bug都会十分的心情愉悦。

今天的分享到此为止啦,记得点个赞噢!

  • 31
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
五子是一种相对简单的类游戏,可以用C语言实现人机对战的功能。 首先,我们需要定义一个盘的二维数组来表示游戏界面,可以选择一个15×15的大小。用1代表玩家落子的地方,用2代表电脑落子的地方,用0代表空白的地方。 接下来,需要编写一个函数来打印当前的盘状态。可以使用循环来遍历盘数组,并根据不同的值输出对应的符号,比如打印X表示玩家落子,打印O表示电脑落子,打印空格表示空白的位置。 然后,需要编写一个函数来实现玩家的落子功能。可以通过向控制台读取玩家的输入来确定落子的位置,然后将相应的盘数组位置修改为1。 接着,需要编写一个函数来实现电脑的落子功能。可以使用一种简单的算法来确定落子的位置,比如随机选择一个空白位置来落子,并将对应的盘数组位置修改为2。 最后,还需要编写一个函数来检查游戏是否结束。可以通过遍历盘数组来检查是否有五个相连的子。可以编写多个检查函数,分别检查横向、纵向、左上到右下、右上到左下四个方向是否存在五连子。 在主函数中,可以通过循环来控制游戏的进行,每个循环中先打印当前的盘状态,然后让玩家落子,再检查游戏是否结束,如果没有结束则让电脑落子,再次检查游戏是否结束。 以上就是用C语言实现简易五子人机对战的基本思路,可以根据需要进行进一步的功能扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值