C语言开发实战:使用EasyX在Visual Studio 2022中创建井字棋游戏
🌟 前言
欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍
🤖 洛可可白:个人主页
🔥 个人专栏:✅前端技术 ✅后端技术
🏠 个人博客:洛可可白博客
🐱 代码获取: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的主要特点包括:
-
跨平台:虽然主要针对Windows平台,但EasyX也提供了一些跨平台的功能,使得开发者能够编写在多个操作系统上运行的代码。
-
易用性:EasyX提供了大量封装好的函数,使得开发者无需深入了解底层的图形编程细节,就可以快速实现图形界面和动画效果。
-
丰富的功能:EasyX支持多种图形绘制、图像处理、文本显示、音频播放等功能,满足了大多数基本的图形编程需求。
-
社区支持:作为一个开源项目,EasyX拥有活跃的社区,开发者可以在社区中寻求帮助、分享经验和获取最新的库更新。
运行效果
环境搭建
首先,确保你已经安装了Visual Studio 2022。接下来,你需要下载并安装EasyX图形库。
参考博文:
入门教程:Windows搭建C语言和EasyX开发环境
- 访问EasyX的官方网站或GitHub页面下载最新版本的EasyX。
- 将EasyX的库文件解压到你的项目目录中。
- 在Visual Studio中创建一个新的C++项目,并配置项目以包含EasyX的头文件和库文件。
游戏逻辑实现
初始化游戏板
char board_data[3][3] = {{'-','-','-'},{'-','-','-'},{'-','-','-'},
};
这是一个3x3的字符数组,用来表示游戏板的状态。'-'
表示空格,'O'
和'X'
表示玩家的棋子。
检查胜利条件
bool CheckWin(char c) {// 检查所有可能的获胜行、列和对角线// 如果找到连续三个相同的字符,返回trueif (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下拉菜单边框去除教程 |
相关文章:

C语言开发实战:使用EasyX在Visual Studio 2022中创建井字棋游戏
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...

Android与RN远程过程调用的原理
Android与RN远程过程调用的原理是通过通信协议进行远程过程调用。RPC(Remote Procedure Call)是分布式系统常见的一种通信方式,从跨进程到跨物理机已经有几十年历史。 在React Native中,通信机制是一个C实现的桥,打通了Java和JS,实现了两者的…...

MySQL-主从复制:概述、原理、同步数据一致性问题、搭建流程
主从复制 1. 主从复制概述 1.1 如何提升数据库并发能力 一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构、进行读写分离,这样同样可以提升数据库的并…...

论文阅读《Semantic Prompt for Few-Shot Image Recognition》
论文地址:https://arxiv.org/pdf/2303.14123.pdf 论文代码:https://github.com/WentaoChen0813/SemanticPrompt 目录 1、存在的问题2、算法简介3、算法细节3.1、预训练阶段3.2、微调阶段3.3、空间交互机制3.4、通道交互机制 4、实验4.1、对比实验4.2、组…...
Linux初学(十七)docker
一、docker 1.1 简介 容器技术 容器其实就是虚拟机,每个容器可以运行不同的系统【系统以Linux为主的】 为什么要使用docker? docker容器之间互相隔离,可以提高安全性通过使用docker可以做靶场 1.2 安装配置docker 方法一:yum安装…...

Python---Numpy线性代数
1.数组和矩阵操作: 创建数组和矩阵:np.array, np.matrix 基本的数组操作:形状修改、大小调整、转置等 import numpy as np# 创建一个 2x3 的数组 A np.array([[1, 2, 3], [4, 5, 6]]) print("数组 A:\n", A)# 将数组 A 转换为矩阵…...

react+ echarts 轮播饼图
react echarts 轮播饼图 图片示例 代码 import * as echarts from echarts; import { useEffect } from react; import styles from ./styles.scss;const Student (props) > {const { dataList, title } props;// 过滤数据const visionList [{ value: 1048, name: Se…...

政安晨:【深度学习神经网络基础】(三)—— 激活函数
目录 线性激活函数 阶跃激活函数 S型激活函数 双曲正切激活函数 修正线性单元 Softmax激活函数 偏置扮演什么角色? 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨…...

使用tomcat里的API - servlet 写动态网页
一、创建一个新的Maven空项目 首次创建maven项目的时候,会自动从maven网站上下载一些依赖组件(这个过程需要保证网络稳定,否则后续打包一些操作会出现一些问题) ps:校园网可能会屏蔽一些网站,可能会导致maven的依赖…...

从0到1搭建文档库——sphinx + git + read the docs
sphinx git read the docs 目录 一、sphinx 1 sphinx的安装 2 本地构建文件框架 1)创建基本框架(生成index.rst ;conf.py) conf.py默认内容 index.rst默认内容 2)生成页面(Windows系统下…...
EasyExcel 校验后导入
引入pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version></dependency>触发校验类 import com.baomidou.mybatisplus.extension.api.R; import lombok.experimental…...

【星计划★C语言】c语言初相识:探索编程之路
🌈个人主页:聆风吟_ 🔥系列专栏:星计划★C语言、Linux实践室 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️第一个c语言程序二. ⛳️数据类型2.1 🔔数据单位2.2 &…...
搜维尔科技:借助 ARVR 的力量缩小现代制造业的技能差距
借助ARVR的力量缩小现代制造业的技能差距 搜维尔科技:Senseglove案例-扩展机器人技术及其VR应用...

数据结构之栈和队列
1.前言 大家好久不见,这段时间由于忙去了。就没有即使维护我的博客,先给大家赔个不是。 我们还是规矩不乱,先赞后看~ 今天讲的内容是数据结构中非常重要的一个部分:栈和队列。它在今后的学习中也会再次出现(c&#…...

centos安装使用elasticsearch
1.首先可以在 Elasticsearch 官网 Download Elasticsearch | Elastic 下载安装包 2. 在指定的位置(我的是/opt/zhong/)解压安装包 tar -zxvf elasticsearch-7.12.1-linux-x86_64.tar.gz 3.启动es-这种方式启动会将日志全部打印在当前页面,一旦使用 ctrlc退出就会导…...

4.7学习总结
java学习 一.Stream流 (一.)概念: Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。Stream流是对集合(Collection)对象功能的增强&…...

自定义gitlog格式
git log命令非常强大而好用,在复杂系统的版本管理中扮演着重要的角色,但默认的git log命令显示出的东西实在太丑,不好好打扮一下根本没法见人,打扮好了用alias命令拍个照片,就正式出道了! 在使用git查看lo…...
Redission--分布式锁
Redission的锁的好处 Redission分布式锁的底层是setnx和lua脚本(保证原子性) 1.是可重入锁。 2.Redisson 锁支持自动续期功能,这可以帮助我们合理控制分布式锁的有效时长,当业务逻辑执行时间超出了锁的过期时间,锁会自动续期,避免…...

非关系型数据库(缓存数据库)redis的集群
目录 一.群集模式——Cluster 1.原理 2.作用 3.特点 4.工作机制 哈希槽 哈希槽的分配 哈希槽可按照集群主机数平均分配(默认分配) 根据主机的性能以及功能自定义分配 redis集群的分片 分片 如何找到给定key的分片 优势 二. 搭建Redis群集…...
MySQL:表的约束(上)
文章目录 空属性默认值列描述zerofill主键 本篇总结的是MySQL中关于表的约束部分的内容 空属性 在进行表的创建时,会有两个值,null和not null,而数据库默认的字段基本都是空,但是在实际的开发过程中要保证字段不能为空ÿ…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...