easyX实践上手操作小项目

news2024/12/28 20:52:58

easyX实践上手操作小项目

  • 效果展示
  • 主菜单的装饰
  • 玩法介绍界面
  • 开始游戏界面
  • 制作团队界面
  • 排行榜界面
  • 注:main()函数
  • 拓展数据库
  • 小结

在这里插入图片描述

这里我们学习过easyX的基础知识后,看看是否能实践操作一下,制作一个属于自己的游戏界面呢?

基础知识入口:
链接: 基础知识哦

效果展示

在这里插入图片描述
点击选项也可以进入其对应的界面

注意:这里只是实现了点击切换界面以及一点装饰的功能

主菜单的装饰

这是总的函数
在这里插入图片描述
其中png图片我是放在了该项目文件夹里

// 主菜单界面渲染
void menu()
{

    //设置背景颜色,清屏
    setbkcolor(WHITE);
    cleardevice();

    //加载背景图片
    IMAGE img_bk,img_kunkun,img_kun1;
    loadimage(&img_bk, "./kun_bk.png", 800, 640);
    putimage(0, 0, &img_bk);
    loadimage(&img_kunkun, "./kunkun.png", 200, 300);
    putimage(100, 100,&img_kunkun);
    loadimage(&img_kun1, "./kun1.png", 250, 500);
    putimage(300, 120, &img_kun1);

    // 绘制开始界面,菜单
    setfillcolor(LIGHTGRAY);
    setlinecolor(BLACK);
    setbkmode(TRANSPARENT);
    fillrectangle(500, 110, 720, 180); // 220  70
    fillrectangle(500, 210, 720, 280);
    fillrectangle(500, 310, 720, 380);
    fillrectangle(500, 410, 720, 480);
    fillrectangle(500, 510, 720, 580);
    char arr1[] = "开始游戏";
    char arr2[] = "玩法介绍";
    char arr3[] = "排行榜";
    char arr4[] = "制作团队";
    char arr5[] = "退出游戏";

    // 文字居中
    int width = 220 / 2 - textwidth(arr1) / 2;
    int heigh = 70 / 2 - textheight(arr1) / 2;

    //打印文字
    settextcolor(BLACK);
    outtextxy(width + 500, heigh + 110, arr1);
    outtextxy(width + 500, heigh + 210, arr2);
    outtextxy(width + 500, heigh + 310, arr3);
    outtextxy(width + 500, heigh + 410, arr4);
    outtextxy(width + 500, heigh + 510, arr5);

    //音乐开关的按钮
    setfillcolor(LIGHTRED);
    fillcircle(80, 70, 30);
    settextcolor(YELLOW);
    settextstyle(20, 0, "楷体");
    outtextxy(55, 65, "音乐");

    //鼠标键位操作
    while (1)
    {
        if (MouseHit())
        {
            MOUSEMSG msg = GetMouseMsg();
            // 左键点击播放音乐  右键停止播放
            if (msg.x > 65 && msg.x < 95 && msg.y> 55 && msg.y < 85)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    mciSendString("open giegie.mp3 alias BGM", 0, 0, 0);
                    mciSendString("play BGM repeat", 0, 0, 0);
                    break;
                case WM_RBUTTONDOWN://右键
                    mciSendString("pause BGM", 0, 0, 0);
                    break;
                }
            }
            // 制作团队界面
            if (msg.x > 500 && msg.x < 720 && msg.y> 410 && msg.y < 480)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    make_team();
                    break;
                }
            }
            // 开始游戏界面
            if (msg.x > 500 && msg.x < 720 && msg.y> 110 && msg.y < 180)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    game_begin();
                    break;
                }
            }
            // 玩法介绍界面
            if (msg.x > 500 && msg.x < 720 && msg.y> 210 && msg.y < 280)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    game_introduce();
                    break;
                }
            }
            // 排行榜界面
            if (msg.x > 500 && msg.x < 720 && msg.y> 310 && msg.y < 380)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    ranking();
                    break;
                }
            }
            // 退出游戏
            if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    closegraph();
                    exit(0);
                }
            }
        }
    }
    getchar();
    closegraph;
}

玩法介绍界面

void game_introduce()
{
    // 设置背景颜色为白色,清屏
    setbkcolor(WHITE);
    cleardevice();

    // 返回 框的创建
    setfillcolor(LIGHTGRAY);
    setlinecolor(BLACK);
    setbkmode(TRANSPARENT);
    fillrectangle(500, 510, 720, 580);
    char arr3[] = "返回";
    // 文字居中
    int width = 220 / 2 - textwidth(arr3) / 2;
    int heigh = 70 / 2 - textheight(arr3) / 2;
    // 打印文字
    settextcolor(BLACK);
    outtextxy(width + 500, heigh + 510, arr3);
    // 返回 框的点击操作
    while (1)
    {
        if (MouseHit())
        {
            MOUSEMSG msg = GetMouseMsg();
            if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    menu();
                    break;
                }
            }
        }
    }
}

开始游戏界面

void game_begin()
{
    // 设置背景颜色为白色,清屏
    setbkcolor(WHITE);
    cleardevice();

    // 三个 框的创建
    setfillcolor(LIGHTGRAY);
    setlinecolor(BLACK);
    setbkmode(TRANSPARENT);
    fillrectangle(500, 110, 720, 180); // 220  70
    fillrectangle(500, 210, 720, 280);
    fillrectangle(500, 510, 720, 580);
    char arr1[] = "新的游戏";
    char arr2[] = "读取文档";
    char arr3[] = "返回";
    // 文字居中
    int width = 220 / 2 - textwidth(arr3) / 2;
    int heigh = 70 / 2 - textheight(arr3) / 2;
    // 打印文字
    settextcolor(BLACK);
    outtextxy(width + 500, heigh + 110, arr1);
    outtextxy(width + 500, heigh + 210, arr2);
    outtextxy(width + 500, heigh + 510, arr3);
    // 返回 框的点击操作
    while (1)
    {
        if (MouseHit())
        {
            MOUSEMSG msg = GetMouseMsg();
            //返回 操作
            if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    menu();
                    break;
                }
            }
            // 新的游戏界面
            if (msg.x > 500 && msg.x < 720 && msg.y> 110 && msg.y < 180)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    role_select();
                    break;
                }
            }
        }
    }
}

制作团队界面

void make_team()
{
    // 设置背景颜色为白色,清屏
    setbkcolor(WHITE);
    cleardevice();

    // kunkun图片加载
    IMAGE img_kunkun2;
    loadimage(&img_kunkun2, "./kunkun2.png", 200, 200);
    putimage(50, 70, &img_kunkun2);

    // 返回 框的创建
    setfillcolor(LIGHTGRAY);
    setlinecolor(BLACK);
    setbkmode(TRANSPARENT);
    fillrectangle(500, 510, 720, 580);
    char arr[] = "返回";
    // 文字居中
    int width = 220 / 2 - textwidth(arr) / 2;
    int heigh = 70 / 2 - textheight(arr) / 2;
    // 打印文字
    settextcolor(BLACK);
    outtextxy(width + 500, heigh + 510, arr);
    // 返回 框的点击操作
    while (1)
    {
        if (MouseHit())
        {
            MOUSEMSG msg = GetMouseMsg();
            if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    menu();
                    break;
                }
            }
        }
    }

}

排行榜界面

void ranking()
{
    // 设置背景颜色为白色,清屏
    setbkcolor(WHITE);
    cleardevice();

    // 返回 框的创建
    setfillcolor(LIGHTGRAY);
    setlinecolor(BLACK);
    setbkmode(TRANSPARENT);
    fillrectangle(500, 510, 720, 580);
    char arr3[] = "返回";
    // 文字居中
    int width = 220 / 2 - textwidth(arr3) / 2;
    int heigh = 70 / 2 - textheight(arr3) / 2;
    // 打印文字
    settextcolor(BLACK);
    outtextxy(width + 500, heigh + 510, arr3);
    // 返回 框的点击操作
    while (1)
    {
        if (MouseHit())
        {
            MOUSEMSG msg = GetMouseMsg();
            if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580)
            {
                switch (msg.uMsg)
                {
                case WM_LBUTTONDOWN://左键
                    menu();
                    break;
                }
            }
        }
    }
}

注:main()函数

int main()
{
    initgraph(800, 640);//创建一个窗口800×640
    menu();
    closegraph();
    return 0;
}

注:
若你的窗口每次点击就会发生窗口闪动,就是因为每个函数之内都有一个创建窗口操作
在整个程序中,只能有一个创建窗口的操作

拓展数据库

举例:展示排行榜信息 第一关

void rank_mysql()
{

	setbkcolor(BROWN);
	cleardevice();
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);
	settextstyle(25, 0, "宋体");

	MYSQL mysql;//一个数据库结构体
	MYSQL_RES* res;//一个结果集结构体
	MYSQL_ROW row;//char** 二维数组,存放一条记录
	//初始化数据库
	mysql_init(&mysql);
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");;//设置编码方式
	//连接数据库
	//判断 如果连接失败就输出连接失败
	if (mysql_real_connect(&mysql, "localhost", "root", "xie123123", "c_mysql", 3306, NULL, 0))
	{                               //伍什凯电脑ip  数据库名   密码         
		printf("连接成功\n");
	}
	else
	{
		printf("连接失败:%s\n", mysql_error(&mysql));
	}

	//步数排行榜
	//执行sql语句  查询整张表的信息
	
	//以下,username,step,rank是我建立的steps_rank1表单的列
	
	if (mysql_query(&mysql, "SELECT username,step, @rank:=@rank+1 `rank` from steps_rank1 s,(select @rank:=0) q ORDER BY step ;")) {
		printf("%s\n", mysql_error(&mysql));
		//return -1;
	}
	//得到结果集
	res = mysql_use_result(&mysql);
	//一行一行的将数据读出来
	while ((row = mysql_fetch_row(res)) != NULL) {
		int count = res->field_count;//得到一行中,有多少列
		int rows = mysql_num_rows(res);
		for (int i = 0; i < count; i++) {
			outtextxy(100 + i * 150, 130 + rows * 30, row[i]);
		}
		outtextxy(0, 130 + rows * 30, "");
	}

	//打印到easyX创建的窗口上
	outtextxy(100, 110, "用户名");
	outtextxy(240, 110, "步数");
	outtextxy(380, 110, "排行");
	int q = mysql_num_rows(res) + 1;
	rectangle(95, 105, 435, 130 + q * 30);

	//释放结果集
	mysql_free_result(res);
	//关闭数据库
	mysql_close(&mysql);
	//停留等待
	system("pause");
}

小结

通过这些练习,我们可以感觉到:

  • easyX渲染的代码重复率较高
    我们可以创建一个函数,每次都去调用这个函数,省去好多重复的操作
  • 几乎所以都是以基础知识为支撑,看着知识讲解就可以

之后,自己就可以尝试着做一款基础easyX窗口的游戏了

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

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

相关文章

基于深度学习的高精度野生目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度野生目标检测识别系统可用于日常生活中检测与定位野生目标目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的野生目标目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测…

开源SCRM营销平台MarketGo-账号管理

一、概述 企业在经营的过程中&#xff0c;因为业务、税收等各种因素的需要在各地成立分公司&#xff0c;这样针对公司来说管理成本&#xff0c;运营成本&#xff0c;营销成本都会提高&#xff0c;并且沟通的效率也会变低。 在用户营销的场景中&#xff0c;MarketGo在SCRM做了…

C++ stack容器介绍

&#x1f914;stack容器介绍&#xff1a; &#x1f4d6; stack是一种数据结构&#xff0c;也可以被称为堆栈。它是一个容器&#xff0c;只允许在最顶层进行插入和删除&#xff0c;并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…

【C++入门】什么是引用

目录 一、引用概念 二、引用特性 三、常引用 四、使用场景 1. 做参数 2. 做返回值 五、传值&#xff0c;传引用效率比较 六、引用和指针的区别 一、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取一个别名&#xff0c;编译器不会为引用变量开辟内存空间…

【C/C++】之内存管理(超详细练气篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、DETR、ViT/Swin transformer

前言 2018年我写过一篇博客&#xff0c;叫&#xff1a;《一文读懂目标检测&#xff1a;R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD》&#xff0c;该文相当于梳理了2019年之前CV领域的典型视觉模型&#xff0c;比如 2014 R-CNN2015 Fast R-CNN、Faster R-CNN2016 YOLO、SSD2…

Seata 分布式事务-应用实例

Seata 分布式事务-应用实例 需求分析/图解 需求&#xff1a;完成下订单功能&#xff0c;由三个微服务模块协同完成, 涉及到多数据库, 多张表 分析 黑色线是执行顺序线 红色线是想Seata Server注册 最后紫色线是决定是否提交和回滚 项目目录 主题包结构都是一样的但是类名字…

eventfd 和 epoll 的结合使用

一.eventfd介绍 eventfd 是 Linux 的一个系统调用&#xff0c;创建一个文件描述符用于事件通知&#xff0c;自 Linux 2.6.22 以后开始支持。 接口及参数介绍 #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags);eventfd() 创建一个 eventfd 对象&…

spring cloud Alibaba之Nacos Discovery--服务治理 (二)

接着上一篇文章 搭建的微服务环境, 实现nacos 注册中心实战操作案例 一. 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08;ip&#xff0c;端口&#xff09;等硬编码到了代码中&a…

【SpringCloud】SpringAMQP

文章目录 1、AMQP2、基本消息模型队列3、WorkQueue模型4、发布订阅模型5、发布订阅-Fanout Exchange6、发布订阅-DirectExchange7、发布订阅-TopicExchange 1、AMQP Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。是用于在应用程序之间传递业务消息的开放标…

ElasticSearch安装部署——超详细

ElasticSearch安装部署 简介 全文搜索属于最常见的需求&#xff0c;开源的 Elasticsearch &#xff08;以下简称 es&#xff09;是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 Elasticsearch简称es&…

JS中手撕防抖函数和节流函数

1.防抖函数 1.1定义 说明&#xff1a;在一定时间内&#xff0c;频繁执行事件&#xff0c;只执行最后一次函数。(英雄联盟回城) 1.2步骤&#xff1a; 声明定时器函数判断是否有定时器函数&#xff0c;如果有定时器函数的话就清除定时器。。如果没有定时器函数的话&#xff0…

chatgpt赋能python:Python中的三角函数介绍

Python中的三角函数介绍 Python作为一种高级编程语言&#xff0c;可以处理基础算术运算、三角函数等高等数学的操作。其中&#xff0c;三角函数是常用的数学函数之一&#xff0c;Pyhon中的三角函数包括正弦函数、余弦函数、正切函数等。 正弦函数 正弦函数在三角学中是最基本…

chatgpt赋能python:精度问题在Python编程中的影响及解决方法

精度问题在Python编程中的影响及解决方法 Python是一种解释性编程语言&#xff0c;以其简单易学、开发效率高等特点而广受欢迎。然而&#xff0c;Python中的浮点数精度问题却经常困扰着程序员。在本文中&#xff0c;我们将详细介绍Python中精度问题的影响及解决方法。 精度问…

华为OD机试真题B卷 Java 实现【字符串分隔】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;请按长度为8拆分每个输入字符串并进行输出&#xff0c;长度不是8整数倍的字符串请在后面补数字0&#xff0c;空字符串不处理。 二、输入描述 连续输入字符串(每个字符串长度小于等于100)。 三、输出描述 依次输出所有分割后的长度…

layui框架学习(25:弹出层模块_加载框询问框)

layui框架的弹出层模块layer中最重要的函数即layer.open&#xff0c;基于该函数&#xff0c;layer模块封装了很多常用弹出框&#xff0c;上文已介绍了消息框和提示框函数&#xff0c;本文学习加载框和询问框函数的基本用法&#xff0c;同时继续学习layer模块中基础参数的用法。…

Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

Part1&#xff1a;使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习 1. 效果图2. 原理2.0 前向成像模型2.1 世界坐标系2.2 相机坐标系2.3 坐标变换2.4 投影转换2.5 数据 3. 源码参考 是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景&#xff1f; 有…

有奖励!2023陕西省首台(套)重大技术装备产品项目申报条件、认定材料

本文整理了2023陕西省首台&#xff08;套&#xff09;重大技术装备产品项目申报条件&#xff0c;认定材料等相关内容&#xff0c;感兴趣的朋友快跟小编一起来看看吧&#xff01; 一、重点支持方向及领域 重点支持方向及领域&#xff1a;高档工业母机、电力装备、大型矿山和冶金…

【MySQL】MySQL 字段为 NULL 的5大坑

数据准备 建立一张表 数据如下&#xff1a; 1.count 数据丢失 count(*) 会统计值为 NULL 的行&#xff0c;而 count(列名) 不会统计此列为 NULL 值的行。 select count(*),count(name) from person; ----------------------- count(*) | count(name)10 | 8-------…

如何使用Python自动化测试工具Selenium进行网页自动化?

引言 Selenium是一个流行的Web自动化测试框架&#xff0c;它支持多种编程语言和浏览器&#xff0c;并提供了丰富的API和工具来模拟用户在浏览器中的行为。Selenium可以通过代码驱动浏览器自动化测试流程&#xff0c;包括页面导航、元素查找、数据填充、点击操作等。 与PyAuto…