三子棋 —— 利用C语言数组实现的简单游戏

C语言趣味小游戏——扫雷(详解版) ​全篇无任何废话,本文的解释大多数都在代码段中,所以一定要看代码,边看边学边理解。这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容可以先学习一下比扫雷还简单的猜数字和三子棋C语言趣味小游戏——猜数字​C语言趣味小游戏——三子棋1:do while 结构方便玩完一盘继续,也方便打印简易的菜单**2:实现游戏,用了两个雷盘 , 并且用char数组来存储游戏的数据 ** 阅读详情

1. 前言

进入C语言初阶的学习已经有一段时间,已经能完成简单的分支循环语句,学习了函数和数组的运用,学习了递归等函数,已经能具备了实现一款小游戏的时候,相信经过反复咀嚼,能很快理解和完成这个游戏!
作为草稿纸上常出现的小游戏,三子棋的逻辑可谓是非常简单了,只需要玩家走一步、电脑走一步,并在八种可能获胜结果中比对就行了,下面让我们一起来看看三子棋的实现。

1.1 三子棋游戏规则

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

三子棋

2. 正文

本程序员一共三个文件

  • “tast.c” —— 存储文件主函数,和game游戏主要逻辑
  • “game.c” —— 存储game函数里出现函数实现方法,对game里的方法进行封装方便直接调用
  • “tast.h” —— 存放头文件及其函数声明和宏,方便前两个函数引用

2.1 主文件部分 (tast.c)

主文件的负责程序的主要逻辑,包括了,main函数,game函数,menu函数等,主要负责给整个程序一个框架,建立了整个应用最初始的逻辑体系。

2.1.1 主函数部分(main)

主函数部分的逻辑为进入循环后先打印菜单,然后选择1则是进入游戏函数,选择0则跳出循环结束程序,选其他的提示输入错误。

在这里插入图片描述

以下是实现的函数部分

//menu为菜单答应函数
void menu()
{
	printf("************************\n");
	printf("*******  1.play  *******\n");
	printf("*******  2.exit  *******\n");
	printf("************************\n");
}

int main()
{  
	int input = 0;
	printf("欢迎进入三子棋游戏\n");
	
	do 
	{
		menu();//打印菜单 //1.play  2.exit
		
		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;
}
2.1.2 游戏函数部分(game)

游戏函数部分里主要是写出大框架,调用相对应的函数,完成了初始化,下棋,获胜判定等一系列逻辑判断。

在这里插入图片描述

2.2 头文件部分 (tast.h)

这个头文件是自己建立的,目的就是在主函数源文件(test.c)和功能实现函数(game.c)中搭起一座沟通的桥梁,方便这两个文件取用

在这里插入图片描述

2.3 功能函数部分

功能函数由五个函数组成,每个函数都有自己对应的功能,具体实现了初始化棋盘,打印棋盘,人下棋,电脑下棋,判断输赢的功能,使得主函数调用便可使用,不用每次都用相同的功能都得重新写。

2.3.1 初始化棋盘

在这里插入图片描述

此处有些类容与后面雷同,就不后面就不做解释了

2.3.2 打印棋盘函数

在这里插入图片描述

2.3.3 玩家落子函数

在这里插入图片描述

2.3.3 电脑落子函数

在这里插入图片描述

2.3.3 检查输赢的函数

在这里插入图片描述

3. 效果展示

在这里插入图片描述
如同三种情况无一缺席,我们的代码基本可以满足需求

3.1 代码展示

3.1.1主函数代码
#define _CRT_SECURE_NO_WARNINGS 1

#include "test.h"


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

void game()//游戏主体 通过调用函数实现
{
	char board[HANG][LIE] = {0};
	//初始化棋盘
	InitBoard(board, HANG, LIE);
	srand((unsigned int)time(NULL));

	//打印棋盘
	//DisplayBoard(board, HANG, LIE);

	char ret = 0;
	while(1){
		//玩家下棋
		//DisplayBoard(board, HANG, LIE);
		PlayerMove(board, HANG, LIE);
		ret = IsWin(board, HANG, LIE);
		if (ret != 'C')
			break;
		//电脑下棋
		ComputerMove(board, HANG, LIE);
		//DisplayBoard(board, HANG, LIE);
		ret = IsWin(board, HANG, LIE);
		if (ret != 'C')
			break;
	} 

	if (ret == '*')
	{
		printf("玩家获胜\n");
	}
	if (ret == '#')
	{
		printf("电脑获胜\n");
	}
	if(ret == 'Q') 
	{
		printf("平局\n");
	}
}

int main()
{  
	int input = 0;
	printf("欢迎进入三子棋游戏\n");

	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;
}
3.1.2头文件代码
#pragma once

#include<stdio.h>

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

#include <windows.h>
#define HANG 3
#define LIE  3

void InitBoard(char board[HANG][LIE], int hang, int lie);
void DisplayBoard(char board[HANG][LIE], int hang, int lie);
void PlayerMove(char board[HANG][LIE], int hang, int lie);
void ComputerMove(char board[HANG][LIE], int hang, int lie);


//玩家 *
//电脑 #
//平局 Q
//继续 c
char IsWin(char board[HANG][LIE], int hang, int lie);
3.1.2功能函数代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"


//初始化棋盘
void InitBoard(char board[HANG][LIE] ,int hang ,int lie )
{
	for (int h = 0; h <= hang - 1; h++) {
		for (int l = 0; l <= lie - 1; l++) {
			board[h][l] = ' ';
		}
	}
}

//打印棋盘
void DisplayBoard(char board[HANG][LIE], int hang, int lie)
{
	for (int h = 0; h <= hang - 1; h++) 
	{
		for (int l = 0; l <= lie - 1; l++) 
		{
			printf(" %c ",board[h][l]);
			if (l < lie-1)//筛选 最后一行列不打印  |
			printf("|");
		}
		printf("\n");
		if (h < hang - 1)
		{
			for (int i = 1; i <= lie; i++)
			{
				printf("---");
				if (i <= lie - 1)
				printf("|");
			}
			printf("\n");
		}
	}
}

void PlayerMove(char board[HANG][LIE], int hang, int lie)
{
	int x = 0;
	int y = 0;
	while (1)
	{

		DisplayBoard(board, HANG, LIE);
		printf("请落子");
		scanf("%d %d", &x, &y);
		
		if (x >= 1 && x <= hang && y >= 1 && y <= lie) {
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该位子以落子,请从新落子\n");
			}
		}
		else
		{
			printf("坐标不合法,重新输入\n");
		}
	}
	system("cls");//刷新
}


void ComputerMove(char board[HANG][LIE], int hang, int lie)
{

	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	
	while (1)
	{

		int x = rand() % hang;
		int y = rand() % lie;
		if (board[x][y] == ' ') 
		{
			board[x][y] = '#';
			break;
		}
	}
	system("cls");//刷新
}

char IsWin(char board[HANG][LIE], int hang, int lie)
{
	for (int h = 0; h < hang; h++) {
		if (board[h][0] == board[h][1] && board[h][1] == board[h][2] && board[h][0] != ' ')
		{
			return board[h][0];
		}
		if (board[0][h] == board[1][h] && board[1][h] == board[2][h] && board[0][h] != ' ')
		{
			return board[h][0];
		}
	}
	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[1][1] != ' ')
	{
		return board[1][1];
	}

	for (int h = 0; h < hang; h++) {
		for (int l = 0; l < lie; l++) {
			if (board[h][l] == ' ')
			{
				return 'C';
			}
		}
	}

	return 'Q';
}

4. 一下GPT为我代码写的总结

这段代码实现了一个简单的三子棋游戏。以下是对代码的总结:

主函数(main):程序的入口,通过调用其他函数实现游戏的开始、进行和结束。在一个循环中,根据用户的选择调用不同的函数。

菜单函数(menu):打印游戏菜单,供用户选择开始游戏或退出游戏。

游戏函数(game):游戏的主体部分,通过调用其他函数来实现游戏的进行。首先初始化棋盘,然后进入一个循环,在每轮循环中玩家和电脑交替下棋,直到有玩家获胜或平局。

功能函数头文件(test.h):声明了游戏中使用的函数和常量。

初始化棋盘函数(InitBoard):将棋盘数组中的所有元素初始化为空格。

打印棋盘函数(DisplayBoard):以可视化的形式打印当前的棋盘状态。

玩家下棋函数(PlayerMove):提示玩家输入落子位置的坐标,判断输入的合法性,然后在棋盘上相应位置落下玩家的棋子。

电脑下棋函数(ComputerMove):通过随机生成坐标的方式,选择一个合法的位置,在棋盘上落下电脑的棋子。

判断胜负函数(IsWin):根据当前棋盘状态判断游戏是否结束,返回相应的结果。检查每行、每列和对角线上是否有连续的三个相同的棋子。

代码的逻辑清晰,通过不同的函数实现了游戏的各个功能模块,使得代码结构更加清晰易读。这段代码实现了一个简单的三子棋游戏,可以通过玩家和电脑之间交替下棋,判断胜负并输出结果。

在这里插入图片描述

YOLO26-Quantized:面向国产AI芯片的全栈量化方案,适配昇腾310P与寒武纪MLU270 在算力国产化替代的行业趋势下,昇腾310P、寒武纪MLU270已成为工业边缘视觉、智能检测场景的主流国产AI芯片选型。针对原生YOLO26模型在国产芯片上推理效率低、算子兼容性差、量化精度塌陷三大核心痛点,本文提出YOLO26-Quantized全栈量化方案,覆盖训练感知量化(QAT)、离线静态量化(PTQ)、模型编译优化、芯片专属部署全流程。 阅读详情

相关推荐

探索robotics-toolbox-python:从基础安装到高级机器人运动学应用

本文详细介绍了robotics-toolbox-python工具箱,从基础安装、环境配置到机器人运动学与动力学的核心应用。通过D-H参数、URDF导入和内置模型三种方式快速构建机器人模型,并演示了正逆运动学计算、关节空间与任务空间轨迹规划以及三维可视化仿真。该工具箱极大地简化了机器人算法开发流程,是进行机器人学研究和应用实践的强大工具。

i1j2k的博客 496

C语言简易小游戏

本篇博客将带领大家自己动手写一下一些C语言小游戏;以增加对于C语言的兴趣😀😀😀😀😀。

南猿北者博客 4万+

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法

本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。

weixin_42662293的博客 350

详解5个C语言简单易懂小游戏

我们通过5个简单易懂的小游戏来加强我们对C语言的认识,这五个小游戏不仅有单人,还有人机对战和人人对战。让我们在学习之余来上一局紧张刺激的小游戏吧!我们的五个小游戏已经全部做完。下面是做小游戏要注意的点:scanf函数是不安全,我们可以寻找一个安全的函数进行替代,或者解决scanf的安全问题谨防数组越界,我们好几个小游戏都用了数组进行存储,有字符型数组,还有整形数组,要谨防数组越界,注意数组传参。把经常使用的代码构造为函数,减少代码冗余。

2301_76986069的博客 2万+

CKS-CN考试之路----03

这题不需要去生成image和生成deployment所以只需要去检测对应的值即可。编辑/cks/docker/Dockerfile,修改最后第二行的值。编辑/cks/docker/deployment.yaml。

Q先生 825

OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,将首次通过简单示例了解轮廓的基本概念,然后通过实际示例来了解如何检测和压缩轮廓,最后利用介绍如何利用图像矩描述检测到的轮廓属性。

盼小辉丶的博客 3万+

C语言实现入门级小游戏

上一期咱们用C语言实现了三子棋的小游戏 C语言实现三子棋 今天我们再来写个扫雷的游戏,说起扫雷,相信大家都不陌生,可能许多朋友还是玩扫雷的高手。 其实扫雷和三子棋有许多相似之处,都需要用到数组的知识。 今天的扫雷也是相当有趣的 由于博主是一个编程学习的小白,所以这只是扫雷的初级版,此版本有一些功能还无法实现,在后续的学习中,我会持续更新,不断对这个小游戏进行优化,期待大家的关注,还有,这篇文章中若有错误或不当的地方,欢迎大家指正! 关于这个扫雷项目的代码,.........

Living_Amethyst的博客 2万+

第2章: MMU Notifier 全局通知器的核心原理⭐

摘要 MMU Notifier机制是Linux内核中用于处理内存地址空间变化通知的关键框架。其设计遵循解耦与标准化、最小侵入性、高性能和安全性四大原则,采用三层架构实现上层应用、核心层与内存管理层的协作。框架提供两种通知模型:全局订阅的mmu_notifier和区间订阅的mmu_interval_notifier,分别适用于KVM虚拟化和GPU共享虚拟内存等不同场景。核心数据结构mmu_notifier_ops定义了设备驱动需要实现的回调函数集合,包括进程退出处理、页面老化管理、地址范围失效通知等功能。

图形/计算GPU的驱动与虚拟化技术分享园地 4564

c语言——小游戏代码实现(三子棋)

此文件中包含棋盘初始化函数,棋盘打印函数,玩家落子函数,电脑落子函数,判断输赢及棋盘是否已满函数。DisplayBoard函数,外层for循环控制行数的递增,里面还嵌套两个for循环,第一个for循环实现对数据的打印,按照空格、数据、空格加‘ | ’ 的方式打印,‘ | ’是棋盘的竖分割线,为了保证棋盘的美观性,每一行的最后一列不打印‘ | ’。此游戏的实现,对while,do while循环语句,if else多分支语句,switch选择语句,以及函数的调用,数组等知识进行了综合应用。

Klevantunnel的博客 1288

运放+MOS恒流源电路仿真分析

利用运放设计一个恒流源

HW-BASE的博客 4094

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 849

【C语言小游戏】详解三子棋,深刻掌握二维数组

【C语言小游戏】,三子棋,二维数组的应用,让大家更深刻掌握二维数组

程序员良辰 2302

用 Custom Entity 打造 RAP Value Help:从能跑到好用的深度踩坑笔记

本文介绍了在RAP项目中实现Value Help(Fiori输入帮助)的完整流程。通过Custom Entity方式,开发者可以灵活构建不依赖数据库实体的值帮助功能,但需手动实现CDS原本提供的过滤、排序、分页等能力。文章以一个典型场景为例,详细说明了如何为Partner维护界面的City字段创建可搜索的值帮助,包括创建查询实现类、绑定CDS Custom Entity、服务发布等关键步骤,并特别指出了处理排序分页请求等常见问题。最后强调在ABAP Cloud环境下需要自行实现查询能力,而非依赖传统工具类。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 140

详解C语言实现三子棋

在学习C语言的过程中,我们不光要学会C语言的语法知识,更要学会如何将所学知识运用到我们实际项目当中去,今天,小杨就以C语言中的数组与函数两个知识点来实现一个趣味小游戏——三子棋。我们定义一个char类型的二维数组board[ROW][COL]来表示一个ROW行、COL列的棋盘,我们这里将ROW定义为3,COL定义为3;//打印菜单//进行游戏//初始化棋盘//打印棋盘//玩家下棋//电脑下棋//判断输赢。

m0_75262940的博客 659

数学建模模型总结

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

经典小游戏(一)C实现——三子棋

/声明//告诉我们四种状态//玩家赢 ‘*’//电脑赢 ‘#’//平局 ‘Q’//继续 ‘C’int main()//{//// for(i=0;i

2401_85123750的博客 749

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C语言小游戏 - 三子棋(详细)

三子棋游戏 game.c和test.c都会用到一样的东西,所以定义一个game.h的头文件,game.c和test.c都引用game.h,即#include"game.h" 思路: 1.先初始化一个棋盘(3X3),即数组的创建和初始化,数组里边存储一个空格 2.把这个棋盘给打印出来 3.玩家下棋(玩家先下),给一个坐标,进行判断 4.电脑下棋,这里的电脑随机选一个空着的坐标下棋,并未对电脑智能化,如果想让电脑变强,可以自己写一下 5.玩家和电脑每走一步,都判断一下是否胜利(有三个相连的将获胜) 下边是代码

weijie_win的博客 293

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

c语言三子棋坐标怎么输入,用C语言实现三子棋(下)

以下是test.c的代码#include "game.h"//测试三子棋游戏void menu(){printf("***********************\n");printf("****1.play 0.exit****\n");printf("***********************\n");}//游戏的整个算法实现void game(){char ret = 0;//数组 ...

weixin_33095355的博客 150

C语言基础小游戏之三子棋

前言:把书念下去,走出去,不枉活一世!!! 如期而至的三子棋它来啦! 三子棋游戏是一个益智类的小游戏,会让你感受到棋盘地魅力!正所谓中华文化博大精深。哈哈哈~~ 用c语言实现三子棋游戏,其实不难,就用到了二维数组传参,基本函数语法等,都是最基本的。这对新手来说,做点小项目丰富一下自己,很有帮助。 让我们想看一下,传说中的三子棋~ 基本实现思路: 1.先打印游戏菜单 2.三子棋的地图,可以看做3x3的二维数组组成,所以然后初始化棋盘 3.打印棋盘 4.玩家落子 5.电脑落子 6.判断输赢,或者平局 .

qq_54883034的博客 329

三子棋游戏

头文件 # ifndef __GAME_H__ #define __GAME_H__ #include<stdio.h> #include<time.h> #include<windows.h> #include<string.h> #pragma warning(disable:4996) #define Row 3 #define Col 3 ...

qq_45691220的博客 214

C语言——三子棋小游戏

(1).玩家先下棋,创建Playermove()函数,因为可能输入非法坐标,所以采用while循环输入,并且注意,我们应该站在用户的角度思考,正常情况坐标从1开始,而数组下标从0开始,所以用户输入进的数据在代码中应该减1,在最为数组坐标。今天学习到了一个有趣的东西,用C语言实现三子棋,(核心知识——二维数组,函数),非常适合初学者练习,使初学者对二维数组与函数有更加深刻的认识。(1).玩家落一次子,则调用一次此函数,用临时变量接收返回值并判断是否为“*”,是则玩家赢,不是则电脑下子。现在先实现输赢的标志。

hffh123的博客 319

2024年0608日练习(三子棋)

一个小游戏的简单设计(三子棋)

Zx_xuanyyds的博客 537

浅谈井子棋 —— C语言

三子棋的简单实现

weixin_48488314的博客 1053

三子棋初级版

三子棋初级版

m0_68814541的博客 663

C语言实现三子棋游戏(棋盘可自行扩展)

目录 三子棋简单介绍 实现方式 游戏外部测试(test.c文件) 游戏内容具体实现(game.c和game.h) 三子棋简单介绍 大家都玩过五子棋吧,三子棋和这个类似,就是三子连成一线就获得胜利。 大概就是这么个情况。 实现方式 首先,我们将这个游戏的实现分为3个部分,放在test.c 文件, game.c文件 ,game.h文件里。 test.c :游戏的外部测试; game.c :游戏的实现; game.h :游戏的头、声明; 游戏外部测试(test.c文件)

SAKURAjinx的博客 756

c语言实现三子棋

c语言实现三子棋 我们需要掌握二维数组,自定义函数,循环结构,选择结构以及利用时间戳设置随机变量等知识即可。 要实现三子棋首先我们写出大概的框架然后通过函数一步一步实现。 例如下面我们将游戏的框架放在文件test.c(内容如下) ~~~c #include "game.h" //将所有的头文件放在一个文件里统一调用 int main() { menu(); //菜单栏 input(); //按菜单提示输入 srand((unsi...

LoveHoneyYou的博客 931

c语言数组知识小应用

学习了c语言的顺序、选择、循环分支结构、数组、函数之后,我们一起来做一个小游戏---三子棋。 1-游戏菜单设定: 为了使游戏运行之后就直接答应菜单,选择do-while循环,那故意选错怎么办?这点我们用switch选择结构来规避,代码如下: <1.>菜单 int input = 0; do { menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case

HXYforever的博客 3210
上一篇: 初识C语言(上)
下一篇: 扫雷——利用GPT写的程序说明
Singularity_SY
博客等级 码龄4年 109粉丝 9原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值