C语言实现连珠棋(三子棋、五子棋)

棋盘大小和游戏规则

#define ROW 5	//棋盘的行数
#define COL 5	//棋盘的列数
#define NUM 3	//几颗子相连能赢,如NUM为3,则为三指棋

我们把棋盘看成一个二维数组,其中ROW为棋盘的行数,COL为棋盘的列数,它们两个规定了棋盘的大小。
NUM规定了几颗连续的棋子相连能赢,如果NUM为3,则游戏为为三子棋;NUM为5,则游戏为五子棋

初始化棋盘和打印棋盘

//初始化棋盘
void initboard(int board[][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘
void printboard(int board[][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

由于在初始化棋盘时都置为空格,打印出来时无法辨别,所以我们需要打印一些分割线来区别。下图为5*5棋盘
在这里插入图片描述

玩家下棋

//玩家下棋
void PlayerMove(int board[][COL], int row, int col)
{
	int r = 0, c = 0;
	while (1)
	{
		printf("请输入要下的位置的行和列:");
		scanf("%d %d", &r, &c);
		if (r <= row && r>0 && c <= col && c>0)
		{
			if (board[r - 1][c - 1] == ' ')
			{
				board[r - 1][c - 1] = '*';
				break;
			}
			else
			{
				printf("该位置已经下过棋了\n");
			}
		}
		else
		{
			printf("输入错误:\n");
		}
	}
	printboard(board, row, col);
}

玩家下棋就是把二维数组的指定行列元素替换为‘*’就好了,当然,我们要注意我们输入的行列数不能超过棋盘的行列数,和二维数组指定元素没有被占有。

电脑下棋

//电脑下棋
void ConputerMove(int board[][COL], int row, int col)
{
	while (1)
	{
		int r = rand() % row;
		int c = rand() % col;
		if (board[r][c] == ' ')
		{
			board[r][c] = '#';
			break;
		}
	}
	printboard(board, row, col);
}

因为电脑下棋是随机的,所以我们需要两个随机数在分别取模棋盘行数和列数代表电脑下下棋的坐标。

判断输赢

判断输赢的思想也比较简单,把所有可能赢的结果遍历一遍就好了,如果遍历过程中有出现连续的五颗棋子相同就代表有一方获胜,否则就平局。

//判断输赢:玩家赢返回1,电脑赢返回2,平局返回0
int IsWin(int board[][COL], int row, int col,int num)
{
	//count记录玩家每相邻NUM个元素中玩家所下的棋数
	//sum  记录玩家每相邻NUM个元素中电脑所下的棋数
	int count=0,sum=0;
	//横
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j <= col - num;j++)
		{
			count=0,sum=0;
			for(int k=0;k<num;k++)
			{
				if (board[i][k + j] == '*')
				{
					count++;
				}
				else if (board[i][k + j] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//竖
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j <= col - num; j++)
		{
			count = 0, sum = 0;
			for (int k = 0; k < num; k++)
			{
				if (board[k+j][i] == '*')
				{
					count++;
				}
				else if (board[k+j][i] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//斜
	for (int i = 0; i <= row - num; i++)
	{
		count = 0, sum = 0;
		for (int j = 0; j <= row - num; j++)
		{
			int count = 0, sum = 0;
			for (int k = 0; k < num; k++)
			{
				if (board[i + k][j + k] == '*')
				{
					count++;
				}
				else if (board[i + k][j + k] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//反斜
	for (int i = row-num; i <= row; i++)
	{
		count = 0, sum = 0;
		for (int j = 0; j <= row - num; j++)
		{
			int count = 0, sum = 0;
			for (int k = 0; k < num; k++)
			{
				if (board[i - k][j + k] == '*')
				{
					count++;				}
				else if (board[i - k][j + k] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//判断棋盘是否下满
	int k = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				k = 1;
			}
		}
	}
	if (k == 0)
	{
		return 0;
	}
}

实现结果

在这里插入图片描述

完整代码

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

#define ROW 5	//棋盘的行数
#define COL 5	//棋盘的列数
#define NUM 3	//几颗子相连能赢,如NUM为3,则为三指棋

void menu()
{
	printf("**********************\n");
	printf("***** 0、退出游戏 ****\n");
	printf("***** 1、开始游戏 ****\n");
	printf("**********************\n");
}
//初始化棋盘
void initboard(int board[][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘
void printboard(int board[][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}
//玩家下棋
void PlayerMove(int board[][COL], int row, int col)
{
	int r = 0, c = 0;
	while (1)
	{
		printf("请输入要下的位置的行和列:");
		scanf("%d %d", &r, &c);
		if (r <= row && r>0 && c <= col && c>0)
		{
			if (board[r - 1][c - 1] == ' ')
			{
				board[r - 1][c - 1] = '*';
				break;
			}
			else
			{
				printf("该位置已经下过棋了\n");
			}
		}
		else
		{
			printf("输入错误:\n");
		}
	}
	printboard(board, row, col);
}
//电脑下棋
void ConputerMove(int board[][COL], int row, int col)
{
	while (1)
	{
		int r = rand() % row;
		int c = rand() % col;
		if (board[r][c] == ' ')
		{
			board[r][c] = '#';
			break;
		}
	}
	printboard(board, row, col);
}
//判断输赢:玩家赢返回1,电脑赢返回2,平局返回0
int IsWin(int board[][COL], int row, int col,int num)
{
	//count记录玩家每相邻NUM个元素中玩家所下的棋数
	//sum  记录玩家每相邻NUM个元素中电脑所下的棋数
	int count=0,sum=0;
	//横
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j <= col - num;j++)
		{
			count=0,sum=0;
			for(int k=0;k<num;k++)
			{
				if (board[i][k + j] == '*')
				{
					count++;
				}
				else if (board[i][k + j] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//竖
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j <= col - num; j++)
		{
			count = 0, sum = 0;
			for (int k = 0; k < num; k++)
			{
				if (board[k+j][i] == '*')
				{
					count++;
				}
				else if (board[k+j][i] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//斜
	for (int i = 0; i <= row - num; i++)
	{
		count = 0, sum = 0;
		for (int j = 0; j <= row - num; j++)
		{
			int count = 0, sum = 0;
			for (int k = 0; k < num; k++)
			{
				if (board[i + k][j + k] == '*')
				{
					count++;
				}
				else if (board[i + k][j + k] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//反斜
	for (int i = row-num; i <= row; i++)
	{
		count = 0, sum = 0;
		for (int j = 0; j <= row - num; j++)
		{
			int count = 0, sum = 0;
			for (int k = 0; k < num; k++)
			{
				if (board[i - k][j + k] == '*')
				{
					count++;				}
				else if (board[i - k][j + k] == '#')
				{
					sum++;
				}
			}
			if (count == num)
			{
				return 1;
			}
			if (sum == num)
			{
				return 2;
			}
		}
	}
	//判断棋盘是否下满
	int k = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				k = 1;
			}
		}
	}
	if (k == 0)
	{
		return 0;
	}
}
void game()
{
	int board[ROW][COL] = { 0 };
	initboard(board, ROW, COL);
	printboard(board, ROW, COL);
	RAND_MAX;
	while (1)
	{
		printf("玩家下棋:\n");
		PlayerMove(board, ROW, COL);
		int k = IsWin(board, ROW, COL, NUM);
		if (k == 1)
		{
			printf("玩家赢了\n");
			return;
		}
		else if (k == 0)
		{
			printf("平局\n");
			return;
		}
		printf("电脑下棋:\n");
		ConputerMove(board, ROW, COL);
		k = IsWin(board, ROW, COL, NUM);
		if (k == 2)
		{
			printf("电脑赢了\n");
			return;
		}
		else if (k == 0)
		{
			printf("平局\n");
			return;
		}
	}
}
int main()
{
	int input = 0;
	do {
		menu();
		printf("请选择> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
			printf("开始游戏\n");
			srand((unsigned int)time(NULL));
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏");
			break;
		}
		default:
		{
			printf("输入错误");
			break;
		}
		}
	} while (input);
	return 0;
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LQB木杉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值