栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言day6】实现任意行列的井字棋

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言day6】实现任意行列的井字棋

一:程序要求

井字棋,类似五子棋,任意三个标记形成一条直线,则为获胜。

这个程序中,要求不仅是三乘三的井字棋,而是能够实现更多行列的井字棋。

二:文件分类

采用模块化的编程方法,将函数、主函数和头文件分开存放。

1main.c文件

用来存放主函数。

2fun.c文件

用来存放自定义函数。

3hand.h

用来存放函数的声明和define定义

三:详细代码

1main.c文件

#include "hand.h"
#define  _CRT_SECURE_NO_WARNINGS 1

int main()
{
	int a = 0;
	int i = 0;
	char arr[ROW][COL] = { 0 };
	int x = 0;
	int y = 0;

	srand((unsigned int)time(NULL));//随机数起点



	do
	{
		//打印菜单
		menu();


		//选择游戏
		printf("请进行选择:>");
		scanf("%d", &a);


		switch (a)
		{
		case 1:
			printf("游戏开始");

			//棋盘初始化
			initiBoard(arr, ROW, COL);

			//打印棋盘
			displayBoard(arr, ROW, COL);

			while (1)
			{

				//玩家输入
				player(arr, ROW, COL);

				//判断
				if (isWin(arr, ROW, COL) == '*')
				{
					printf("玩家胜利");
					break;
				}
				else if(isWin(arr, ROW, COL) == '$')
				{
					printf("电脑胜利");
					break;
				}
				else if (isWin(arr, ROW, COL) == 'd')
				{
					printf("平局");
					break;
				}

				//电脑输入
				computer(arr, ROW, COL);

				//判断
				if (isWin(arr, ROW, COL) == '*')
				{
					printf("玩家胜利");
					break;
				}
				else if (isWin(arr, ROW, COL) == '$')
				{
					printf("电脑胜利");
					break;
				}
				else if (isWin(arr, ROW, COL) == 'd')
				{
					printf("平局");
					break;
				}
			}



			

			break;
		case 0:
			printf("游戏结束");
			break;
		default:
			printf("输入非法,请重新输入");
			break;
		}


	} while (a);

	return 0;
}

二:fun.c文件

#include "hand.h"
//打印菜单
void menu(void)
{
	printf("n***************************n");
	printf("********1.开始游戏*********n");
	printf("********0.结束游戏*********n");
	printf("***************************n");

}

//遍历二维数组,将所有元素全部写入空格
void initiBoard(char arr[][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < COL; i++)
	{
		for (j = 0; j < COL; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

//打印棋盘
void displayBoard(char arr[][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		printf("n");
		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("|");
				}

		}


		}
	}

}
void player(char arr[][COL], int row, int col)
{
	int x = 0;
	int y = 0;

	while (1)
	{
		printf("玩家走n");
		printf("请输入下棋坐标n");
		scanf("%d %d", &x, &y);
		if (arr[x-1][y-1] == ' ')
		{
			arr[x-1][y-1] = '*';
			displayBoard(arr, ROW, COL);
			break;
		}
		else
			printf("输入非法,请重新输入n");
	}

	


}



void computer(char arr[][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走n");
	
	while (1)
	{
		x = rand() % row;
		y = rand() % row;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '$';
			displayBoard(arr, ROW, COL);
			break;
		}

	}

}
		
		



//判断棋盘状态
int isWin(char arr[][COL], int row, int col)
{   
	int i = 0;
	int j = 0;
	int k = 0;
	int t = 0;
	//if胜利的条件,行、列或斜对角的棋子被任意一方占据,即为胜利
	//判断行



	for (i = 0; i < row; i++)
	{
		k = 0;
		t = 0;
		for (j = 0; j < col; j++)
		{
			
			if (arr[i][j] == '*')
			{
				k++;
				
				if (k == col)
				{
					return '*';
				}

			else if (arr[i][j] == '$')
			{
				t++;
				if (t == col)
				{
					return '$';
				}
				}
			}
		}
		
	}
	//判断列
	for (j = 0; j < col; j++)
	{
		k = 0;
		t = 0;
		for (i = 0; i < row; i++)
		{

			if (arr[i][j] == '*')
			{
				k++;
				if (k == row)
				{
					return '*';
				}
			
			}
			else if (arr[i][j] == '$')
			{
				t++;
				if (t == row)
				{
					return '$';
				}
			}
		}
	}

	//判断左上到右下对角线
	k = 0;
	t = 0;
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (i == j&&arr[i][j]=='*')
			{
				k++;
				if (k == row)
				{
					return '*';
				}
			}
			else if (i == j && arr[i][j] == '$')
			{
				t++;
				if (t == row)
				{
					return '$';
				}
			}
		}
	}


	//判断左下到右上对角线
	k = 0;
	t = 0;
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (i+j==col-1&&arr[i][j] == '*')
			{
				k++;
				if (k == row)
				{
					return '*';
				}
			}
			else if (i + j == col - 1 && arr[i][j] == '$')
			{
				t++;
				if (t == row)
				{
					return '$';
				}
			}
		}
	}




	//else if 遍历不存在空格 平局
	k = 0;
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (arr[i][j] != ' ')
			{   
				k++;
				if (k == row * col)
				{
					return 'd';
				}
			}
		}
	}


	
	//都不是,则继续


}
#define  _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define ROW 10
#define COL 10
void initiBoard(char arr[][COL], int row, int col);
void displayBoard(char arr[][COL], int row, int col);
void player(char arr[][COL], int row, int col);
void computer(char arr[][COL], int row, int col);
int isWin(char arr[][COL], int row, int col);

在头文件中更换ROW和COL的值,便可以改变行列数。

#define  _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define ROW 3
#define COL 3
void initiBoard(char arr[][COL], int row, int col);
void displayBoard(char arr[][COL], int row, int col);
void player(char arr[][COL], int row, int col);
void computer(char arr[][COL], int row, int col);
int isWin(char arr[][COL], int row, int col);

 

 四:总结

1在判断胜利的条件上,写的太冗余,代码可继续优化。

2自定义函数可进一步分成更细的.c文件,方便调用。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862587.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号