C语言编写三子棋游戏详解及代码

C语言经典小游戏之三子棋(超详解释+源码) 关于C语言小游戏之三子棋的详解及源码 阅读详情

  学了C语言也有一段时间了,三子棋算是第一个自己编写的代码量上百行的程序。自己真正系统的写完之后,许多东西都有了一个明悟,收获颇丰。

  首先,想要写一个稍微正式一点的程序出来,函数必不可少,有了函数,那么相应的就需要函数的声明,如果涉及到的函数较多,一个个在主文件里声明就显得代码很繁琐,而且跨文件使用的时候就又需要进行声明。
  在这里,我把所有的 函数声明、定义常量,以及头文件统统打包到了"game.h"中,在后面的game.c,和test.c中都只需要一个
#include "game.h"的头文件即可电泳所有需要的头文件、函数声明、定义常量。可以精简代码量,而且更加美观简洁。

game.h

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdlib.h>

#define ROW 3
#define COL  3

void init_board(char arr[ ROW][COL ],int row,int col );
void print_board(char arr[ ROW][COL ], int row, int col);
void new_game(char arr[ROW][COL],int row,int col);
void palyer_move(char arr[ROW][COL],int row,int col);
void computer_move(char arr[ROW][COL], int row, int col);
int  is_win(char arr[ROW][COL], int row, int col);
int is_draw(char arr[ROW][COL], int row, int col);

  game.c是保证程序逻辑的一个源文件。
  主要思路有以下几个方面,
    0是打印棋盘
    1是玩家落子
    2是判断输赢
    3是电脑落子
    4是判断输赢
    然后 循环1-4,就形成了整个游戏的人机互动环节。
(人机互动环节就是这个程序的难点所在,对于小白而言)
  将思路理清之后,纯写代码就不难了。通篇写下来,基本不会报错。
  代码方面主要涉及到函数以及二维数组的各种理解应用。

game.c

#include "game.h"

void new_game(char arr[ROW][COL], int row, int col)
{
	print_board(arr, ROW, COL);
	while (1)
	{
		palyer_move(arr, ROW, COL);
		system("cls");
		print_board(arr, ROW, COL);
		if (is_win(arr, ROW, COL) == 1)
		{
			printf("恭喜你,你赢了!\n");
			printf("\n");
			system("pause");
			system("cls");
			break;
		}
		else if (is_win(arr, ROW, COL) == 0)
		{
			printf("你和电脑一样菜!");
			printf("\n");
			system("pause");
			system("cls");
			break;
		}
		computer_move(arr, ROW, COL);
		system("cls");
		print_board(arr, ROW, COL);
		if (is_win(arr, ROW, COL) == 1)
		{
			printf("菜的抠脚!");
			printf("\n");
			system("pause");
			system("cls");
			break;
		}
		else if (is_win(arr, ROW, COL) == 0)
		{
			printf("你和电脑一样菜!");
			printf("\n");
			system("pause");
			system("cls");
			break;
		}
	}
}

void init_board(char* arr, int row, int col)
{
	int sz = row*col;
	for (int i = 0; i < sz; i++)
	{
			*(arr+i) = ' ';
	}
}
void print_board(char arr[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 (j < col - 1)
				printf(" %c |", arr[i][j]);
			else
				printf(" %c \n", arr[i][j]);
		}
			if (i<row-1)
			printf("---+---+---\n");
		}
}
void palyer_move(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请输入要落子的坐标-》");
	scanf("%d%d", &x, &y);
	if (arr[x-1][y-1] ==' ')
	{
		arr[x-1][y-1] = '*';
	}
}
void computer_move(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}
	}
}
int  is_win(char arr[ROW][COL], int row, int col)//判断是否胜利
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i] != ' '
			|| arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' '
			|| arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] != ' '
			|| arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] != ' ')//判断条件这里写的不简洁。可以进一步精简;
			return 1;//胜利返回 1;
		}
	if (is_draw(arr, ROW, COL) == 0)
		return 0;//平局返回 0;
	else
		return -1;//继续返回-1;
}
int is_draw(char arr[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 (arr[i][j] == ' ')
				return -1;//继续返回 -1;
		}
	}
	return 0;//平局返回 0;
}

test.c

游戏的入口;
这里涉及到的东西没有很多
随机种子的设定
以及do while 内嵌 switch

#include "game.h"

void menu()
{
	printf("* * * * * * * * * * * * * * * * * * * * * \n\n");
	printf("  * * * * * * 1,开始游戏 * * * * * * * * \n\n");
	printf("  * * * * * * 2,结束游戏 * * * * * * * * \n\n");
	printf("* * * * * * * * * * * * * * * * * * * * * \n\n");
	printf("请输入您的选择—》");
}
void test()
{
	srand((unsigned int)time(NULL));
	do
	{
	menu();
	char arr[ROW][COL] = { ' ' };
	init_board(arr, ROW, COL);
	int input = 0;
	scanf("%d", &input);
		switch (input)
		{
		case 1: new_game(arr, ROW, COL);
				break;
			case 2: return;
				break;
			default: printf("您的输入有误,请重新输入!");
				break;
		}
	} while (1);
}

int main()
{
	test();
	return 0;
}

  三子棋游戏算是很简单的图形游戏,编写之前觉得头大如斗,写起来其实也就那么回事了,只要掌握了最基础语法,个关键字以及函数的理解及应用,再有就是理清逻辑,整理好思维,就能够写出来,这只是初窥门径,只要有了良好的编程思维、习惯,以及代码能力,一切困难都将会一一磨平。

三子棋C语言解析及完整代码 三子棋C语言解析及完整代码 前言一、实现三子棋的基本逻辑二、代码及讲解1.菜单2.创建棋盘3.初始化棋盘4.打印棋盘5.玩家下棋总结 前言 相信大家小时候都跟同桌玩过三子棋(井字棋),今天就来跟大家一起用C语言来实现这个小游戏。初学C语言的友友们也能看懂学会哦! 一、实现三子棋的基本逻辑 实现三子棋需要哪些步骤,不能一股脑直接敲代码,那样会 阅读详情

相关推荐

C语言入门小游戏—三子棋

三子棋又称为井字棋,相信大家都玩过这个小游戏,其规则就是哪一方先将相邻的的三枚棋子连在一起便获得胜那么今天就由我为大家讲解如何使用C语言实现简单的三子棋游戏吧。根据棋盘的样式,我们可以联想到三子棋棋盘应该有九个待输入数据(可存储),且形式为3*3,所以在这里。总结这是一个简单的三子棋游戏,还有部分功能可以实现,以及你自己的想法也可以添加进去;test.c测试三子棋游戏(实现游戏的大体逻辑和功能)平局的关键在于棋盘的空间状态,即判断棋盘是否满了。关键在于基础的函数应用和对二维数组的熟练使用。.........

p2141548684的博客 1492

【C语言】 -- 三子棋(代码+解析)

三子棋详解

Ljy_cx_21_4_3的博客 2776

从仿真到现实:BeamDojo双足机器人项目实战指南(附完整配置清单)

本文提供了一份基于BeamDojo项目的双足机器人从仿真训练到现实部署的完整实战指南。详细拆解了硬件选型(如宇树G1、Jetson Orin NX、Livox Mid-360)、Isaac Gym仿真环境搭建、强化学习训练技巧(如双评论家架构、课程学习)以及关键的Sim2Real迁移策略,旨在帮助开发者将前沿研究成果转化为可落地的工程实践。

hhh00的博客 875

【C语言】三子棋的代码实现

关于三子棋的解题思路和代码实现。

weixin_60371270的博客 1757

算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)

量化策略开发,高质量社群,交易思路分享等相关内容

松鼠宽客的博客 2538

Linux环境下使用线程方式操作UART读写功能

本文介绍Linux环境下使用线程方式操作UART的方法,实现了串口打开,关闭,发送数据,接收数据功能,还编写测试代码,验证该功能。

mftang的博客 2078

C语言实现三子棋(超详细)

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了。 编写三子棋,可以让我们学习如何组织一个较大的代码。

weixin_74082492的博客 1008

Visual Studio 2013 + Intel(R) Visual Fortran 安装教程

安装了好几遍,ivf都不能加载到vs中,中途放弃了vs,又改用codeblocks编译器,依然在写fortran的时候出现了各种问题,于是又放弃了codeblocks改回vs,总之是折腾了好久,终于装明白了ivf并且将fortran模板成功加载到vs中。 PS:一定要安装Intel Visual Fortran.Composer XE.2013-SP1,不要用Intel Visual Fortr...

Coco_wjy的博客 12万+

【用C语言轻松搞定】三子棋(超详细教程)

/ game.h#define ROW 3 // 行#define COL 3 // 列注:优点:如果后期需要改变棋盘的大小,则只需要在头文件这里改,不需要在整个程序中进行修改。define 定义的常量在句末不需要加分号。

Elena's Blog 1313

利用恒源云云端GPU高效训练YOLOv11模型全流程:从环境搭建到模型部署,让你摆脱硬件束缚

记住,云端GPU的核心优势是“弹性算力+一键环境”,只要把握好这一工具特性,再结合YOLOv11的高性能模型架构,你也能在计算机视觉领域快速落地项目。接下来,我们从工具准备到模型部署,一步步带你实现高效训练,真正帮你解决资源与效率的核心痛点。凭借其在目标检测、实例分割任务上的卓越性能,成为众多开发者的首选。据统计,使用云端GPU训练YOLOv11,在处理百万级数据集时,训练效率较本地普通GPU提升。在安防监控中,YOLOv11可实时检测人员、车辆异常行为,某园区采用该方案后,异常事件识别准确率达。

LXY_LOVE36的博客 213

16、TFT-LCD 1.8寸显示屏使用

1.8寸TFT-LCD显示屏,简单来说就是用来显示东西的显示器,跟之前的oled1315显示屏的作用是一样的,今天我们就来使用TFT显示屏显示一些内容。1.8寸TFT-LCD显示屏,简单来说就是用来显示东西的显示器,跟之前的oled1315显示屏的作用是一样的,今天我们就来使用TFT显示屏显示一些内容。这块显示屏在淘宝就可以买得到,驱动版本是ST7735S,这里圈住,一会要考的。

繁星点点~ 6768

C语言基础之——三子棋(详解)

c语言基础——三子棋

2303_78442132的博客 1618

OpenCV实例(八)车牌字符识别技术(三)汉字识别

相较于数字和英文字符的识别,汽车牌照中的汉字字符识别的难度更大,主要原因有以下4个方面:(1)字符笔画因切分误差导致非笔画或笔画流失。(2)汽车牌照被污染导致字符上出现污垢。(3)采集所得车辆图像分辨率低导致多笔画的汉字较难分辨。(4)车辆图像采集时所受光照影响的差异导致笔画较淡。综合汉字识别时的这些难点来看,很难被直接提取的是字符的局部特征。笔画作为最重要的特征而仅存在于汉字中,这由先验知识可知。一旦捺、横、竖、撇这些笔画特征被提取到,对于汉字字符识别的工作就完成了许多。

小幽余生不加糖 1650

【C语言】三子棋小游戏详解

在用c语言实现三子棋小游戏之前,我们应当了解三子棋的游戏规则:在九宫格棋盘上,哪一方三个棋子连成一线(一行或一列或对角线)即判定哪一方胜利。 以下为源代码: 1.首先打印出菜单。 void menu() { printf("**********************************\n"); printf("**********************************\n"); printf("***** 0.play *************\n"); pr

weixin_45177279的博客 6608

【PCIe 总线及设备入门学习专栏 6.2 -- PCIe VDM (Vendor Defined Messages)】

在PCIe协议中,Vendor Defined Messages (VDMs) 是一种允许厂商定义和传输特定功能的消息类型。这种机制扩展了标准 PCIe 消息的功能,可以用于实现供应商自定义的功能,例如固件更新、设备配置和诊断信息传输。PCIe VDM 是通过实现的,它遵循 PCIe 协议栈的结构,包括事务层、数据链路层和物理层。

CodingCos的博客 1895

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C语言】三子棋小游戏(详解)

前面讲了那么多的知识,今天来放松一下, 一起来一个简易的小游戏——三子棋: 1、设计思路 设计一个的棋盘 玩家自行输入坐标,电脑随机下棋 三种情况:玩家赢,电脑赢,平局 2、 代码实现 既然是小游戏,我们就可以设置一个简易的菜单,比如1为开始游戏,0为退出游戏:...

程序猿教你打篮球的博客 2140

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[C语言] [游戏] 三子棋

使用C语言写一个玩家与电脑PK的三子棋游戏 !(练习二维数组)!(超级详细的游戏设置思路和书写细节)!(看看8950字就很...)

博主学浅才疏,权当信笔涂鸦。嘿嘿,就算是记录我的学习历程吧,不过有时我会写得很细,但解题思路常常只有一种,别介意哈 ^ ^ (也许能学到一点点)。希望大家多来踩踩,顺便可以关注我,一起交流学习。 8996

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【C语言】三子棋游戏实现代码

C语言实现三子棋游戏代码

Renswc的博客 4844

C语言实现三子棋(超详解版本)

c语言实现三子棋超详解

weixin_67900732的博客 9252

C语言实现三子棋小游戏

本文章介绍如何通过C语言实现三子棋小游戏

2401_84689376的博客 3193

【初阶C语言】实现三子棋(详解+全部源码)

C语言实现三子棋,详解加全部源码

m0_75058342的博客 2169

C语言三子棋详解

是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。...

qq_65641647的博客 3042

C语言小游戏-三子棋详解

三子棋-C语言实现一、游戏介绍二、问题描述三、基本流程 一、游戏介绍 三子棋,是由一个3*3组成的棋盘构成的,只要将自己的三个棋子走成一条线,对方就算输了,即下的棋子只要达到一横行、一纵列或对角线全下满,游戏就成功了。但是如果对方达到一横行、一纵列或对角线全下满而玩家没有堵住的话,那么游戏就失败了。 二、问题描述 本篇文章实现的是用C语言实现三子棋的具体步骤,需要用到的相关知识有if语句、switch语句、while语句、do-while语句、函数、数组、C语言基础语法以及随机数的生成等。 三、基本流程

m0_53117341的博客 2290

C语言实现三子棋游戏(详解)

详细讲解C语言如何实现三子棋游戏

m0_70980326的博客 1631

【C语言】——三子棋小游戏的实现详解

要成功实现三子棋,要做好前期准备工作,在实际应用软件中,往往会有数以万计行代码甚至更多,为提升效率也为增加代码的可读性就要通过功能分解实现函数的模块化思想实现程序设计,这里我们将代码分别写到game.h,game.c,test.c里面去,game.h专门用来声明我们定义的函数,game.c里实现我们各个函数的功能,test.c来测试我们的游戏代码,这种分块思想也方便大家理解。这里我们将运用c语言中的二维数组,循坏控制语句,函数封装的内容,过程中为大家详细解释最后为大家附上整个游戏实现的代码,那就开始吧!

2301_78987066的博客 1551

如何用C语言来实现【三子棋游戏】

C语言初阶、实战项目、三子棋、编程语言

超烦豆先森 6423
上一篇: C语言和递归与非递归的优缺点以及选择浅析。
下一篇: C语言扫雷游戏详解及代码
EndOrBegin
博客等级 码龄7年 14粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值