简易五子棋设计

废话不多说,上代码!初学者必看!!

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//宏定义行和列,可读性高,方便改参数
#define MAX_ROW 15
#define MAX_COL 15
char chess_board[MAX_ROW][MAX_COL];
int menu() //菜单
{
	printf("=========================\n");
	printf("1.开始游戏\n");
	printf("0.结束游戏\n");
	printf("=========================\n");
	printf("请输入您的选择:");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
void Init() 
{
	for (int row = 0; row < MAX_ROW; row++) 
	{
		for (int col = 0; col < MAX_COL; col++) 
		{
			chess_board[row][col] = ' ';//打印棋盘空白字符,相当于为棋盘初始化
		}
	}
	//设置随机种子-->时间戳,通过时间来确定随机值
	srand((unsigned int)time(0));
}

void Print() //打印棋盘
	//打印棋盘 
	{
		int i = 0;
		int j = 0;
		if (MAX_ROW < 10)
		{
			for (i = 0; i < MAX_ROW; i++)
			{
				printf(" %d  ", i + 1); //打印棋盘 x 轴坐标提示
			}
			printf("\n");
		}
		else
			for (i = 0; i < 9; i++)
			{
				printf(" %d  ", i + 1); //打印棋盘 x 轴坐标提示
			}
			for (i = 9; i < MAX_ROW; i++)
			{
				printf(" %d ", i + 1); //打印棋盘 x 轴坐标提示
			}
		printf("\n");


		for (j = 0; j < MAX_COL; j++)
		{
			printf("---|"); //打印第一行棋盘
		}
		printf("\n");

		for (i = 0; i < MAX_ROW; i++)
		{
			for (j = 0; j < MAX_COL; j++)
			{
				printf(" %c |", chess_board[i][j]); //打印竖标
			}
			printf(" %d ", i + 1); //打印棋盘 y 轴坐标提示
			printf("\n");

			for (j = 0; j < MAX_COL; j++)
			{
				printf("---|"); //打印横标
			}
			printf("\n");
		}
	}

void PlayerMove() //玩家移动
{
	printf("轮到您落子!\n");
		int row = 0;
		int col = 0;
	while (1) {
		printf("请输入落子位置的坐标(row,col):");
		scanf("%d,%d", &row, &col);
		while(getchar()!='\n')//防止输入有误,用来清空缓冲区
		scanf("%d,%d", &row, &col);
		//检查输入是否合法
		if (row < 1 || row >= MAX_ROW+1 ||col < 1 || col >= MAX_COL+1) //判断输入坐标是否越界
		{
			printf("坐标超出范围,请重新输入\n");
			continue;
		}
		if (chess_board[row-1][col-1] != ' ') 
		{
			printf("坐标已被占用!\n");
			continue;
		}
		chess_board[row-1][col-1] = 'x';
		break;
	}
	printf("您已落子!\n");
}

void ComputerMove() //电脑随机移动
{
	printf("电脑落子!\n");
	while (1) 
	{
		int row = rand() % 5;
		int col = rand() % 5;
		if (chess_board[row][col] != ' ') 
		{
			continue;
		}
		chess_board[row][col] = 'o';
		break;
	}
	printf("电脑落子完毕!\n");
	system("cls");//清屏
}


int IsFull() //如果棋盘满了,返回1,否则返回0,也就说这个函数是用来判断棋盘是否满格。
{
	for (int row = 0; row < MAX_ROW; ++row) 
	{
		for (int col = 0; col < MAX_COL; col++) 
		{
			if (chess_board[row][col] == ' ') 
			{
				//未满
				return 0;
			}
		}
	}
	return 1;
}
//返回值表示胜利者是谁
//x表示玩家胜利
//o表示电脑胜利
//q表示和棋
//' '表示未分胜负
char  CheckWinner() //判断胜负
{
	//判断输赢
	
		int i = 0;
		int j = 0;

		// 横线上五子连成一线,赢家产生
		for (i = 0; i < MAX_ROW; i++)
		{
			for (j = 0; j < MAX_COL - 4; j++)
			{
				if (chess_board[i][j] == chess_board[i][j + 1]
					&& chess_board[i][j + 1] == chess_board[i][j + 2]
					&& chess_board[i][j + 2] == chess_board[i][j + 3]
					&& chess_board[i][j + 3] == chess_board[i][j + 4]
					&& chess_board[i][j] != ' ')
				{
					return chess_board[i][j];
				}
			}
		}

		
		for (j = 0; j < MAX_COL; j++)// 竖线上五子连成一线,赢家产生
		{
			for (i = 0; i < MAX_ROW - 4; i++)
			{
				if (chess_board[i][j] == chess_board[i + 1][j]
					&& chess_board[i + 1][j] == chess_board[i + 2][j]
					&& chess_board[i + 2][j] == chess_board[i + 3][j]
					&& chess_board[i + 3][j] == chess_board[i + 4][j]
					&& chess_board[i][j] != ' ')
				{
					return chess_board[i][j];
				}
			}
		}

		
		for (i = 0; i < MAX_ROW - 4; i++)// 斜线上五子连成一线,赢家产生
		{
			if (chess_board[i][i] == chess_board[i + 1][i + 1]
				&& chess_board[i + 1][i + 1] == chess_board[i + 2][i + 2]
				&& chess_board[i + 2][i + 2] == chess_board[ + 3][i + 3]
				&& chess_board[i + 3][i + 3] == chess_board[i + 4][i + 4]
				&& chess_board[i][i] != ' ')
			{
				return chess_board[i][i];
			}

			if (chess_board[i][i + 4] == chess_board[i + 1][i + 3]
				&& chess_board[i + 1][i + 3] == chess_board[i + 2][i + 2]
				&& chess_board[i + 2][i + 2] == chess_board[i + 3][i + 1]
				&& chess_board[i + 3][i + 1] == chess_board[i + 4][i]
				&& chess_board[i][i + 4] != ' ')
			{
				return chess_board[i][i + 4];
			}
		}

		//棋盘满并且未分出胜负
		if (IsFull())
		{
			return'q';
		}
		return ' ';
	}
void game()
{
	
	Init();//1.初始化棋盘
	char winner = ' ';
	while (1) 
	{
		
		Print();// 2.打印棋盘
		
		PlayerMove();//3.玩家落子
		
		winner = CheckWinner();//4.检测胜负
		if (winner != ' ') {
			//胜负已分
			break;
		}
		//5.电脑落子
		ComputerMove();
		//6.检测胜负后返回到2继续循环
		winner = CheckWinner();
		if (winner != ' ') 
		{
			//胜负已分
			break;
		}
	}
	Print();
	if (winner == 'x') 
	{
		printf("你真牛,恭喜你赢了!\n");
	}
	else if (winner == 'o') {
		printf("这都输了,您不太适合这游戏!\n");
	}
	else if (winner == 'q') {
		printf("平局!您和电脑五五开!\n");
	}
	else {
		printf("代码好像bug了!\n");
	}
}




int main()//主函数
{
	while (1) //便于第二次游戏
	{
		int choice = menu();
		if (choice == 1) {
			game();
		}
		else if (choice == 0)
		{
			printf("good bye!");
			break;//跳出循环
		}
		else {
			printf("您的输入有误!");
		}
	}

	system("pause");//暂停屏幕
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相知-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值