【C语言】三子棋游戏——超细教学

这篇具有很好参考价值的文章主要介绍了【C语言】三子棋游戏——超细教学。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:C语言

🔥该篇将结合之前的知识来实现 三子棋游戏。

🌟思路框架:

测试

通过迭代保证每次玩完游戏后可以再来一局或者退出。

【C语言】三子棋游戏——超细教学,c语言,c语言,游戏,学习,三子棋,数组

游戏

【C语言】三子棋游戏——超细教学,c语言,c语言,游戏,学习,三子棋,数组

博主将会对上图每一个板块进行函数实现。


🌟测试部分函数实现

  • 选择是否玩游戏

该板块的循环部分将会使用do while 循环来实现(保证一开始可以选择,运行完游戏部分后还可以继续选择)。

#include"game.h"

int main()
{
	int input = 0;
	do
	{
		menu();//菜单
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋游戏:\n");
			game();//游戏部分
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入非法,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

🌟游戏部分函数实现

在玩三子棋游戏中,每一步棋下完之后的状态需要保存,即需要数据的保存,所以可以创建一个3X3的数组,之后的数据操作就可以针对数组进行操作。

  • 菜单
void menu()
{
	printf("**************************\n");
	printf("********* 1.play *********\n");
	printf("********* 0.exit *********\n");
	printf("**************************\n");
}
  • 初始化棋盘

定义一个 3X3 数组后,我们将数组的元素都赋为 空格,这样就可以保证打印出来的效果是空的棋盘。

void BoardInit(char board[][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] = ' ';
		}
	}
}
  • 打印棋盘

需要产生的效果:
【C语言】三子棋游戏——超细教学,c语言,c语言,游戏,学习,三子棋,数组

实现上述的效果,只需要两步拆解:
1.【C语言】三子棋游戏——超细教学,c语言,c语言,游戏,学习,三子棋,数组
将这样的棋盘首先分为三部分,每一个部分由数据部分分割线部分构成,分割线部分在最后一部分没有(只需要加一个限制条件即可)

    int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印数据
		
		printf("\n");//打印后换行
		//打印分割线
		if (i < row - 1)//保证最后一部分不打印分割线
		{
	
		}
		printf("\n");//打印后换行
	}

【C语言】三子棋游戏——超细教学,c语言,c语言,游戏,学习,三子棋,数组
每个部分内部又可以划分为三部分,与第一次拆解逻辑一摸一样,注意第三部分没有 | 即可

void DisplayBoard(char board[][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)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}
  • 玩家下棋:

这里需要注意 检查玩家输入的坐标是否合法,以及该坐标下是否已经有棋子。而且,在写条件的时候,需要代入玩家视角,输入区间为 1 —— 3,但访问区间为 0——2 。

void PlayerMove(char board[][Col], int row, int col)
{
	printf("玩家下棋:\n");
	printf("请输入下棋的坐标,中间使用空格:>");
	while (1)
	{
		int x = 0;
		int y = 0;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >=1 && y <= col)//保证棋子能落入棋盘
		{
			if (board[x - 1][y - 1] == ' ')//该坐标下无棋子
			{
				board[x - 1][y - 1] = 'X';//落子
				break;
			}
			else
			{
				printf("该位置已有棋子,请重新输入:>");
			}
		}
		else
		{
			printf("输入非法,请重新输入:>");
		}
	}
}
  • 电脑下棋
    这里需要使用伪随机数,并且直接将范围锁定在 0——2,可以直接访问数组元素。完成该功能只需要判断 坐标下是否有棋子,若有棋子,则重新生成随机数。若要了解随机数,可以参考——随机数 。
void ComputerMove(char board[][Col], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}
  • 判断输赢

只需要从4种方向遍历数组,有符合获胜条件的直接返回数组元素,如果没有获胜,则需要判断是否棋盘已满(平局),除此之外就是未完成该局,继续下棋。

所以返回值 有四种情况:
电脑赢 —— 返回 ‘O’
玩家赢 —— 返回 ‘X’
平局 —— 返回 ‘P’
继续 —— 返回 ‘C’

int IsFull(char board[][Col], int row, int col)//判断是否已满,已满返回1
{
	//遍历
	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 IsWin(char board[][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][0];
		}
	}
	//从左至右遍历
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//左上至右下
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[1][1];
	}
	//左下至右上
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' ')
	{
		return board[1][1];
	}
	//平局
	if (IsFull(board,row,col))
	{
		return 'P';
	}
	return 'C';

}
  • 游戏逻辑部分

我们已经有了所有的功能函数,按照思路框架直接写出来即可。

void game()
{
	char board[Row][Col] = { 0 };
	BoardInit(board, Row, Col);
	DisplayBoard(board, Row, Col);
	

	//先手判断
	//假设玩家先手
	void(*Fir)(char board[][Col], int, int) = PlayerMove;
	void(*Sec)(char board[][Col], int, int) = ComputerMove;
	int flag = rand()%2; //1——玩家先手,0——电脑先手
	if (flag == 0)
	{
		printf("电脑先手\n");
		Fir = ComputerMove;
		Sec = PlayerMove;
	}
	else
	{
		printf("玩家先手\n");
	}
	//

	char ret = 0;
	while (1)
	{
		Fir(board, Row, Col);
		DisplayBoard(board, Row, Col);
		ret = IsWin(board, Row, Col);
		if (ret != 'C')
			break;
		Sec(board, Row, Col);
		DisplayBoard(board, Row, Col);
		ret = IsWin(board, Row, Col);
		if (ret != 'C')
			break;
	}
	if (ret == 'X')
	{
		printf("玩家获胜\n");
	}
	else if (ret == 'O')
	{
		printf("电脑获胜\n");
	}
	else
	{
		printf("平局\n");
	}
}

首先假设玩家是先手,如果flag =1,则照旧进行,如果flag = 0,就直接交换先后手。

🌟完整的代码:

test.c :

请记得设置随机数起点srand。

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//起点
	do
	{
		menu();//菜单
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋游戏:\n");
			game();//游戏部分
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入非法,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

game.h

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Row 3
#define Col 3
//菜单
void menu();
//游戏(逻辑)
void game();
//初始化棋盘
void BoardInit(char board[][Col], int row, int col);
//打印棋盘
void DisplayBoard(char board[][Col], int row, int col);
//玩家下棋
void PlayerMove(char board[][Col], int row, int col);
//电脑下棋
void ComputerMove(char board[][Col], int row, int col);
//判断输赢
char IsWin(char board[][Col], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

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

void BoardInit(char board[][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 DisplayBoard(char board[][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)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void PlayerMove(char board[][Col], int row, int col)
{
	printf("玩家下棋:\n");
	printf("请输入下棋的坐标,中间使用空格:>");
	while (1)
	{
		int x = 0;
		int y = 0;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >=1 && y <= col)//保证棋子能落入棋盘
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'X';//落子
				break;
			}
			else
			{
				printf("该位置已有棋子,请重新输入:>");
			}
		}
		else
		{
			printf("输入非法,请重新输入:>");
		}
	}
}

void ComputerMove(char board[][Col], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}

int IsFull(char board[][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 IsWin(char board[][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][0];
		}
	}
	//从左至右遍历
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//左上至右下
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[1][1];
	}
	//左下至右上
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' ')
	{
		return board[1][1];
	}
	//平局
	if (IsFull(board,row,col))
	{
		return 'P';
	}
	return 'C';

}

void game()
{
	char board[Row][Col] = { 0 };
	BoardInit(board, Row, Col);
	DisplayBoard(board, Row, Col);
	

	//先手判断
	//假设玩家先手
	void(*Fir)(char board[][Col], int, int) = PlayerMove;
	void(*Sec)(char board[][Col], int, int) = ComputerMove;
	int flag = rand()%2; //1——玩家先手,0——电脑先手
	if (flag == 0)
	{
		printf("电脑先手\n");
		Fir = ComputerMove;
		Sec = PlayerMove;
	}
	else
	{
		printf("玩家先手\n");
	}
	//

	char ret = 0;
	while (1)
	{
		Fir(board, Row, Col);
		DisplayBoard(board, Row, Col);
		ret = IsWin(board, Row, Col);
		if (ret != 'C')
			break;
		Sec(board, Row, Col);
		DisplayBoard(board, Row, Col);
		ret = IsWin(board, Row, Col);
		if (ret != 'C')
			break;
	}
	if (ret == 'X')
	{
		printf("玩家获胜\n");
	}
	else if (ret == 'O')
	{
		printf("电脑获胜\n");
	}
	else
	{
		printf("平局\n");
	}
}

❤️ 结语

文章到这里就结束了,如果对你有帮助,你的点赞将会是我的最大动力,如果大家有什么问题或者不同的见解,欢迎大家的留言~文章来源地址https://www.toymoban.com/news/detail-665017.html

到了这里,关于【C语言】三子棋游戏——超细教学的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言之三子棋游戏

    #define _CRT_SECURE_NO_WARNINGS 1 //测试三子棋 #include\\\"game.h\\\" void menu() {          printf(\\\"**********************************n\\\");     printf(\\\"*****  1.play    0.exit       ****n\\\");     printf(\\\"**********************************n\\\"); } void game()//游戏算法实现 {     char ret = 0;     //数组-存放走出的棋盘信息

    2024年01月21日
    浏览(38)
  • C语言三子棋小游戏

    哈喽,大家好,今天我们要利用之前所学习的C语言知识来写一个三子棋小游戏。 目录 1.游戏 2.函数部分 2.1.菜单 2.2.初始化棋盘 2.3.打印棋盘 2.4.玩家下棋 2.5.电脑下棋 2.6.判断输赢 2.7.判断棋盘是否已满 3.完整代码展示 今天我们写的代码分为三个文件来写,分别是: game.h 用来

    2024年02月04日
    浏览(41)
  • C语言:三子棋小游戏

    目标很简单:实现一个 三子棋小游戏。三子棋大家都玩过,规则就不提及了。本博文中实现的三子棋在对局中,电脑落子是随机的,不具有智能性,玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一个简单的三子棋游戏。 想要实现一个小游戏,第一件事就是

    2024年02月09日
    浏览(56)
  • 三子棋小游戏---(C语言)

    目录 前言: 1.菜单的打印 2.三子棋构思 3.实现三子棋 3.1使用宏的方式定义数组 3.2打印棋盘 3.3玩家下棋 3.4电脑随机下棋 3.5判断结局 4.源码 4.1test.c 4.2game.c  4.3game.h  ❤博主CSDN:啊苏要学习   ▶专栏分类:C语言◀   C语言的学习,是为我们今后学习其它语言打好基础,C生万物

    2024年02月03日
    浏览(80)
  • C语言之三子棋游戏(棋盘)

    #define _CRT_SECURE_NO_WARNINGS 1 //测试三子棋 #include\\\"game.h\\\" void menu() {          printf(\\\"**********************************n\\\");     printf(\\\"*****  1.play    0.exit       ****n\\\");     printf(\\\"**********************************n\\\"); } void game()//游戏实现 {     //数组-存放走出的棋盘信息     char board[ROW][C

    2024年01月19日
    浏览(84)
  • C语言之三子棋游戏实现篇

    目录 主函数test.c 菜单函数 选择实现 游戏函数 (函数调用) 打印棋盘数据 打印展示棋盘  玩家下棋 电脑下棋 判断输赢  循环 test.c总代码  头文件函数声明game.h 头文件的包含 游戏符号声明 游戏函数声明 game.h总代码  游戏函数game.c  打印棋盘数据InitBoard 打印展示棋盘Dis

    2024年02月11日
    浏览(36)
  • 震惊!有人使用C语言实现三子棋游戏~

    大家好,欢迎观看Mr.kanglong的CSDN博客,今天和大家讨论的是如何使用C语言来实现三子棋游戏。相信大家儿时或多或少玩过三子棋游戏,那么怎么用C语言实现这样一个游戏呢?且听亢龙娓娓道来~ 目录 三子棋介绍  游戏效果  实现代码 game.h game.c test.c 三子棋是一种民间传统游

    2024年02月13日
    浏览(30)
  • 用C语言实现简单的三子棋游戏

    目录 1 - 模块简介 2 - test.c 3 - game.c 4 - game.h test.c:测试游戏逻辑 game.c: 函数的实现 game.h:函数的声明 好久没写博客啦,以后会花更多时间写博客的,感谢各位大佬支持啦!!!

    2024年01月21日
    浏览(26)
  • 【C】C语言实现三子棋小游戏

    今天带大家用C语言来实现我们的一个小游戏—— 三子棋 也是用我们之前所学的知识学实现一些有价值的东西。 在开始之前要跟大家声明一下我们这个项目需要三个文件: game.h —— 主要来声明和游戏相关的函数 game.c —— 主要来实现和游戏相关的函数 test.c —— 主函数所在

    2024年02月11日
    浏览(50)
  • 基于C语言 --- 自己写一个三子棋小游戏

    前言: 游戏规则: (1)、在打印的数组棋盘里,输入坐标,下棋。 (2)、坐标格式:x(空格) y (3)、x横坐标,y竖坐标 (4)、连成三个棋子为一线则判定胜利 如图所示 : 采用模块化编写 : arr_game1.c执行主要逻辑程序 arr_game1.h存放头文件或函数声明等程序 arr_main.c放主函数逻辑程

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包