C语言:井字棋的实现(电脑落子随机,做的并不完善)(还在努力学习中,不足之处还请见谅)

首先对于这样一个小游戏的实现所需要的代码肯定是比较多的,我建议在源文件中创建三个文件夹。我个人是命名为game.c  game.h  以及text.c。

text.c

中代码为游戏运行的主体部分,游戏实现的逻辑部分主要在这里。

game.c中代码是text.c中需要用到的自定义函数。

game.h中是text.c和game.c需要应用的头文件以及game.c中函数的声明,并且在text.c与game.c中写上

#include"game.h"

(在这里我先不介绍函数的具体实现步骤哦,将在底下为大家展示。)

接下来给大家在注释中讲一讲text.c中需要的代码。

#include"game.h"
int main()
{
    //创建二维数组对应井字棋的九格子
    char arr[ROW][COL] = {0};//ROW 与 COL都是在game.h中的常量#define ROW 3    #define COL 3
    srand(time(NULL));
	int z = 0;//这两条代码都是为了之后随机落子准备的,以及玩家或电脑先手随机做准备
    do
    {
        menu1();//打印菜单选择1开始游戏选择2结束游戏。
        int i = 0;    
		while (1)
		{
			scanf("%d", &i);
			if (i == 1)
				break;
			else if (i == 2)
			{
				printf("游戏结束\n");
				break;
			}
			else
			{
				printf("输入错误,请重新输入\n");
			}
		}
        Sleep(500);
		system("cls");//清空上一步开始游戏的菜单,为下一步打印游戏开始时的棋盘做准备
        if (i == 2)
			break;
        init(arr, ROW, COL);//由于一开始的棋盘是空的,所以要对arr初始化使其每一个元素都存放‘ ’
        Printf(arr, ROW, COL);//打印棋盘,供玩家或电脑选择落子位置
        z = rand() % 2 + 1;
		char ret = 0;
        //由随机值z决定玩家先手还是电脑电脑先手
        if (z == 1)
		{
			while (1)//循环玩家落子,判定胜负,电脑落子,判定胜负的过程
			{
				player_move(arr);//玩家落子的函数
				ret = Judge(arr);//判断胜负函数,利用返回值确定是玩家获胜或者电脑获胜或者游戏继续,或者是无人胜出,平局。
                //有人获胜或平局跳出循环,游戏继续则不进行操作,循环继续
				if (ret == '*')
				{
					printf("玩家获胜\n游戏结束\n");
					break;
				}
				else if (ret == '#')
				{
					printf("电脑获胜\n游戏结束\n");
					break;
				}
				else if (ret == 'T')//游戏继续
				{
					;
				}
				else
				{
					printf("平局\n游戏结束\n");
					break;
				}
				computer_move(arr);//电脑落子的函数
				ret = Judge(arr);
				if (ret == '*')
				{
					printf("玩家获胜\n游戏结束\n");
					break;
				}
				else if (ret == '#')
				{
					printf("电脑获胜\n游戏结束\n");
					break;
				}
				else if (ret == 'T')//游戏继续
				{
					;
				}
				else
				{
					printf("平局\n游戏结束\n");
					break;
				}
			}
		}
		else if (z == 2)//这里交换电脑与玩家的落子顺序改变先手。
		{
			while (1)
			{
				computer_move(arr);
				ret = Judge(arr);
				if (ret == '*')
				{
					printf("玩家获胜\n游戏结束\n");
					break;
				}
				else if (ret == '#')
				{
					printf("电脑获胜\n游戏结束\n");
					break;
				}
				else if (ret == 'T')
				{
					;
				}
				else
				{
					printf("平局\n游戏结束\n");
					break;
				}
				player_move(arr);
				ret = Judge(arr);
				if (ret == '*')
				{
					printf("玩家获胜\n游戏结束\n");
					break;
				}
				else if (ret == '#')
				{
					printf("电脑获胜\n游戏结束\n");
					break;
				}
				else if (ret == 'T')
				{
					;
				}
				else
				{
					printf("平局\n游戏结束\n");
					break;
				}
			}
		}
		menu2();打印菜单2供玩家选择再来一局或者退出游戏
		int j = 0;
		while (1)
		{
			scanf("%d", &i);
			if (i == 1)
			{
				system("cls");//为了实现游戏重新开始,所以清空原来屏幕的内容
				break;
			}
			else if (i == 2)
			{
				printf("游戏结束\n");
				j++;
				break;
			}
			else
			{
				printf("输入错误,请重新输入\n");
			}
		}
		if (j==1)
		{
			break;
		}
	} while (1);
	return 0;
}

    
    

对于需要引用的头文件以及函数我们放在game.h 中

#include<stdio.h>
#define ROW 3
#define COL 3
#include<time.h>
#include<stdlib.h>
//打印开局时的菜单
void menu1(void);
//打印结束时的菜单
void menu2(void);
//初始化棋盘
void init(char* str, int row, int col);
//打印期棋盘
void Printf(char* str, int row, int col);
//玩家落子
void player_move(arr);
//电脑落子
void computer_move(arr);
//判断游戏结束与否
char Judge(char* str);

最后我们需要关注的是game.c中函数的实现部分

#include"game.h"
void menu1(void)
{
	printf("****************\n");
	printf("***1.开始游戏***\n");
	printf("***2.退出游戏***\n");
	printf("****************\n");
	printf("tip:玩家执'*'电脑执'#'\n先手方随机\n");
}
void menu2(void)
{
	printf("****************\n");
	printf("***1.再来一局***\n");
	printf("***2.退出游戏***\n");
	printf("****************\n");
	printf("tip:玩家执'*'电脑执'#'\n先手方随机\n");
}
void init(char* str, int row, int col)
{
	for (int i = 0; i < ROW; i++)
	{
		for (int n = 0; n < COL; n++)
		{
			*(str+3*i+n) =' ';
		}
	}
}
void Printf(char* str, int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int n = 0; n < col; n++)
		{
			printf(" %c ",*(str+3*i+n));
				if (n < col - 1)
				{
					printf("|");
				}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (int n = 0; n < col; n++)
			{
				printf("---");
				if (n < col - 1)
				{
					printf(" ");
				}
			}
			printf("\n");
		}
		
	}
}
void player_move(char* str)
{
	printf("请输入坐标 行 列\n");
	int x = 0, y = 0;
	while (1)
	{
		scanf("%d%d", &x, &y); 
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL&& *(str + 3 * (x - 1) + y - 1) == ' ')
		{
			Sleep(500);
			system("cls");
			printf("玩家回合:\n");
			*(str + 3 * (x - 1) + y - 1) = '*';
			Printf(str, ROW, COL);
			printf("电脑回合:\n");
			Sleep(1000);
			break;
		}
		else
			printf("输入坐标有误请重新输入\n");
	}
}
void computer_move(char* str)
{
	printf("请输入坐标 行 列\n");
	int x = 0, y = 0;
	while(1)
	{
		x = rand() % 3 + 1;
		y = rand() % 3 + 1;
		system("cls");
		printf("电脑回合:\n");
		if (*(str + 3 * (x - 1) + y - 1) == ' ')
		{
			*(str + 3 * (x - 1) + y - 1) = '#';
			Printf(str, ROW, COL);
			printf("玩家回合:\n");
			break;
		}
		else
			continue;
	}
}
char Judge(char* str)
{
	for (int i = 0; i < ROW; i++)
	{
		if (*(str + 3 * i + 0) == *(str + 3 * i + 1) && *(str + 3 * i + 0) == *(str + 3 * i + 2) && *(str + 3 * i + 0) != ' ')
		{
			return *(str + 3 * i + 0);
		}
	}
	for (int i = 0; i < COL; i++)
	{
		if (*(str + 0 + i) == *(str + 3 + i) && *(str + 0 + i) == *(str + 6 + i) && *(str + 0 + i) != ' ')
		{
			return *(str + 0 + i);
		}
	}
	if ((*(str + 0) == *(str + 3 + 1) && *(str + 3 + 1) == *(str + 6 + 2) && *(str + 3 + 1) != ' ') || (*(str + 0 + 2) == *(str + 3 + 1) && *(str + 3 + 1) == *(str + 6 + 0) && *(str + 0 + 2) != ' '))
	{
		return *(str + 3 + 1);
	}
	int count = 0;
	for (int i = 0; i < 9; i++)
	{
		if (*(str + i) != ' ')
			count++;
	}
	if (count < 9)
		return 'T';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值