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

C语言 三子棋(命令模式)游戏实现

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

C语言 三子棋(命令模式)游戏实现

目录

一.问题概括

二.基本流程及步骤

1.菜单界面

2.创建棋盘

3.棋盘初始化

4.打印棋盘

5.玩家下棋

6.电脑下棋

7.判断输赢

三.代码实现(总代码(详解))

一.问题描述

用c语言实现三子棋游戏

二.基本流程及步骤

写三子棋游戏前的逻辑构建

步骤

1.菜单界面

开始游戏1,退出游戏0

void menu()
{
	printf("**** 三子棋游戏 **n");
	printf("****** 1.play ****n");
	printf("****** 0.eixt ****n");
	printf("******************n");
}

 2.创建棋盘

使用二维数组3x3矩阵

#define ROW 3
#define COL 3

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

 3.棋盘初始化

//初始化棋盘功能实现
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}

4.打印棋盘

//打印棋盘功能的实现
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//int j = 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)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("___");
				if (j < col - 1  )
					printf("|");
			}
			printf("n");
		}
	}
	printf("n");
}

5.玩家下棋

玩家下棋需要在棋盘范围内

玩家需要在棋盘上的口地方下棋

如果输入坐标非法需要重新输入

//玩家下棋功能的实现
void PlayMove(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋:n");
	int x = 0;
	int y = 0;
	int flag = 1;
	while (flag)
	{
		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] = 'O';
				break;
			}
			else
			{
				printf("坐标已被占用,请重新选择位置!n");
			}
		}
		else
		{
			printf("输入的坐标非法,请重新输入!n");
		}
	}
}

 6电脑下棋

电脑下棋需要调用随机数srand((unsigned int)time(NULL));//设置随机数的位置

游戏规则与玩家下棋同理

//电脑下棋功能的实现
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:n");
	int x = 0;
	int y = 0;
	int flag = 1;
	while (flag)
	{
		x = rand() % row;
		y = rand() % col;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x][y] == ' ')
			{
				board[x][y] = 'X';
				break;
			}
			else
			{
				printf("坐标已被占用,请重新选择坐标位置!n");
			}
			//printf("n");
		}
		else
		{
			printf("坐标非法,请重新输入!n");
		}
		//printf("n");
	}
}

7.判断输赢

其中判断棋盘是否下满需要调用到IsFull函数

int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}
//判断输赢功能的实现
char IsWin(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][1] != ' ')
		{
			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];
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//判断平局
	//棋盘满了返回1,棋盘未满返回0
	int ret = IsFull(board, row, col);
	if (ret == 1)
	{
		return 'Q';
	}
	//继续
		return 'C';
}

三.代码实现

test.c

#define _CRT_SECURE_NO_WARNIGNS 1
#include "game.h"

void menu()
{
	printf("**** 三子棋游戏 **n");
	printf("****** 1.play ****n");
	printf("****** 0.eixt ****n");
	printf("******************n");
}
void game()
{
	char ret = 0;
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋牌
	DisplayBoard(board, ROW, COL);
	int flag = 1;
	while (flag)
	{
		PlayMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		
	}
	if (ret == 'O')
	{
		printf("玩家赢!n");
	}
	else if (ret == 'X')
	{
		printf("电脑赢!n");
	}
	else
	{
		printf("平局!n");
	}
	DisplayBoard(board, ROW, COL);
}
void test()
{
	srand((unsigned int)time(NULL));//设置随机数的位置
	int input = 0;
	do
	{
		menu();//打印游戏菜单
		printf("输入选择的数字:>");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏:n");
			game();
			break;
		case 0:
			printf("退出游戏!n");
			break;
		default:
			printf("选择错误!n");
			break;
		}
	} while (input);
}
int main(void)
{
	test();
	return 0;
}

game.c(各功能代码的实现)

#define _CRT_SECURE_NO_WARNIGNS 1
#include "game.h"

//初始化棋盘功能实现
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘功能的实现
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//int j = 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)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("___");
				if (j < col - 1  )
					printf("|");
			}
			printf("n");
		}
	}
	printf("n");
}

//玩家下棋功能的实现
void PlayMove(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋:n");
	int x = 0;
	int y = 0;
	int flag = 1;
	while (flag)
	{
		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] = 'O';
				break;
			}
			else
			{
				printf("坐标已被占用,请重新选择位置!n");
			}
		}
		else
		{
			printf("输入的坐标非法,请重新输入!n");
		}
	}
}
//电脑下棋功能的实现
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:n");
	int x = 0;
	int y = 0;
	int flag = 1;
	while (flag)
	{
		x = rand() % row;
		y = rand() % col;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x][y] == ' ')
			{
				board[x][y] = 'X';
				break;
			}
			else
			{
				printf("坐标已被占用,请重新选择坐标位置!n");
			}
			//printf("n");
		}
		else
		{
			printf("坐标非法,请重新输入!n");
		}
		//printf("n");
	}
}

int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}
//判断输赢功能的实现
char IsWin(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][1] != ' ')
		{
			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];
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//判断平局
	//棋盘满了返回1,棋盘未满返回0
	int ret = IsFull(board, row, col);
	if (ret == 1)
	{
		return 'Q';
	}
	//继续
		return 'C';
}

game.h(各函数声明)

#define _CRT_SECURE_NO_WARNIGNS 1
#include 
#include 
#include 

#define ROW 3
#define COL 3


//初始化棋牌
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char boardp[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);

 

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

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

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