栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

三子棋—c语言实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

三子棋—c语言实现

目录      一、功能描述      二、流程分析      三、具体步骤               1、菜单               2、创建棋盘               3、玩家落子               4、电脑落子               5、判断胜负               四、代码实现      五、演示过程
一、功能描述

用c语言实现三子棋游戏。


二、流程分析

1.创建游戏菜单栏,选择开始或者退出

2.用数组存放下棋的数据,初始换棋盘并且打印棋盘

3.玩家下棋

4.电脑下棋

5.判断输赢


三、具体步骤 1.创建菜单

选择1开始游戏,选择0退出游戏

void menu()
{

	printf("**************************n");
	printf("***********1.play*********n");
	printf("***********0.exit*********n");
	printf("**************************n");
}
2、创建棋盘

(1)存放下棋的数据

	char board[ROW][COL] = { 0 };

(2)初始化棋盘(棋盘每个位置为空格)

注意为了日后改进游戏,例如将3*3的棋盘改为5*5,可做如下声明

#define ROW 3
#define COL 3

只需在此处修改即可

(3)打印棋盘

void displayBoard1(char board[ROW][COL], int row, int col)
{
	
	int i = 0;
	for (i = 0; i < row; i++)
	{
		    //打印数据
			printf(" %c | %c | %c n", board[i][0], board[i][1], board[i][2]);
			if (i < row - 1)
			{
				//打印分割行
				printf("---|---|---n");
			}
	}
}

注:这种写法有缺陷。假如换成10*10的棋盘呢?这种写法只能打印3列

可做如下优化:

void print_Board(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)
		{
			for (j = 0; j < col; j++)
			{
					printf("---");
					if (j < col - 1)
					{
						printf("|");
					}
			}
			printf("n");
		}	
	}
}

这样方便打印各种大小的棋盘:例如10*10:

 


3、玩家下棋

数组的下标是从0开始的,但是非程序员的玩家不会意识到这点,因此我们应当保证玩家输入的数字是大于等于1的;玩家输入坐标,用✳表示玩家落子

注:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入

void play_Move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;	
	while (1)
	{
		printf("玩家请下棋n");
		printf("请输入坐标->:");
		scanf_s("%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("该位置已被占用,请重新输入");
			}
		}
		else
		{
			printf("输入有误,请重新输入!");
		}
	}
}

4.电脑下棋

电脑随机产生行列坐标,用#代码电脑落子
注意:
1.使用srand((unsigned int)time(0)),产生随机数
2.要在棋盘上空的地方下棋。

//电脑下棋
void cmp_Move(char board[ROW][COL], int row, int col)
{

	int x = 0;
	int y = 0;

	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] ==' ')
		{

			board[x][y] = '#';
			break;
		}
		else
		{
			printf("该位置已被占用,请重新输入");
		}

	}

}

五、判断输赢

分析:什么时候游戏结束?

编写一个判断输赢的函数,当玩家赢时返回✳,电脑赢返回#,棋盘满返回Q,否则继续游戏

char is_Win(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][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][1];//返回?玩家赢/#电脑赢
		}
	}
	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];//返回?玩家赢/#电脑赢
		}
	}
	//对角线1
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];//返回?玩家赢/#电脑赢
	}
	//对角线2
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];//返回?玩家赢/#电脑赢
	}
	//判断平局

	if (is_Full(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';

}

注:在该函数中包含一个判断棋盘是否满格的静态函数

//判断棋盘是否满了
static int is_Full(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

四、代码实现 (1)函数的声明
#include
#define ROW 3
#define COL 3


//初始化棋盘
void init_Board(char board[ROW][COL], int row, int col);

//打印棋盘
void print_Board(char board[ROW][COL], int row, int col);

//玩家下棋
void play_Move(char board[ROW][COL], int row, int col);

//电脑落子;
void cmp_Move(char board[ROW][COL], int row, int col);

//判断输赢
char is_Win(char board[ROW][COL], int row, int col);
(2)游戏的实现
#include"game.h"

//初始化棋盘
void init_Board(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++)
		{
			board[i][j] = ' ';
		}

	}

}

//打印棋盘

void print_Board(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)
		{
			for (j = 0; j < col; j++)
			{
					printf("---");
					if (j < col - 1)
					{
						printf("|");
					}
			}
			printf("n");
		}	
	}
}


//玩家下棋
void play_Move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;	
	while (1)
	{
		printf("玩家请下棋n");
		printf("请输入坐标->:");
		scanf_s("%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("该位置已被占用,请重新输入");
			}
		}
		else
		{
			printf("输入有误,请重新输入!");
		}
	}
}

//电脑下棋
void cmp_Move(char board[ROW][COL], int row, int col)
{

	int x = 0;
	int y = 0;

	while (1)
	{
		printf("电脑下棋n");
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] ==' ')
		{

			board[x][y] = '#';
			break;
		}
		else
		{
			printf("该位置已被占用,请重新输入");
		}

	}

}

//判断棋盘是否满了
static int is_Full(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}


//判断输赢
char is_Win(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][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][1];//返回?玩家赢/#电脑赢
		}
	}
	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];//返回?玩家赢/#电脑赢
		}
	}
	//对角线1
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];//返回?玩家赢/#电脑赢
	}
	//对角线2
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];//返回?玩家赢/#电脑赢
	}
	//判断平局

	if (is_Full(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';

}

(3)测试三子棋游戏的逻辑
#include
#include"game.h"
#include
#include

//菜单;
void menu()
{
	printf("*********************************n");
	printf("***************1.play************n");
	printf("***************0.exit************n");
	printf("*********************************n");
}


void game()
{
	char ret = 0;
     //定义一个数组存放棋盘数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	init_Board(board, ROW, COL);
	//打印棋盘
	print_Board(board, ROW, COL);
	while (1)
	{

		//玩家下棋
		play_Move(board, ROW, COL);
		print_Board(board, ROW, COL);
		//判断输赢
		ret = is_Win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//电脑下棋
		cmp_Move(board, ROW, COL);
		//打印棋盘
		print_Board(board, ROW, COL);
		//判断输赢
		ret = is_Win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢了n");

	}
	else if (ret == '#')
	{
		printf("电脑赢了n");
	}
	else
	{
		printf("平局n");
	}
}




int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do {
		menu();
		printf("请选->:");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("输入有误,请重新输入");
			break;
		}
	} while (input);

	return 0;
}

五、演示过程 (1)玩家赢

 

 

(2)电脑赢

 (3)平局

 

完结散花

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738830.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号