C语言 五子棋游戏(也可n子棋)

2023-11-17

目录

1.创造棋盘

2.玩家下棋

3.电脑下棋

4.判断输赢

赢的判断(也是最难的):

行的判断:

列的判断:

主副对角线的判断(花费时间最长):

平局或者继续:

最后判断的全部代码

三个文件的代码

头文件的引用及函数的声明

测试部分

函数的实现

一个文件的代码

写完文章完的话


今天我要分享一个小游戏,五子棋游戏(由三子棋改编)。

比较重要的图片

首先用一个通用的do while游戏模式

void meun()
{
	printf("##############################\n");
	printf("########### 1. play ##########\n");
	printf("########### 0. exit ##########\n");
	printf("##############################\n");
}

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		meun();
		printf("请输入你的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
	} while (input);

}

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

然后给出game()函数怎么做

1.创造棋盘

 先用三子棋为例

红色为一个二维数组的各个元素的位置蓝色为空格先让数组元素赋值为空格。以便之后再人为赋值或者电脑赋值。

//数组元素的初始化
void InitBoard(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			show[i][j] = ' ';
		}
	}
}

//设置棋盘
void DisplayBoard(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	
	printf("#");
	for (i = 0; i < row; i++)
	{
		printf(" %d ", i + 1);
		if (i != row - 1)
		{
			printf(" ");
		}
	}
	printf("\n");

	for (i = 0; i < row; i++)
	{
		printf("%d", i + 1);
		for (j = 0; j < col; j++)
		{
			printf(" %c ", show[i][j]);
			if (j != col - 1)
			{
				printf("|");
			}
			else
			{
				printf("\n");
			}
		}

		if (i != row - 1)
		{
			printf(" ");
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j != col - 1)
				{
					printf("|");
				}
				else
				{
					printf("\n");
				}
			}
		}
	}
}

2.玩家下棋

选择一个坐标,如果这个位置合法且没有被下过就下这里。注意:玩家并不都是程序员,所以访问数组元素的时候要注意下标。例如,玩家输入1 1,其实访问的是[0][0]下标的元素。

 

void PlayerBoard(char show[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入你的坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col && show[x - 1][y - 1] == ' ')
		{
			show[x - 1][y - 1] = '*';
			break;
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}

3.电脑下棋

我这里的电脑下棋是随机的,用两个随机数作为坐标下棋.

用的是常用的rand()函数,用srand()撒播随机种子,srand()函数的参数用的是(unsigned int)time(NULL)。这里用了两个头文件#include<stdlib.h>和#include<time.h>

但是还要让这个随机数在一个范围内随机,所以需要用一个操作限制随机数——取余。例如,

10不在1-5之前,则10%5 + 1就在这个区域了。加一是让取余为0的数字进入范围。

//这里需要引用的头文件
#include<stdlib.h>
#include<time.h>

//撒播随机种子
srand((unsigned int)time(NULL));

//电脑下棋
void ComputerBoard(char show[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row + 1;//限制随机数
		y = rand() % col + 1;
		if (x >= 1 && x <= row && y >= 1 && y <= col && show[x - 1][y - 1] == ' ')
		{
			show[x - 1][y - 1] = '#';
			break;
		}
	}
}

4.判断输赢

不管是人还是电脑,下完棋都要判断输赢尽快告诉玩家,中止游戏。

判断无非有四种情况玩家赢电脑赢平局继续

人和电脑并不是下一步就停止了,所以用一个循环来然人和电脑不停地玩回合战。

总有一个时刻要分出输赢或平局,继续。用一个if语句来判断战局情况。

所以要设置一个函数来返回一个字符来展示战局情况。

在这个函数里,比较重要的是判断输赢,其次是平局,然后是继续。

判断输赢,其实只用判断赢了没有就可以(反正我也不会判断怎么输),所以在玩家或电脑每下一步棋就判断一次就行。其中还要对每一行、每一列、每个对角线(主副对角线)进行判断。

赢的判断(也是最难的):

行的判断:

先是每一行用一个大循环进行行移动,用count记录该行是否满足条件,再用一个循环进行行内有无满足条件的,如果有就让count++,continue。非则让count赋回原值,知道count满足游戏规则的数值EASY_COUNT(就是你要玩几子棋).

列的判断:

思路和行一样

//逐行判断
	for (i = 0; i < row; i++)
	{
		int count = 1;
		for (j = 0; j < col - 1; j++)
		{
			if (show[i][j] == show[i][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}
	//逐列判断
	for (i = 0; i < col; i++)
	{
		int count = 1;
		for (j = 0; j < row - 1; j++)
		{
			if (show[j][i] == show[j + 1][i] && show[j][i] != ' ')
			{
		1;		count++;
				if (count == EASY_COUNT)
				{
					return show[j][i];
				}
				continue;
			}
			count = 1;
		}
	}

主副对角线的判断(花费时间最长):

首先让对角线的判断分为两个模式(这两个模式是都要进行的):

一、从左上的右下我简称为右下。

二、从左下到右上我简称为右上。

并不是所有对角线都要进行判断。

 如果玩的是三子棋,红色箭头的对角线就是没有必要判断的。不要着急,你可能会问不是五子棋吗?怎么又变三子棋了?你可以让棋盘变大,你可以改变EASY_COUNT的值让这个游戏变成5子棋,6子棋。

然后我要引用一个小算法减少不必要的时间浪费。

一个正方形边长是用n个数组成。

 例如玩三子棋。你会发现如果横2竖2斜边是2,横3竖3斜边是3,横4竖4斜边是4,横5竖5斜边是5.没错这就是规律。现在玩三子棋那么我需要判断的对角线至少有三个能数的子。用右下(从左上到右下),应该分为两个阶段:红色和蓝色

 先分析红色,限制行数应该是行数row减去EASY_COUNT的值。好吧蓝色你应该也会了,但是注意一点,蓝色比红色少一个对角线。

现在判断右上(从左下到右上):

先分析红色,这个简单,就是行数为EASY_COUNT这一行到行数为row那一行。蓝色:列数col减去EASY_COUNT的值为限制列数。

说了这么多,该代码了,但是要提醒一点注意我描述下标是玩家认为的下标并不是真实的下标,还是坐标1 1,其实是[0][0]元素的访问。

//主副对角线
	//1. 右上

	k = EASY_COUNT - 1;
	for (k; k < row; k++)
	{
		int count = 1;
		for (i = k, j = 0; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = row - 1, j = k; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	//右下
	k = row - EASY_COUNT;

	for (k; k >= 0; k--)
	{
		int count = 1;
		for (i = k, j = 0; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = 0, j = k; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

平局或者继续:

这个比较简单,平局我用了一个函数IsFull()。

int IsFull(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (show[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

if (1 == IsFull(show, ROW, COL))
	{
		return 'Q';
	}
	else
	{
		return 'C';
	}

最后判断的全部代码

int IsFull(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (show[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char IsWin(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int k = 0;
	//逐行判断
	for (i = 0; i < row; i++)
	{
		int count = 1;
		for (j = 0; j < col - 1; j++)
		{
			if (show[i][j] == show[i][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}
	//逐列判断
	for (i = 0; i < col; i++)
	{
		int count = 1;
		for (j = 0; j < row - 1; j++)
		{
			if (show[j][i] == show[j + 1][i] && show[j][i] != ' ')
			{
		1;		count++;
				if (count == EASY_COUNT)
				{
					return show[j][i];
				}
				continue;
			}
			count = 1;
		}
	}
	//主副对角线
	//1. 右上

	k = EASY_COUNT - 1;
	for (k; k < row; k++)
	{
		int count = 1;
		for (i = k, j = 0; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = row - 1, j = k; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	//右下
	k = row - EASY_COUNT;

	for (k; k >= 0; k--)
	{
		int count = 1;
		for (i = k, j = 0; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = 0, j = k; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	if (1 == IsFull(show, ROW, COL))
	{
		return 'Q';
	}
	else
	{
		return 'C';
	}
}

三个文件的代码

头文件的引用及函数的声明

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


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

#define EASY_COUNT 5//你要玩的几子棋


void InitBoard(char show[ROW][COL], int row, int col);


void DisplayBoard(char show[ROW][COL], int row, int col);


void PlayerBoard(char show[ROW][COL], int row, int col);


void ComputerBoard(char show[ROW][COL], int row, int col);


char IsWin(char show[ROW][COL], int row, int col);

测试部分

game.h是我自己的头文件的名字

#include"game.h"



void meun()
{
	printf("##############################\n");
	printf("########### 1. play ##########\n");
	printf("########### 0. exit ##########\n");
	printf("##############################\n");
}



void game()
{
	char show[ROW][COL] = { 0 };
	InitBoard(show, ROW, COL);
	DisplayBoard(show, ROW, COL);
	
	char ret = '\0';
	while (1)
	{
		PlayerBoard(show, ROW, COL);
		DisplayBoard(show, ROW, COL);
		ret = IsWin(show, ROW, COL);
		if (ret != 'C')
		{
			break;
		}

		ComputerBoard(show, ROW, COL);
		DisplayBoard(show, ROW, COL);
		ret = IsWin(show, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}

}



void meun()
{
	printf("##############################\n");
	printf("########### 1. play ##########\n");
	printf("########### 0. exit ##########\n");
	printf("##############################\n");
}

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		meun();
		printf("请输入你的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
	} while (input);

}

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

函数的实现

#include"game.h"

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

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

	for (i = 0; i < row; i++)
	{
		printf("%d", i + 1);
		for (j = 0; j < col; j++)
		{
			printf(" %c ", show[i][j]);
			if (j != col - 1)
			{
				printf("|");
			}
			else
			{
				printf("\n");
			}
		}

		if (i != row - 1)
		{
			printf(" ");
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j != col - 1)
				{
					printf("|");
				}
				else
				{
					printf("\n");
				}
			}
		}
	}
}


void PlayerBoard(char show[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入你的坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col && show[x - 1][y - 1] == ' ')
		{
			show[x - 1][y - 1] = '*';
			break;
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}



void ComputerBoard(char show[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		//printf("%d %d\n", x, y);
		if (x >= 1 && x <= row && y >= 1 && y <= col && show[x - 1][y - 1] == ' ')
		{
			show[x - 1][y - 1] = '#';
			break;
		}
	}
}


int IsFull(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (show[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char IsWin(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int k = 0;
	//逐行判断
	for (i = 0; i < row; i++)
	{
		int count = 1;
		for (j = 0; j < col - 1; j++)
		{
			if (show[i][j] == show[i][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}
	//逐列判断
	for (i = 0; i < col; i++)
	{
		int count = 1;
		for (j = 0; j < row - 1; j++)
		{
			if (show[j][i] == show[j + 1][i] && show[j][i] != ' ')
			{
		1;		count++;
				if (count == EASY_COUNT)
				{
					return show[j][i];
				}
				continue;
			}
			count = 1;
		}
	}
	//主副对角线
	//1. 右上

	k = EASY_COUNT - 1;
	for (k; k < row; k++)
	{
		int count = 1;
		for (i = k, j = 0; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = row - 1, j = k; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	//右下
	k = row - EASY_COUNT;

	for (k; k >= 0; k--)
	{
		int count = 1;
		for (i = k, j = 0; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = 0, j = k; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	if (1 == IsFull(show, ROW, COL))
	{
		return 'Q';
	}
	else
	{
		return 'C';
	}
}

一个文件的代码

我知道有人看不懂,那我就写在一个.c文件上吧,就是说你让代码复制,然后粘贴到你的编译器的.c文件里就可以直接用了。

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


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

#define EASY_COUNT 5//你要玩的几子棋


void InitBoard(char show[ROW][COL], int row, int col);


void DisplayBoard(char show[ROW][COL], int row, int col);


void PlayerBoard(char show[ROW][COL], int row, int col);


void ComputerBoard(char show[ROW][COL], int row, int col);


char IsWin(char show[ROW][COL], int row, int col);


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

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

	for (i = 0; i < row; i++)
	{
		printf("%d", i + 1);
		for (j = 0; j < col; j++)
		{
			printf(" %c ", show[i][j]);
			if (j != col - 1)
			{
				printf("|");
			}
			else
			{
				printf("\n");
			}
		}

		if (i != row - 1)
		{
			printf(" ");
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j != col - 1)
				{
					printf("|");
				}
				else
				{
					printf("\n");
				}
			}
		}
	}
}


void PlayerBoard(char show[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入你的坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col && show[x - 1][y - 1] == ' ')
		{
			show[x - 1][y - 1] = '*';
			break;
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}



void ComputerBoard(char show[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		//printf("%d %d\n", x, y);
		if (x >= 1 && x <= row && y >= 1 && y <= col && show[x - 1][y - 1] == ' ')
		{
			show[x - 1][y - 1] = '#';
			break;
		}
	}
}


int IsFull(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (show[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char IsWin(char show[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int k = 0;
	//逐行判断
	for (i = 0; i < row; i++)
	{
		int count = 1;
		for (j = 0; j < col - 1; j++)
		{
			if (show[i][j] == show[i][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}
	//逐列判断
	for (i = 0; i < col; i++)
	{
		int count = 1;
		for (j = 0; j < row - 1; j++)
		{
			if (show[j][i] == show[j + 1][i] && show[j][i] != ' ')
			{
		1;		count++;
				if (count == EASY_COUNT)
				{
					return show[j][i];
				}
				continue;
			}
			count = 1;
		}
	}
	//主副对角线
	//1. 右上

	k = EASY_COUNT - 1;
	for (k; k < row; k++)
	{
		int count = 1;
		for (i = k, j = 0; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = row - 1, j = k; i != 0 && j != col - 1; i--, j++)
		{
			if (show[i][j] == show[i - 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	//右下
	k = row - EASY_COUNT;

	for (k; k >= 0; k--)
	{
		int count = 1;
		for (i = k, j = 0; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	k = col - EASY_COUNT;
	for (k; k > 0; k--)
	{
		int count = 1;
		for (i = 0, j = k; i != row - 1 && j != col - 1; i++, j++)
		{
			if (show[i][j] == show[i + 1][j + 1] && show[i][j] != ' ')
			{
				count++;
				if (count == EASY_COUNT)
				{
					return show[i][j];
				}
				continue;
			}
			count = 1;
		}
	}

	if (1 == IsFull(show, ROW, COL))
	{
		return 'Q';
	}
	else
	{
		return 'C';
	}
}



void meun()
{
	printf("##############################\n");
	printf("########### 1. play ##########\n");
	printf("########### 0. exit ##########\n");
	printf("##############################\n");
}



void game()
{
	char show[ROW][COL] = { 0 };
	InitBoard(show, ROW, COL);
	DisplayBoard(show, ROW, COL);
	
	char ret = '\0';
	while (1)
	{
		PlayerBoard(show, ROW, COL);
		DisplayBoard(show, ROW, COL);
		ret = IsWin(show, ROW, COL);
		if (ret != 'C')
		{
			break;
		}

		ComputerBoard(show, ROW, COL);
		DisplayBoard(show, ROW, COL);
		ret = IsWin(show, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}

}



void meun()
{
	printf("##############################\n");
	printf("########### 1. play ##########\n");
	printf("########### 0. exit ##########\n");
	printf("##############################\n");
}

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		meun();
		printf("请输入你的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
	} while (input);

}

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

写完文章完的话

如有错误可直接指出,希望和编程之路与伙伴共同进步。

最后,制作不易,觉得不错可以点赞。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 五子棋游戏(也可n子棋) 的相关文章

  • Jenkins打包部署gitee项目至阿里云ECS服务器

    原文地址 Jenkins打包部署gitee项目至阿里云ECS服务器 BIGTREE whwtree com 所需插件 Git Parameter Plug In插件 Publish Over SSH插件 Gitee Plugin插件 Nod
  • 7-2 jmu-ds-最长数字序列 (20 分)

    输入一个字符串 求该字符串中最长连续数字序列出现的起始位置及其长度 输入格式 输入一个字符串 可包含空格 输出格式 输出内容 最长数字序列起始位置和长度空格隔开 输出尾部不能有空格 输入空串 输出 NULL 输入样例 123ab12345a
  • 【工具篇】IntelliJ IDEA 设置编码格式UTF-8

    系统 Win11 Idea IDEA 2022 3 2 Ultimate Edition 文件编码 Editor gt File Encodings 编译编码 Build Execution Deployment gt Complier g
  • 从微信授权登录到数据安全性的思考总结

    前置知识 微信授权登录过程和相关名词 access token code openid等 微信授权登录 大都是拉起微信授权页面 用户同意授权后 再跳到自己应用的绑定手机页面进行绑定手机的操作 绑定之后自动登录 会话就像不会过期一样 或者是过
  • 基于live555实现实时视频监控

    目录 1 所需软件 源码及下载地址 1 2安装软件及编译 1 2 1 安装Windows版的VLC

随机推荐

  • JavaScript全解析——循环结构语句

    循环控制 控制程序重复执行若干次相同或似的逻辑 理解并正确使用循环控制 需要搞清楚循环的3个要素 起始值 变化量 终止条件 起始值循环的起点 可以是 任意数据类型值 变化量是指 改变起始值的方式 终止条件 布尔类型值 它是循环停止的边界 w
  • springboot多版本管理

    达到的版本控制效果如下 1 api版本定义在url中 采用 api 项目名 pro v4 接口名 的形式 2 api版本号通过注解进行定义 3 如果请求中不指定api版本号则返回最新版本 4 版本的自动适配 如果请求的api版本不存在 则返
  • 详解微信小程序网络请求接口封装

    为实现定制要求和方便调用 对微信小程序的网络请求接口进行了封装 在根目录新建api文件夹并新建httpRequest js与config js文件 1 设置请求域名 设置请求域名 let ENV wxConfig envVersion le
  • the import org.junit.Assert.* cannot be revolved的解决方法

    the import org junit Assert cannot be revolved的解决方法 具体解决方法 右键单击项目名 选择buildpath gt add library 弹出配置对话框 选择junit next下一步 系统
  • python想获取字符串str的长度_如何使用python获取字符串长度?哪些方法?

    掌握多种python技巧 对于我们更好的灵活应用python是非常重要的 比如接下来给大家介绍的获取字节长度 那大家脑海里就该有印象了 有几种方法呢 一起来看下吧 1 使用len 函数 这是最直接的方法 在这里 我们使用len 函数 字符串
  • 【python】将python代码打包成系统可执行文件(Pyinstaller模块)

    python文件打包输出可执行文件 1 Pyinstaller模块下载 2 Pyinstaller的使用 2 1 打开命令行 指引文件路径 2 2 直接生成可执行文件 3 常用指令 3 1 修改图标 3 2 修改名称 3 3 修改路径 1
  • 知识图谱,为移动搜索而生

    核心提示 当你尝试搜索 冰桶挑战 是什么决定你在搜索引擎上看到的内容呢 移动互联网时代 搜索引擎如何才能足够精准 个性化呢 这背后需要一个共同的作用机制 知识图谱 最近 冰桶挑战 挺火的 好奇心驱使我百度一下 看到如下结果 可能是做搜索的职
  • 人脸口罩检测 Python

    随着全球疫情的爆发 佩戴口罩成为了一项重要的健康和安全措施 在这种情况下 开发一个能够自动检测人脸是否佩戴口罩的系统变得非常有用 在本文中 我们将使用 Python 编程语言来实现一个简单的人脸口罩检测系统 首先 我们需要安装一些必要的 P
  • R语言mgarch包的说明_【R语言】优雅的循环迭代:purrr包

    用 R 写 循环 从低到高有三种境界 手动 for 循环 apply 函数族 purrr 包泛函式编程 补充一点 关于purrr 与 apply 族 purrr 提供了更多的一致性 规范性和便利性 更容易记住和使用 速度来说 apply 族
  • java多线程中synchronized同步代码块执行问题

    在高洪岩老师的 java多线程编程核心技术 一书的用同步代码块解决同步方法的弊端一节中 p76页 有这样一句话 当一个线程访问object的一个synchronized同步代码块时 另一个线程依然可以访问该object对象中的非synchr
  • Flash存储芯片:NOR Flash、NAND Flash、UFS和eMMC的比较与解析

    前言 在数字化时代的今天 数据的存储和管理变得越来越重要 各种各样的存储技术应运而生 以满足不同的使用场景和需求 其中 Flash存储芯片以其非易失性 可擦写性和可编程性等优势 占据了重要地位 本博客将详细介绍Flash存储芯片中的NOR
  • js屏蔽鼠标右键菜单&键盘ctrl+c,ctrl+v等

    文章目录 前言 一 效果展示 二 源代码 总结 前言 js屏蔽鼠标右键菜单以及屏蔽键盘ctrl c ctrl v ctrl a ctrl s ctrl p 一 效果展示 二 源代码
  • 数仓知识07:数据增量更新的几种方式

    1 增量更新的几种方式 增量更新的本质 其实是获取源表中数据变化的情况 增 删 改 然后将源表中发生的变化同步至目标表中 不同的方式 获取源表中数据变化的情况不一样 受技术的限制 表结构的限制 某些方式可能无法获取到完整的数据变化情况 因此
  • 后端返回分页数据过滤不需要的字段,先将不需要的属性置为null

    IPage
  • 腾讯mini项目-【指标监控服务重构】2023-07-23

    今日已办 组会记录 进度以及问题 otelzap 上报 Log 附属在 span 的 event 中 可以去查看具体的日志信息 如 trace id span id 日志级别等 还可以自定义属性 详细可见 https sztubdi cod
  • 微软云计算操作系统Windows Azure 平台——云+端全面攻略

    微软云计算操作系统Windows Azure 平台 云 端全面攻略 Windows Azure Platform 开发入门 在云计算时代 有三个平台非常重要 即开发平台 部署平台和运营平台 Windows Azure Platform是微软
  • I2S与pcm的区别

    I2S仅仅是PCM的一个分支 接口定义都是一样的 I2S的采样频率一般为44 1KHZ和48KHZ做 PCM采样频率一般为8K 16K 有四组信号 位时钟信号 同步信号 数据输入 数据输出 I2S总线标准 I2S Inter IC Soun
  • python 调用C DLL库 传参(传递数字、字符串、数组(一维、二维)、结构体)

    usr bin env python conding utf 8 from itertools import filterfalse import PySimpleGUI as sg from ctypes import cdll from
  • 如何将tomcat的http访问,改为https方式访问

    在执行以下操作的时候 需要先了解一个证书生成工具 keytool 他是jdk自带的证书管理工具 在jdk bin目录下 可以用来生成自签名证书 导入导出证书 打印证书信息等 整个过程分为两部分 第一部分是证书的生成 第二部分是修改tomca
  • C语言 五子棋游戏(也可n子棋)

    目录 1 创造棋盘 2 玩家下棋 3 电脑下棋 4 判断输赢 赢的判断 也是最难的 行的判断 列的判断 主副对角线的判断 花费时间最长 平局或者继续 最后判断的全部代码 三个文件的代码 头文件的引用及函数的声明 测试部分 函数的实现 一个文