简单的三子棋

通过简单的代码实现简单的三子棋

目录

一、项目代码

二、函数分析

1.remind函数实现

2.lninboard函数

3.Displayboard函数

4.player函数

5.computer函数

6.iswin函数


一、项目代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define row 3
#define col 3

void remind()
{
	printf("+*****************************************+\n"
		"+--------------  0 结束游戏  --------------+\n"
		"+-----------  1 开始/继续游戏  ------------+\n"
		"+*********************************************+\n");

}

void Initboard(char(*board)[3], int Row, int Col)
{
	int i = 0, j = 0;
	for (i = 0; i < Row; i++)
	{
		for (j = 0; j < Col; j++)
		{
			board[i][j] = ' '; // 赋予空格
		}
	}
}



void Displayboard(char(*board)[3], int Row, int Col)
{
	int i = 0, j = 0;
	for (i = 0; i < Row; i++)
	{
		printf("+---+---+---+\n");
		for (j = 0; j < Col; j++)
		{
			printf("| %c ", board[i][j]);
		}
		printf("|\n");
	}
	printf("+---+---+---+\n");
}

void player(char(*board)[3], int Row, int Col)
{
	printf("请分别输入横纵坐标(输入数据请用空格隔开):\n");
	scanf("%d%d", &Row, &Col);
	while (1)
	{
		if (((1 <= Row) && (Row <= 3))  //边界必须合格,且该地方无子
			&& ((1 <= Col) && (Col <= 3))
			&& (board[Row - 1][Col - 1] == ' '))
		{
			board[Row - 1][Col - 1] = '*'; //之所以Row - 1  Col - 1是考虑到玩家不一定是程序员,他不知道编程从0开始数
			break;
		}
		else
		{
			printf("请仔细坚持你的坐标位置,是否已经落子或坐标超界,然后重新输入坐标.\n");
			printf("请输入坐标:\n");
			scanf("%d%d", &Row, &Col);
		}
	}
	printf("下子成功!\n");
	Displayboard(board, row, col); // 无论是玩家还是电脑下子,都需要显示出下子内容
}


void computer(char(*board)[3], int Row, int Col)
{
	srand(time(NULL));
	while (1)
	{
		int i = rand() % 3;
		int j = rand() % 3;
		if (board[i][j] == ' ')
		{
			board[i][j] = '#';//#代表电脑下子
			break;
		}
	}
	printf("电脑已下子:\n");
	Displayboard(board, row, col); //电脑下子后,显示棋盘
}

int Iswin(char(*board)[3], int Row, int Col)
{
	//怎么判断一方赢?? 横,竖,斜线只要都一样,则可以知道一方赢(全是空格除外)
	for (int i = 0; i < Row; i++) //每一行
	{
		if ((board[i][0] == board[i][1])
			&& (board[i][1] == board[i][2])
			&& (board[i][0] != ' '))
		{
			if (board[i][0] == '*') return 1;  //如果一行都是*,说明玩家胜利,否则电脑胜利
			return -1;
		}
	}

	for (int j = 0; j < Col; j++) //每一列
	{
		if ((board[0][j] == board[1][j])
			&& (board[1][j] == board[2][j])
			&& (board[0][j] != ' '))
		{
			if (board[0][j] == '*') return 1; //如果一列都是*,说明玩家胜利,否则电脑胜利
			return -1;
		}
	}

	if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜线
		|| ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[1][1] != ' ')))
	{
		if (board[1][1] == '*') return 1;
		return -1;
	}

	for (int i = 0; i < Row; i++)
	{
		for (int j = 0; j < Col; j++)
		{
			if (board[i][j] == ' ')
				return -2; //如果前三者情况都没有,只要目前棋盘上还剩下空余位置
						   //就说明不输不赢,需要继续对弈.返回[-1,1]之外的值就行
		}
	}

	return 0; //除去上面4种情况就是平局
}


void playgame()
{
	char board[row][col]; // 存储下子内容
	int result = 0; //用来接收Iswin函数判断的返回值

	Initboard(board, row, col); //初始化棋盘,即最开始棋盘都没有下子

	Displayboard(board, row, col); //显示棋盘,即显示棋盘目前的状态

	while (1) //开始进行对弈,直到一方赢或者平局结束循环
	{
		player(board, row, col);  //玩家下子函数

		if ((result = Iswin(board, row, col)) == 1) break; // Iswin函数的设定是如果玩家胜利,返回1

		computer(board, row, col);  //电脑下子函数

		if ((result = Iswin(board, row, col)) == -1) break; // Iswin函数的设定是 如果电脑胜利,返回-1

		if (!result) break; //返回0平局,如果既没有输赢也不是平局,则继续对弈
	}

	if (result == 1) printf("恭喜您取得胜利!!!!!!!!!\n");
	else if (result == -1) printf("你也太辣鸡了吧,电脑都下不赢\n");
	else printf("哎~~,你的技术不行啊,居然和电脑达成平手\n");
}


#include <stdio.h>
int main()
{
	int input = 0;
	do
	{
		remind(); // 提示菜单
		scanf("%d", &input); //开始输入命令
		switch (input)
		{
		case 0:
			printf("成功退出游戏\n");
			break;
		case 1:
			playgame(); // 开始游戏
			printf("是否继续游戏\n");
			break;
		default:
			printf("命令错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

二、函数分析

1.remind函数实现

void remind()
{
	printf("+****************************************+\n"
		"+--------------  0 结束游戏  --------------+\n"
		"+-----------  1 开始/继续游戏  ------------+\n"
		"+*****************************************+\n");

}

通过此函数来调用程序操作界面

2.lninboard函数

void Initboard(char(*board)[3], int Row, int Col)
{
	int i = 0, j = 0;
	for (i = 0; i < Row; i++)
	{
		for (j = 0; j < Col; j++)
		{
			board[i][j] = ' '; // 赋予空格
		}
	}
}

通过该函数创造一个3*3的空白空间,以便于我们对游戏的进行

3.Displayboard函数

void Displayboard(char(*board)[3], int Row, int Col)
{
	int i = 0, j = 0;
	for (i = 0; i < Row; i++)
	{
		printf("+---+---+---+\n");
		for (j = 0; j < Col; j++)
		{
			printf("| %c ", board[i][j]);
		}
		printf("|\n");
	}
	printf("+---+---+---+\n");
}

通过该函数可以使初始化过的棋盘不单单是一片空白区域,每个格子与每个各自之间有了分界

4.player函数

void player(char(*board)[3], int Row, int Col)
{
	printf("请分别输入横纵坐标(输入数据请用空格隔开):\n");
	scanf("%d%d", &Row, &Col);
	while (1)
	{
		if (((1 <= Row) && (Row <= 3))  //边界必须合格,且该地方无子
			&& ((1 <= Col) && (Col <= 3))
			&& (board[Row - 1][Col - 1] == ' '))
		{
			board[Row - 1][Col - 1] = '*'; //之所以Row - 1  Col - 1是考虑到玩家不一定是程序员,他不知道编程从0开始数
			break;
		}
		else
		{
			printf("请仔细坚持你的坐标位置,是否已经落子或坐标超界,然后重新输入坐标.\n");
			printf("请输入坐标:\n");
			scanf("%d%d", &Row, &Col);
		}
	}
	printf("下子成功!\n");
	Displayboard(board, row, col); // 无论是玩家还是电脑下子,都需要显示出下子内容
}

这个函数是用于玩家进行下棋的并且保证可以多次调用该函数

5.computer函数

void computer(char(*board)[3], int Row, int Col)
{
	srand(time(NULL));
	while (1)
	{
		int i = rand() % 3;
		int j = rand() % 3;
		if (board[i][j] == ' ')
		{
			board[i][j] = '#';//#代表电脑下子
			break;
		}
	}
	printf("电脑已下子:\n");
	Displayboard(board, row, col); //电脑下子后,显示棋盘
}

computer为实现玩家和电脑一对一进行游戏,随机的下,就让人捉摸不透

6.iswin函数

int Iswin(char(*board)[3], int Row, int Col)
{
	//怎么判断一方赢?? 横,竖,斜线只要都一样,则可以知道一方赢(全是空格除外)
	for (int i = 0; i < Row; i++) //每一行
	{
		if ((board[i][0] == board[i][1])
			&& (board[i][1] == board[i][2])
			&& (board[i][0] != ' '))
		{
			if (board[i][0] == '*') return 1;  //如果一行都是*,说明玩家胜利,否则电脑胜利
			return -1;
		}
	}

	for (int j = 0; j < Col; j++) //每一列
	{
		if ((board[0][j] == board[1][j])
			&& (board[1][j] == board[2][j])
			&& (board[0][j] != ' '))
		{
			if (board[0][j] == '*') return 1; //如果一列都是*,说明玩家胜利,否则电脑胜利
			return -1;
		}
	}

	if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜线
		|| ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[1][1] != ' ')))
	{
		if (board[1][1] == '*') return 1;
		return -1;
	}

	for (int i = 0; i < Row; i++)
	{
		for (int j = 0; j < Col; j++)
		{
			if (board[i][j] == ' ')
				return -2; //如果前三者情况都没有,只要目前棋盘上还剩下空余位置
						   //就说明不输不赢,需要继续对弈.返回[-1,1]之外的值就行
		}
	}

	return 0; //除去上面4种情况就是平局
}

玩家或者电脑下子后,需要判断双方有一方是否赢.

Iswin的作用就是判断是否有一方赢.

其中返回值1代表玩家胜利,返回值0代表平局,返回值-1代表电脑赢

判断胜利方法就是检查每行每列以及斜线是否有一样的,以及是否不输不赢


 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值