当前位置: 首页 > news >正文

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的主要特点包括:

  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) {// 检查所有可能的获胜行、列和对角线// 如果找到连续三个相同的字符,返回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中创建井字棋游戏

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

Android与RN远程过程调用的原理

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

MySQL-主从复制:概述、原理、同步数据一致性问题、搭建流程

主从复制 1. 主从复制概述 1.1 如何提升数据库并发能力 一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是采用数据库集群的方案&#xff0c;做主从架构、进行读写分离&#xff0c;这样同样可以提升数据库的并…...

论文阅读《Semantic Prompt for Few-Shot Image Recognition》

论文地址&#xff1a;https://arxiv.org/pdf/2303.14123.pdf 论文代码&#xff1a;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 简介 容器技术 容器其实就是虚拟机&#xff0c;每个容器可以运行不同的系统【系统以Linux为主的】 为什么要使用docker&#xff1f; docker容器之间互相隔离&#xff0c;可以提高安全性通过使用docker可以做靶场 1.2 安装配置docker 方法一&#xff1a;yum安装…...

Python---Numpy线性代数

1.数组和矩阵操作&#xff1a; 创建数组和矩阵&#xff1a;np.array, np.matrix 基本的数组操作&#xff1a;形状修改、大小调整、转置等 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激活函数 偏置扮演什么角色&#xff1f; 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨…...

使用tomcat里的API - servlet 写动态网页

一、创建一个新的Maven空项目 首次创建maven项目的时候&#xff0c;会自动从maven网站上下载一些依赖组件&#xff08;这个过程需要保证网络稳定&#xff0c;否则后续打包一些操作会出现一些问题&#xff09; ps:校园网可能会屏蔽一些网站&#xff0c;可能会导致maven的依赖…...

从0到1搭建文档库——sphinx + git + read the docs

sphinx git read the docs 目录 一、sphinx 1 sphinx的安装 2 本地构建文件框架 1&#xff09;创建基本框架&#xff08;生成index.rst &#xff1b;conf.py&#xff09; conf.py默认内容 index.rst默认内容 2&#xff09;生成页面&#xff08;Windows系统下&#xf…...

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语言初相识:探索编程之路

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;星计划★C语言、Linux实践室 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️第一个c语言程序二. ⛳️数据类型2.1 &#x1f514;数据单位2.2 &…...

搜维尔科技:借助 ARVR 的力量缩小现代制造业的技能差距

借助ARVR的力量缩小现代制造业的技能差距 搜维尔科技&#xff1a;Senseglove案例-扩展机器人技术及其VR应用...

数据结构之栈和队列

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

centos安装使用elasticsearch

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

4.7学习总结

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

自定义gitlog格式

git log命令非常强大而好用&#xff0c;在复杂系统的版本管理中扮演着重要的角色&#xff0c;但默认的git log命令显示出的东西实在太丑&#xff0c;不好好打扮一下根本没法见人&#xff0c;打扮好了用alias命令拍个照片&#xff0c;就正式出道了&#xff01; 在使用git查看lo…...

Redission--分布式锁

Redission的锁的好处 Redission分布式锁的底层是setnx和lua脚本(保证原子性) 1.是可重入锁。 2.Redisson 锁支持自动续期功能&#xff0c;这可以帮助我们合理控制分布式锁的有效时长&#xff0c;当业务逻辑执行时间超出了锁的过期时间&#xff0c;锁会自动续期&#xff0c;避免…...

非关系型数据库(缓存数据库)redis的集群

目录 一.群集模式——Cluster 1.原理 2.作用 3.特点 4.工作机制 哈希槽 哈希槽的分配 哈希槽可按照集群主机数平均分配&#xff08;默认分配&#xff09; 根据主机的性能以及功能自定义分配 redis集群的分片 分片 如何找到给定key的分片 优势 二. 搭建Redis群集…...

MySQL:表的约束(上)

文章目录 空属性默认值列描述zerofill主键 本篇总结的是MySQL中关于表的约束部分的内容 空属性 在进行表的创建时&#xff0c;会有两个值&#xff0c;null和not null&#xff0c;而数据库默认的字段基本都是空&#xff0c;但是在实际的开发过程中要保证字段不能为空&#xff…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...