三子棋游戏的实现3.0

1、开发环境

   VS 2022

2、 三子棋实现思路及详细步骤

(1)创建 .h .c 文件

在这里插入图片描述
在这里我们分别创建 game.h文件,game.c 文件和 test.c 文件
game.h 用来存放库函数和自定义函数的声明
game.c 用来实现自定义函数的定义(函数的定义是指函数的具体实现,交代函数的功能实现)
test.c 用来完成代码的实现
1、将库函数放到 game.h 文件

在这里插入图片描述
2、game.c 文件和 test.c 文件分别引用 game.h头文件

在这里插入图片描述

在这里插入图片描述

(2)创建主函数main()并实现部分代码

首先我们先写出三子棋游戏的大致代码

在这里插入图片描述

进入main函数,打印菜单,然后根据菜单提示输入,1 进入游戏, 0 退出游戏,输入其他的数则提示输入错误。但是这样我们只能玩一局,想要实现玩多局只需要使用 do-while循环就可以解决,如图。

在这里插入图片描述while里面的判断式用 a (我们输入的数据)是因为切合判断,当输入为0时,意味着游戏结束,循环同时也终止,输入1 和其他的数时,循环继续

(3)创建game()函数并创建二维数组

这里优化我们的 case 1: ,创建一个game 函数来实现游戏

在这里插入图片描述我们实现的游戏是三子棋,首先得创建一个二维数组

在这里插入图片描述

在这里插入图片描述

(4)初始化二维数组

首先,我们先创建一个函数Initboard用来初始化二维数组,将二维数组里面的元素初始化为 “空格” 符号
1、在 game.h 文件里面声明Initboard函数

在这里插入图片描述2、在 game.c里面定义Initboard函数

在这里插入图片描述test.c里面调用Initboard函数

在这里插入图片描述

(5)打印棋盘

创建 Displayboard 函数用来打印棋盘
1、在 game.h 文件里面声明 Displayboard 函数

在这里插入图片描述2、在 game.c里面定义 Displayboard 函数

在这里插入图片描述
在test.c里面调用 Displayboard 函数

在这里插入图片描述

(6)玩家下棋并打印棋盘

创建函数 Playerboard 实现玩家下棋
1、声明函数

在这里插入图片描述2、函数定义

在这里插入图片描述

因为数组下标是从0 开始的,所以棋盘的坐标如图所示

在这里插入图片描述但玩家认为的棋盘如图2

在这里插入图片描述
所以玩家所输入的坐标比实际大一,则对应的元素是board[x-1][y-1],玩家输入坐标后应判断所对应的位置是否有元素,没有的话可以落子,有的话电脑给与提示并重新输入(使用while循环),落子后应打印棋盘

注意:玩家输入坐标的时候没有给限制范围,因此当玩家输入坐标越界时,电脑给予提示并重新输入

在这里插入图片描述

3、函数调用

在这里插入图片描述

(7)电脑下棋

创建函数 Computerboard 实现电脑下棋
1、函数声明

在这里插入图片描述2、函数定义

在这里插入图片描述电脑下棋是产生一个随机坐标,即两个随机数 x,y 范围是0 < x < row, 0 < y < col
rand()函数可以产生随机数,并且需要调用 srand来初始化rand函数产生随机数的起点,需要包含头文件 #include<stdlib.h> srand在一个工程中调用一次就行了,所以放在main函数中。srand函数调用time函数,需要包含头文件 #inclide<time.h>

在这里插入图片描述在这里插入图片描述

电脑落子同样需要判断对应位置是否为空,空则落子,非空则提示并重新落子,打印棋盘

注意: 电脑产生随机数的时候范围已经确定,所以不会越界

(8)判断输赢

创建一个函数 IsWin 来判断输、赢,平局还是继续
声明函数

在这里插入图片描述
定义函数

在这里插入图片描述分别判断每 行、每列、对角线元素分别相等,但都不等于空格符,返回该行,列,对角线的元素
如果没有的话则判断棋盘上是否还有空位,没有则证明是平局
如果以上判断都不满足的话,则游戏继续。

我们创建 Isfull 函数来判断棋盘是否有空位
1、声明函数

在这里插入图片描述2、定义函数

在这里插入图片描述
3、调用函数
在 IsWin 函数里面调用了

注意:玩家和电脑每次下棋之后都要判断输赢,以此来确定游戏是否继续

在这里插入图片描述

3、三子棋实现完整代码

game.h代码

#include<stdio.h>   //放到 .h 文件,更方便 .c 文件使用
#define ROW 3   //定义数组的行为3,  在这里定义方便修改
#define COL 3   //定义数组的列为3
#include<time.h>
#include<stdlib.h>


//声明自定义函数
void Initboard(char board[ROW][COL], int row, int col);//用来始化二维数组的
void Displayboard(char board[ROW][COL], int row, int col);//打印棋盘
void Playerboard(char board[ROW][COL], int row, int col);//玩家下棋
void Computerboard(char board[ROW][COL], int row, int col);//电脑下棋
char IsWin(char board[ROW][COL], int row, int col);//判断是赢、输还是平局
int Isfull(char board[ROW][COL], int row, int col);//判断棋盘是否满了

game.c代码

#include"game.h"
void Initboard(char board[ROW][COL], int row, int col)//初始化二维数组board[ROW][COL]中的元素为” “
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)//控制二维数组的行
	{
		for (j = 0; j < col; j++)  //控制二位数组的列
		{
			board[i][j] = ' ';      //将 ' ' 赋值给二维数组的元素
		}
	}
}



void Displayboard(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)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");           //打印‘---’
				if (j < col - 1)
				{
					printf("|");         //打印‘|’
				}
			}
			printf("\n");                //换行
		}
	}
}

void Playerboard(char board[ROW][COL], int row, int col)//执行玩家下棋
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	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("坐标被占有,不能落子,请重新输入\n");

			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}


	}
}

void Computerboard(char board[ROW][COL], int row, int col)//执行电脑下棋
{
	int x = 0;
	int y = 0;
	
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;  //产生一个0 - row-1 的随机数
		y = rand() % col;  //产生一个0 - col-1 的随机数
		if (board[x][y] == ' ')   //判断能否落子
		{
			board[x][y] = '#';    //落子
			break;
		}
		else
		{
			printf("坐标被占有,不能落子,请重新输入!\n");
		}

	}	

}


int Isfull(char board[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 (board[i][j] == ' ')   //棋盘还有空位
			{
				return 1;             //返回 1
			}
				
		}
	}
	return 0;                      // 没有空位,返回0
}


   //1、玩家赢   ‘*’
   //2、电脑赢   ‘#’
   //3、平局     ‘Q’
   //4、继续     ‘Z'

char IsWin(char board[ROW][COL], int row, int col)//判断输赢
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ') //判断行
		{
			return board[i][0];
		}
	}

	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')  //判断列
		{
			return board[0][i];
		}
	}

	if ((board[0][0] == board[1][1] && board[0][0] == board[2][2]) && board[0][i] != ' ')   //判断对角线
	{
		return board[1][1];
	}

	if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][i] != ' ')    //判断对角线
	{
		return board[1][1];
	}

	if (Isfull(board, row, col) == 0)
	{
		return 'Q';            //平局返回 ‘Q'
	}
	
	return 'Z';            //没赢没平局返回 'Z'
	
	

}

test.c 代码

#include"game.h"
void mune()
{
	printf("**********************\n");
	printf("*******1.进入游戏*****\n");
	printf("*******0.退出游戏*****\n");
	printf("**********************\n");
}
void game()
{
	char ch = 0;
	char board[ROW][COL] = { 0 };    //定义二维数组
	Initboard(board, ROW, COL);      //初始化二维数组
	Displayboard(board, ROW, COL);   //打印棋盘---本质是打印数组里的内容

	while(1)
	{
		Playerboard(board, ROW, COL);    //玩家下棋
		Displayboard(board, ROW, COL);   //打印棋盘
		ch = IsWin(board, ROW, COL);     //判断输赢
		if (ch != 'Z')
		{
			break;
		}
		Computerboard(board, ROW, COL);  //电脑下棋
		Displayboard(board, ROW, COL);   //打印棋盘
		ch = IsWin(board, ROW, COL);     //判断输赢
		if (ch != 'Z')
		{
			break;
		}	
	}
	if (ch == '*')
	{
		printf("玩家赢\n");
	}
	else if (ch == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}
}

int main()
{
	int a = 0;
	srand((unsigned int)time(NULL)); //初始化rand函数产生随机数的起点
	do {
		mune();     //打印菜单
		printf("请选择>;");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏退出\n");
			break;
		default:
			printf("选择错误,请重新选择。");
			break;
		}
	} while (a);     //do while 循环 可以多次进行游戏 

	return 0;
}

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值