三子棋小游戏(可改棋盘大小)

大家好!学习了那么久的c语言,我们都希望自己能做出一些成果来,而实现一些小游戏无疑是最先想到的选择。

今天我给大家介绍一个充满趣味和挑战的井字棋小游戏——三子棋。它是一款简单而又深思熟虑的游戏,通过在棋盘上放置符号,让先连成相同符号的三个一线,战胜对手。让我们一起来看看三子棋的规则、策略和实现吧! 

在此处贴出各个函数对应位置,方便各位去进行查找

目录

一、三子棋小游戏的规则

二、三子棋小游戏重要函数的实现

1.菜单打印

2.棋盘初始化

3.棋盘打印

4.玩家下棋

5.电脑下棋

6.是否获胜判断

三.全体代码并进行游戏演示:


一、三子棋小游戏的规则

三子棋,又称井字棋,是一个两人对弈的棋盘游戏。游戏棋盘是一个3x3的方格矩阵,每个玩家轮流在空白的方格中放置自己的符号(通常是"X"和"O")。先连成三个相同符号的一线(横、竖或斜线),即可获胜。

下面是一个示意图,帮助我们更好地理解三子棋的规则:


二、三子棋小游戏重要函数的实现

1.我们首先打印游戏菜单

void menu()//打印菜单的函数
{
	printf("*********************\n");
	printf("******* 1. play *****\n");
	printf("******* 0. exit *****\n");
	printf("*********************\n");
}

效果如下:

2.初始化棋盘 我们可以使用一个3x3的二维数组来表示棋盘,初始值都设置为空格。可以定义一个函数来创建并初始化棋盘

void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数
{
	for (int i = 0; i < a; i++)
	{
		for (int j = 0; j < b; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

3.打印棋盘 定义一个函数来打印当前的棋盘状态(该代码可随意改变棋盘大小)

void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数
{
	
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", arr[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		for (int k = 0; k < col; k++)
		{
			printf("---");
			if (k < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
	}
}

4.提示玩家输入位置 定义一个函数来提示玩家输入要下棋的位置 ,同时检查输入的位置是否合法 定义一个函数来检查玩家输入的位置是否合法,即行和列的值都在0到2之间,并且该位置还没有被其他玩家占据

void Player(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
           printf("玩家进行下棋,请输入棋子所处坐标 \n");
	    int x, y;
	    scanf("%d %d", &x, &y);
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
	{
		if (arr[x - 1][y - 1] == ' ')
		{
			arr[x - 1][y - 1] = 'o';
			break;
		}
		printf("该位置已被占用,请输入其他坐标\n");
		
	}
	else
	{
		printf("输入错误,请重新输入");
	}
}
}

5.电脑进行下棋(因为是初学者,没怎么学过算法,暂时使用随机数,日后会去学习使用miniMax算法进行改善),同理也要进行是否已被占用的判断 

void Computer(char arr[ROW][COL], int row, int col)
{
	printf("电脑下棋\n");
	while (1)
	{
		int x, y;
	    x = rand() % row;
	    y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'x';
			break;
		}
	}
}

6.判断是否有玩家获胜 定义一个函数来判断是否有玩家连成一条线。我们需要检查每一行、每一列以及对角线上的棋子是否相同,如果有相同的棋子,则判定该玩家获胜,o表示玩家赢,x是电脑赢,c是平局,k是继续 。返回相应的字符更为方便

char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
	for (int i = 0; i < row; i++)//判断行
	{
		if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ')
		{
			return arr[i][0];
		}
		
	}
	for (int j = 0; j < col; j++)//判断列
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
		{
			return arr[0][j];
		}
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
	{
		return arr[0][0];
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
	{
		return arr[0][2];
	}
	if (isFull(arr,row,col))
	{
		return 'c';
	}
	return 'k';
}

三.全体代码并进行游戏演示:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3//定义行和列均为3

void menu()//打印菜单的函数
{
	printf("*********************\n");
	printf("******* 1. play *****\n");
	printf("******* 0. exit *****\n");
	printf("*********************\n");
}


void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数
{
	for (int i = 0; i < a; i++)
	{
		for (int j = 0; j < b; j++)
		{
			arr[i][j] = ' ';
		}
	}
}


void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数
{
	
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", arr[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		for (int k = 0; k < col; k++)
		{
			printf("---");
			if (k < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
	}
}


void Player(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
           printf("玩家进行下棋,请输入棋子所处坐标 \n");
	    int x, y;
	    scanf("%d %d", &x, &y);
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
	{
		if (arr[x - 1][y - 1] == ' ')
		{
			arr[x - 1][y - 1] = 'o';
			break;
		}
		printf("该位置已被占用,请输入其他坐标\n");
		
	}
	else
	{
		printf("输入错误,请重新输入");
	}
}
}


void Computer(char arr[ROW][COL], int row, int col)
{
	printf("电脑下棋\n");
	while (1)
	{
		int x, y;
	    x = rand() % row;
	    y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'x';
			break;
		}
	}
}


int isFull(char arr[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}


char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
	for (int i = 0; i < row; i++)//判断行
	{
		if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ')
		{
			return arr[i][0];
		}
		
	}
	for (int j = 0; j < col; j++)//判断列
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
		{
			return arr[0][j];
		}
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
	{
		return arr[0][0];
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
	{
		return arr[0][2];
	}
	if (isFull(arr,row,col))
	{
		return 'c';
	}
	return 'k';
}


void game()
{
	char win ;
	char board[ROW][COL]; //我们使用一个二维数组board来表示棋盘,每个格子可以存放一个字符,初始值为空格
	initBoard(board, ROW, COL);//initBoard函数用来初始化棋盘
	printBoard(board, ROW, COL);//printBoard函数用来打印棋盘
	//开始下棋
	while (1)
	{
		Player(board, ROW, COL);//玩家下棋
		printBoard(board, ROW, COL);
		win=Iswin(board, ROW, COL);//o表示玩家赢,x是电脑赢,c是平局,k是继续
		if (win != 'k')
		{
			break;
		}
		Computer(board, ROW, COL); //电脑下棋
		printBoard(board, ROW, COL);
		if (win != 'k')
		{
			break;
		}
	}
	if (win == 'o')
	{
		printf("玩家获胜\n");
	}
	else if (win == 'x')
	{
		printf("电脑获胜\n");
	}
	else
	{
		printf("平局\n");
	}
	
}






int main()
{
	int a = 1;
	srand((unsigned int)time(NULL));
	while (a)
	{
		printf("请选择:\n");
		menu();
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			game();//开始游戏
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
	}
	return 0;
}


 三子棋小游戏是一款简单而又富有挑战性的游戏,它不仅能够帮助我们放松心情,还能够锻炼我们的思维能力。通过这篇文章的介绍,我们了解了三子棋小游戏的规则和实现方法。希望大家能够尝试玩一玩这款游戏,享受其中的乐趣和挑战!

今天的分享先到这里,感谢大家!!!

猜你喜欢

转载自blog.csdn.net/qq_74415153/article/details/131941389