C语言开发实战:使用EasyX在Visual Studio 2022中创建井字棋游戏

news2025/4/6 17:19:55

🌟 前言

欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍

  • 🤖 洛可可白:个人主页

  • 🔥 个人专栏:✅前端技术 ✅后端技术

  • 🏠 个人博客:洛可可白博客

  • 🐱 代码获取:bestwishes0203

  • 📷 封面壁纸:洛可可白wallpaper

在这里插入图片描述

文章目录

  • C语言开发实战:使用EasyX在Visual Studio 2022中创建井字棋游戏
    • EasyX是什么?
    • 运行效果
    • 环境搭建
    • 游戏逻辑实现
      • 初始化游戏板
      • 检查胜利条件
      • 检查平局
      • 绘制游戏板
      • 绘制棋子
      • 绘制提示文本
      • 游戏主循环
    • 全部代码
    • 结语
    • 🎉 往期精彩回顾

C语言开发实战:使用EasyX在Visual Studio 2022中创建井字棋游戏

在本文中,我们将学习如何使用Visual Studio 2022和EasyX图形库来开发一个简单的井字棋游戏。EasyX是一个开源的图形库,它简化了Windows平台下的图形编程,使得开发者能够更快速地创建图形界面。

EasyX是什么?

EasyX是一个开源的图形库,它为Windows平台下的C/C++程序提供了丰富的图形和多媒体编程接口。它旨在简化图形用户界面(GUI)的开发,使得开发者能够更容易地创建具有图形界面的应用程序和游戏。

EasyX的主要特点包括:

  1. 跨平台:虽然主要针对Windows平台,但EasyX也提供了一些跨平台的功能,使得开发者能够编写在多个操作系统上运行的代码。

  2. 易用性:EasyX提供了大量封装好的函数,使得开发者无需深入了解底层的图形编程细节,就可以快速实现图形界面和动画效果。

  3. 丰富的功能:EasyX支持多种图形绘制、图像处理、文本显示、音频播放等功能,满足了大多数基本的图形编程需求。

  4. 社区支持:作为一个开源项目,EasyX拥有活跃的社区,开发者可以在社区中寻求帮助、分享经验和获取最新的库更新。

运行效果

在这里插入图片描述

环境搭建

首先,确保你已经安装了Visual Studio 2022。接下来,你需要下载并安装EasyX图形库。

参考博文:
入门教程:Windows搭建C语言和EasyX开发环境

  1. 访问EasyX的官方网站或GitHub页面下载最新版本的EasyX。
  2. 将EasyX的库文件解压到你的项目目录中。
  3. 在Visual Studio中创建一个新的C++项目,并配置项目以包含EasyX的头文件和库文件。

游戏逻辑实现

初始化游戏板

char board_data[3][3] = {
    {'-','-','-'},
    {'-','-','-'},
    {'-','-','-'},
};

这是一个3x3的字符数组,用来表示游戏板的状态。'-'表示空格,'O''X'表示玩家的棋子。

检查胜利条件

bool CheckWin(char c) {
    // 检查所有可能的获胜行、列和对角线
    // 如果找到连续三个相同的字符,返回true
    	if (board_data[0][0] == c && board_data[0][1] == c && board_data[0][2] == c) return true;
	if (board_data[1][0] == c && board_data[1][1] == c && board_data[1][2] == c) return true;
	if (board_data[2][0] == c && board_data[2][1] == c && board_data[2][2] == c) return true;
	if (board_data[0][0] == c && board_data[1][0] == c && board_data[2][0] == c) return true;
	if (board_data[0][1] == c && board_data[1][1] == c && board_data[2][1] == c) return true;
	if (board_data[0][2] == c && board_data[1][2] == c && board_data[2][2] == c) return true;
	if (board_data[0][0] == c && board_data[1][1] == c && board_data[2][2] == c) return true;
	if (board_data[0][2] == c && board_data[1][1] == c && board_data[2][0] == c) return true;
	return false;
}

这个函数会检查游戏板上是否有玩家获胜。

检查平局

bool CheckDraw() {
    // 检查游戏板上是否有空格
    // 如果所有位置都被填满,返回true,表示平局
    	for (size_t i = 0; i < 3; i++)
	{
		for (size_t j = 0; j < 3; j++)
		{
			if (board_data[i][j] == '-') {
				return false;
			}
		}
	}
	return true;
}

这个函数会检查游戏是否平局。

绘制游戏板

void DrawBoard() {
    // 使用EasyX的绘图函数绘制游戏板的边框
    line(0, 200, 600, 200);
	line(0, 400, 600, 400);
	line(200, 0, 200, 600);
	line(400, 0, 400, 600);
}

这个函数负责绘制游戏板的边框。

绘制棋子

void DrawPiece() {
    // 根据游戏板的状态,绘制'O'或'X'棋子
    	for (size_t i = 0; i < 3; i++)
	{
		for (size_t j = 0; j < 3; j++)
		{
			switch (board_data[i][j])
			{
			case 'O':
				circle(200 * j + 100, 200 * i + 100, 100);
				break;
			case 'X':
				line(200 * j, 200 * i, 200 * (j + 1), 200 * (i + 1));
				line(200 * (j + 1), 200 * i, 200 * j, 200 * (i + 1));
				break;
			case '-':
				break;
			}
		}
	}
}

这个函数会根据游戏板的状态绘制棋子。

绘制提示文本

void DrawTipText() {
    // 显示当前轮到哪一位玩家下棋
    	static TCHAR str[64];
	_stprintf_s(str, _T("当前棋子类型为:%c"), current_piece);
	settextcolor(RGB(225, 175, 45));
	outtextxy(0, 0, str);
}

这个函数会在屏幕上显示提示信息,告诉玩家当前轮到谁下棋。

游戏主循环

int main() {
    // 初始化图形界面
    initgraph(600, 600);
    // 游戏循环
    while (true) {
        // 处理鼠标点击事件
        // 绘制游戏板和棋子
        // 检查游戏结束条件
    }
    return 0;
}

游戏的主循环负责处理用户输入、更新游戏状态、绘制游戏界面,并检查游戏是否结束。

全部代码

#include<graphics.h>
#include<stdlib.h>

char board_data[3][3] = {
	{'-','-','-'},
	{'-','-','-'},
	{'-','-','-'},
};

char current_piece = 'O';

bool CheckWin(char c) {
	if (board_data[0][0] == c && board_data[0][1] == c && board_data[0][2] == c) return true;
	if (board_data[1][0] == c && board_data[1][1] == c && board_data[1][2] == c) return true;
	if (board_data[2][0] == c && board_data[2][1] == c && board_data[2][2] == c) return true;
	if (board_data[0][0] == c && board_data[1][0] == c && board_data[2][0] == c) return true;
	if (board_data[0][1] == c && board_data[1][1] == c && board_data[2][1] == c) return true;
	if (board_data[0][2] == c && board_data[1][2] == c && board_data[2][2] == c) return true;
	if (board_data[0][0] == c && board_data[1][1] == c && board_data[2][2] == c) return true;
	if (board_data[0][2] == c && board_data[1][1] == c && board_data[2][0] == c) return true;
	return false;
}

bool CheckDraw() {
	for (size_t i = 0; i < 3; i++)
	{
		for (size_t j = 0; j < 3; j++)
		{
			if (board_data[i][j] == '-') {
				return false;
			}
		}
	}
	return true;
}

void DrawBoard() {
	line(0, 200, 600, 200);
	line(0, 400, 600, 400);
	line(200, 0, 200, 600);
	line(400, 0, 400, 600);
}

void DrawPiece() {
	for (size_t i = 0; i < 3; i++)
	{
		for (size_t j = 0; j < 3; j++)
		{
			switch (board_data[i][j])
			{
			case 'O':
				circle(200 * j + 100, 200 * i + 100, 100);
				break;
			case 'X':
				line(200 * j, 200 * i, 200 * (j + 1), 200 * (i + 1));
				line(200 * (j + 1), 200 * i, 200 * j, 200 * (i + 1));
				break;
			case '-':
				break;
			}
		}
	}
}

void DrawTipText() {
	static TCHAR str[64];
	_stprintf_s(str, _T("当前棋子类型为:%c"), current_piece);
	settextcolor(RGB(225, 175, 45));
	outtextxy(0, 0, str);
}

int main() {
	initgraph(600, 600);
	bool runing = true;
	ExMessage msg;
	BeginBatchDraw();
	while (runing)
	{
		DWORD start_time = GetTickCount();
		while (peekmessage(&msg))
		{
			if (msg.message == WM_LBUTTONDOWN)
			{
				int x = msg.x;
				int y = msg.y;
				int index_x = x / 200;
				int index_y = y / 200;
				if (board_data[index_y][index_x] == '-')
				{
					board_data[index_y][index_x] = current_piece;
					if (current_piece == 'X')
					{
						current_piece = 'O';
					}
					else {
						current_piece = 'X';
					}
				}
			}
		}
		cleardevice();
		DrawBoard();
		DrawPiece();
		DrawTipText();
		FlushBatchDraw();

		if (CheckWin('X'))
		{
			MessageBox(GetHWnd(), _T("玩家X获胜"), _T("游戏结束"), MB_OK);
			runing = false;
		}
		else if (CheckWin('O'))
		{
			MessageBox(GetHWnd(), _T("玩家O获胜"), _T("游戏结束"), MB_OK);
			runing = false;
		}
		else if (CheckDraw())
		{
			MessageBox(GetHWnd(), _T("平局"), _T("游戏结束"), MB_OK);
			runing = false;
		}
		DWORD end_time = GetTickCount();
		DWORD delta_time = end_time - start_time;
		if (delta_time < 1000 / 60) {
			Sleep(1000 / 60 - delta_time);
		}
	}
	EndBatchDraw();
	return 0;
}

结语

通过上述步骤,我们成功地使用Visual Studio 2022和EasyX开发了一个简单的井字棋游戏。这个教程展示了如何设置游戏环境、实现游戏逻辑、处理用户输入以及绘制游戏界面。现在,你可以在此基础上添加更多功能,如AI对手、网络对战等,来丰富你的游戏。

如果对你有帮助,点赞👍、收藏💖、关注🔔是我更新的动力!👋🌟🚀

🎉 往期精彩回顾

前端与后端协同:实现Excel导入导出功能
Java日期格式化:掌握时间的艺术
JavaScript日期格式化:从原始值到用户友好的字符串
入门教程:Windows搭建C语言和EasyX开发环境
CentOS系统下Docker的安装教程
Spring Boot单元测试全指南:使用Mockito和AssertJ
Yarn简介及Windows安装与使用指南
H5实现3D旋转照片墙教程
Element-Plus 实现动态渲染图标教程
MyBatis-Plus分页接口实现教程:Spring Boot中如何编写分页查询
Element-Plus下拉菜单边框去除教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2024-3148 DedeCms makehtml_archives_action sql注入漏洞分析

DedeCMS&#xff08;也称为织梦CMS&#xff09;是一款基于PHPMySQL的开源内容管理系统。 在 DedeCMS 5.7.112 中发现一个被归类为严重的漏洞。此漏洞会影响某些未知文件dede/makehtml_archives_action.php的处理。操作导致 sql 注入。攻击可能是远程发起的。该漏洞已向公众披露…

Word wrap在计算机代表的含义(自动换行)

“Word wrap”是一个计算机术语&#xff0c;用于描述文本处理器在内容超过容器边界时自动将超出部分转移到下一行的功能。在多种编程语言和文本编辑工具中&#xff0c;都有实现这一功能的函数或选项。 在编程中&#xff0c;例如某些编程语言中的wordwrap函数&#xff0c;能够按…

pdf、docx、markdown、txt提取文档内容,可以应用于rag文档解析

返回的是文档解析分段内容组成的列表&#xff0c;分段内容默认chunk_size: int 250, chunk_overlap: int 50&#xff0c;250字分段&#xff0c;50分段处保留后面一段的前50字拼接即窗口包含下下一段前面50个字划分 from typing import Union, Listimport jieba import recla…

鸿蒙ArkTS开始实例:【canvas实现签名板功能】

使用ArkTS中的canvas实现签名板的功能&#xff0c;canvas画布大家都很熟悉&#xff0c;我们会用它经常实现一些画板或者图表、表格之类的功能。canvas签名板是我在开发APP过程中实现的一个功能&#xff0c;开发过程中也是遇到比较多的问题。我会按照以下几点来讲解开发整个过程…

npm版本切换工具nvm

有了nvm&#xff0c;可以在一台机器上同时安装多个版本的nodejs&#xff0c;然后指定使用某个版本。 前端开发的时候&#xff0c;安装依赖一直是个令我头痛的问题。总是报错&#xff0c;或者不是少了这样就是少了那样&#xff0c;鸡飞狗走。以往&#xff0c;一般要装个enpm&am…

HCIA-Datacom H12-811 题库补充(4/7)

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 共享介质型网络使用哪一种技术进行数据转发&#xff1f; A&#xff1a;CDMA/CD B&#xff1a;CSMA/AC C&#xff1a;TDMA/CD D&#xff1a;CSMA/CD 答案&#xff1a;D 解析&#xff1a;以太网 CSMA …

SQL Server语法基础:入门到精通

博客前言 在数据库管理的世界中&#xff0c;SQL Server无疑是一个重要的角色。无论是初学者还是经验丰富的数据库管理员&#xff0c;都需要对SQL Server的查询语法有深入的理解。本文将带领大家深入解析SQL Server的查询语法&#xff0c;并分享一些实用的技巧&#xff0c;帮助…

OpenAI 推出新网络爬虫GPTBot,为GPT-5做准备

目录 一、GPTBot是什么&#xff1f;它是如何工作的&#xff1f;二、GPTBot 与 Google Bot 等搜索引擎网络爬虫有何不同&#xff1f;三、GPTBot 与 Perplexity AI 的网络爬虫有何不同&#xff1f;四、允许 GPTBot 爬取有哪些风险和好处&#xff1f;4.1 允许 GPTBot 的好处4.2 允…

麒麟系统ARM安装rabbitmq

简单记录下&#xff0c;信创服务器&#xff1a;麒麟系统&#xff0c;安装rabbitmq的踩坑记录。 本文章参考了很多大佬文章&#xff0c;我整理后提供。 一、安装基础依赖 yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel 二、下载…

手机如何在线制作gif?轻松一键在线操作

现在大家都喜欢使用手机来拍摄记录有趣的事物&#xff0c;但是时间长了手机里的视频越来越多导致手机存储空间不够了&#xff0c;这些视频又不想删除时应该怎么办呢&#xff1f;这个很简单&#xff0c;下面就给大家分享一款不用下载手机就能操作的视频转gif网站-GIF中文网&…

四大生成式模型的比较——GAN、VAE、归一化流和扩散模型

比较四大模型的本质 four modern deep generative models: generative adversarial networks, variational autoencoders, normalizing flows, and diffusion models 待写

经典文章:卷积神经网络的运作原理

https://brohrer.mcknote.com/zh-Hans/how_machine_learning_works/how_convolutional_neural_networks_work.html 参考资料 https://aitechtogether.com/article/38900.html https://www.ruanyifeng.com/blog/2017/07/neural-network.html http://neuralnetworksanddeeplea…

drawio画图编辑图形颜色

drawio画图编辑图形颜色 团队的安全第一图表。将您的存储空间带到我们的在线工具中&#xff0c;或使用桌面应用程序进行本地保存。 1.安装准备 1.1安装平台 多平台 1.2在线使用 浏览器打开网页使用 1.3软件下载 drawio官网github仓库下载 2.在浏览器的网页中使用drawio…

遥感影像处理利器:PyTorch框架下CNN-Transformer,地物分类、目标检测、语义分割和点云分类

目录 专题一 深度卷积网络知识详解 专题二 PyTorch应用与实践&#xff08;遥感图像场景分类&#xff09; 专题三 卷积神经网络实践与目标检测 专题四 卷积神经网络的遥感影像目标检测任务案例【FasterRCNN】 专题五 Transformer与遥感影像目标检测 专题六 Transformer的遥…

升级xcode15 报错Error (Xcode): Cycle inside Runner

升级xcode15后报错 Could not build the precompiled application for the device. Error (Xcode): Cycle inside Runner; building could produce unreliable results. This usually can be resolved by moving the shell script phase Thin Binary so that it runs before th…

Java(JDBC)

一、DriverManager 注册驱动 Class.forName("com.mysql.jdbc.Driver"); 获取连接 static Connection connection null; connection DriverManager.getConnection(url, user, password); 1.ur:连接路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数…

配置vscode用于STM32编译,Debug

配置环境参考&#xff1a; Docs 用cubemx配置工程文件&#xff0c;用VScode打开工程文件。 编译的时候会有如下报错&#xff1a; vscode出现process_begin :CreateProcess failed 系统找不到指定文件 解决方案&#xff1a;在你的makefile中加上SHELLcmd.exe就可以了 参考…

汇编——SSE打包整数

SSE也可以进行整数向量的加法&#xff0c;示例如下&#xff1a; ;sse_integer.asm extern printfsection .datadummy db 13 align 16pdivector1 dd 1dd 2dd 3dd 4pdivector2 dd 5dd 6dd 7dd 8fmt1 db "Packed Integer Vector 1: %d, %d, %d, %d",…

6_6_SQL

//名词 Candidate key:若表中记录的某一字段或字段组合能够唯一标志记录&#xff0c;则称该字段或字段组合为候选关键字 Primary key:若一个表有多个候选关键字&#xff0c;则选定其中一个为主关键字&#xff0c;也称为主键 Foreignkey:若某字段或字段组合不是数据库中A表的关键…

【大数据】安装hive-3.1.2

1、上传HIVE包到/opt/software目录并解压到/opt/modules/ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/modules/ 2、修改路径 mv /opt/modules/apache-hive-3.1.2-bin/ /opt/modules/hive 3、将hIVE下的bin目录加入到/etc/profile中 export HIVE_HOME/opt/module…