项目预备知识
导入两个头文件
#include <graphics.h> // 引入 EasyX 的图形库头文件
#include <conio.h> // 引入 conio.h 以使用 getch()
窗口创建函数:小黑屏
initgraph(640, 480, SHOWCONSOLE);
closegraph(); //关闭一个窗口
设置背景颜色:这里设置完颜色之后,还需要清除一下设备,不然还是黑色的
setbkcolor(WHITE); //设置背景颜色
cleardevice(); //清屏,把黑色清楚掉......每画一个东西,都需要清除一次
绘图函数:(这里以画圆为例),前缀是需要绘图的类型,后缀是种类
circle()无填充
fillcircle()有边框填充
solidcircle()无边框填充
下面是使用方式:
circle(50, 50, 50);
fillcircle(50, 150, 50);
solidcircle(50, 250, 50);
设置类:这个是窗口下的形状
setlinestyle(PS_SOLID, 5); //设置线条样式 setlinestyle(样式,宽度)
setfillcolor(YELLOW); //设置填充颜色 setfillcolor(颜色)
setlinecolor(BLUE); //设置线条边框颜色 setlinecolor
设置文字的函数:
//设置文字颜色
settextcolor(RED);
//设置文字样式
settextstyle(20, 0, "楷体");
//设置背景模式
//变成透明TRANSPARENT
setbkmode(TRANSPARENT);
输出文字:
outtextxy(50, 50, "azlml");
文字居中的方法:
//把文字居中的操作,画图理解
fillrectangle(200, 50, 500, 100); //画一个矩形
settextcolor(RGB(0, 0, 14));
char arr[] = "居中显示";
int width = 300 / 2 - textwidth(arr) / 2;
int hight = 50 / 2 - textheight(arr) / 2;
outtextxy(width + 200, hight + 50, arr);
有关图片的函数:
IMAGE img; //定义一个对象
//加载图片
// 用的是相对路径 ./表示当前文件夹下 ../当前文件夹的上一级目录
//绝对路径 C:\Users\傅\source\repos\项目\项目\小鸟游六花.jpg
//jpg支持背景透明,png不支持背景透明
loadimage(&img, "./小鸟游六花.jpg", 250, 250); //可以调整图片的大小,不是在输出的时候改
//输出图片
putimage(0, 0, &img);
有关键盘的函数:
kbhit() //判断是有键盘有被按下
char key = _getch(); //读键盘的消息
键盘的操作:
if (kbhit()) //判断是否有键盘按下
{//键盘消息char key = _getch();printf("%d%c\n", key, key);switch (key){//上键case 'w':case 'W':yy--;printf("上键\n");break;case 's':case 'S':yy++;printf("下键\n");break;case 'a':case 'A':xx--;printf("左键\n");break;case 'd':case 'D':xx++;printf("右键\n");break;}
}
鼠标操作:
//鼠标消息
if (MouseHit())
{MOUSEMSG msg = GetMouseMsg();// 消息分发switch (msg.uMsg){case WM_LBUTTONDOWN:outtextxy(400, 400, "鼠标左键按下");if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 200) //在框框内{printf("在框框内\n");//输出鼠标点击的坐标printf("坐标(%d,%d)\n", msg.x, msg.y);}break;case WM_RBUTTONDOWN:outtextxy(400, 400, "鼠标右键按下");if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 200) //在框框内{printf("在框框内\n");//输出鼠标点击的坐标printf("坐标(%d,%d)\n", msg.x, msg.y);}break;}
}/*case WM_MOUSEMOVE: ……break;//鼠标移动消息case WM_MOUSEWHEEL: ……break;// 鼠标滚轮拨动消息case WM_LBUTTONDOWN: ……break;// 左键按下消息case WM_MBUTTONDOWN: ……break;// 中键按下消息case WM_RBUTTONDOWN: ……break;// 右键按下消息
*/
2048项目
#include <graphics.h> // 引入 EasyX 的图形库头文件
#include <conio.h> // 引入 conio.h 以使用 getch()
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<math.h>
using namespace std;#define GRID_W 100//格子的宽度 100
#define MAX_SIZE 4//每行列,格子的数量
#define INTERVAL 15//格子的间距
#define WIN_SIZE MAX_SIZE * GRID_W + INTERVAL*5 // 矩形窗口
//定义一个数组,用来存储数据
int map[MAX_SIZE][MAX_SIZE];
int flag = 0;
enum Color {zero = RGB(205, 193, 180),two1 = RGB(238, 228, 218),two2 = RGB(237, 224, 200),two3 = RGB(242, 177, 121),two4 = RGB(245, 149, 99),two5 = RGB(246, 124, 95),two6 = RGB(246, 94, 59),two7 = RGB(242, 177, 121),two8 = RGB(237, 204, 97),two9 = RGB(255, 0, 128),two10 = RGB(145, 0, 72),two11 = RGB(242, 17, 158),back = RGB(187, 173, 160),
};
Color arr[13] = { zero,two1,two2, two3, two4, two5, two6, two7, two8, two9, two10,two11,back };
//随机产生一个整数2 or 4 ,产生2的概率大于4
int creatnum()
{//随机数 rand 需要加上头文件//直接用rand是不会产生随机数的,在此之前,需要设置随机数种子//需要获取时间,需要加上time.h头文件srand((unsigned)time(NULL) + clock());printf("%d",rand());if (rand()%6 ==0){return 4;}else{return 2;}
}
//初始化数据,随机产生两个数
void gameinit()
{for (int i=0; i<2 ;){//随机生成两个下标int r = rand() % 4;int c = rand() % 4; if (!map[r][c]){map[r][c] = creatnum();++i;}}
}
void gamenew()
{for (int i = 0; i < 1;){//随机生成两个下标int r = rand() % 4;int c = rand() % 4;if (!map[r][c]){map[r][c] = creatnum();++i;}}
}
//绘制主界面
void gamedraw()
{//设置背景颜色setbkcolor(RGB(186, 173, 160));cleardevice(); //设置颜色的时候需要清除背景for (int i = 0; i < MAX_SIZE; ++i){for (int j = 0; j < MAX_SIZE; ++j){//找到对应格子的左上角坐标int x1 = INTERVAL * (j+1) + GRID_W * j, y1=INTERVAL* (i + 1) + GRID_W * i;int x2 = x1 + GRID_W, y2 = y1 + GRID_W;int index = log2(map[i][j]);//设置格子填充颜色COLORREF tcolor = arr[index] ;setfillcolor(tcolor);//绘制格子solidroundrect(x1, y1, x2, y2,10,10);//把数组里面的数据绘制到图形窗口上面if (map[i][j] != 0) //去0{//设置文字样式settextstyle(50, 0, "黑体");//设置文字背景透明setbkmode(TRANSPARENT);settextcolor(RGB(119, 110, 101));//把整形转化为字符串char str[10] = "";sprintf_s(str, "%d", map[i][j]);//居中int width = textwidth(str);int height = textheight(str);int xx = x1 + (GRID_W - width) / 2;int yy = y1 + (GRID_W - height) / 2;outtextxy(xx, yy, str);}}}
}//移动方格,移动数组里面的数
void moveup()
{for (int i = 0; i < MAX_SIZE; ++i){int temp = 0;for (int j = 1; j < MAX_SIZE; ++j){if (map[j][i]){if (!map[temp][i]) //上方元素为0{map[temp][i] = map[j][i];map[j][i] = 0;}else if (map[temp][i] == map[j][i]) //上方元素与当前元素相同{map[temp][i] *= 2;map[j][i] = 0;temp++ ;}else //有距离{map[temp + 1][i] = map[j][i];if (temp + 1 != j){map[j][i] = 0;}temp++;}flag = 1;}}}
}void movedown()
{for (int i = MAX_SIZE-1; i >=0; --i){int temp = MAX_SIZE - 1;for (int j = MAX_SIZE - 2; j >=0; --j){if (map[j][i]){if (!map[temp][i]){map[temp][i] = map[j][i];map[j][i] = 0;}else if (map[temp][i] == map[j][i]){map[temp][i] *= 2;map[j][i] = 0;temp--;}else{map[temp - 1][i] = map[j][i];if (temp - 1 != j){map[j][i] = 0;}temp--;}flag = 1;}}}
}void moveleft()
{for (int i = 0 ; i < MAX_SIZE ; ++i){int temp = 0;for (int j = 1; j <MAX_SIZE; ++j){if (map[i][j]){if (!map[i][temp]){map[i][temp] = map[i][j];map[i][j] = 0;}else if (map[i][temp] == map[i][j]){map[i][temp] *= 2;map[i][j] = 0;temp++;}else{map[i][temp +1] = map[i][j];if (temp + 1 != j){map[i][j] = 0;}temp++;}flag = 1;}}}
}void moveright()
{for (int i = MAX_SIZE-1; i >=0; --i){int temp = MAX_SIZE-1;for (int j = MAX_SIZE - 2; j >=0; --j){if (map[i][j]){if (!map[i][temp]){map[i][temp] = map[i][j];map[i][j] = 0;}else if (map[i][temp] == map[i][j]){map[i][temp] *= 2;map[i][j] = 0;temp--;}else{map[i][temp -1] = map[i][j];if (temp - 1 != j){map[i][j] = 0;}temp--;}flag = 1;}}}
} //按键处理
void keydeal()
{char key = _getch();switch (key){case 'w':case 'W':moveup();break;case 's':case 'S':movedown();break;case 'a':case 'A':moveleft();break;case 'd':case 'D':moveright();break;}
}int main()
{//创建窗口initgraph(WIN_SIZE, WIN_SIZE);gameinit();while (1){gamedraw();keydeal();if (flag){gamenew();flag = 0;}}_getch();closegraph(); //关闭窗口return 0;
}
球球大作战:
#include <graphics.h> // 引入 EasyX 的图形库头文件
#include <conio.h> // 引入 conio.h 以使用 getch()
#include<time.h>
#include<stdlib.h>
#include<math.h>
#define FOOD_NUM 100
#define MAX_WIDTH 640
#define MAX_HIGHT 480
#define eatting(x1,y1,x2,y2) sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))struct vector2d
{int x;int y;
};struct player
{vector2d pos; //球的位置int r; //球的半径vector2d v = { 0 };COLORREF color; //角色球的颜色
};struct Food
{vector2d pos; //球的位置int r; //球的半径COLORREF color; //球的颜色
};
//初始化玩家
void play_init(player *players)
{players->pos.x = rand() % MAX_HIGHT;players->pos.y = rand() % MAX_WIDTH;players->r = rand() % 10+5;players->v = { 0 };players->color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
//绘制玩家
void player_drew(player* players)
{setfillcolor(players->color);//创建一个球solidcircle(players->pos.x, players->pos.y, players->r);
}void food_init(Food* food)
{food->pos.x = rand() % MAX_HIGHT;food->pos.y = rand() % MAX_WIDTH;food->r = rand() % 10 + 1;food->color = RGB(rand() % 256, rand() % 256, rand() % 256);
}void Food_drew(Food* food)
{setfillcolor(food->color);//创建一个球solidcircle(food->pos.x, food->pos.y, food->r);
}void move(player* players,ExMessage* msg)
{//按下消息if (msg->message == WM_KEYDOWN){switch (msg->vkcode){case VK_UP:players->v.y = -1;break;case VK_DOWN:players->v.y = 1;break;case VK_LEFT:players->v.x = -1;break;case VK_RIGHT:players->v.x = 1;break;}}else if (msg->message == WM_KEYUP) //放开消息{switch (msg->vkcode){case VK_UP:players->v.y = 0;break;case VK_DOWN:players->v.y = 0;break;case VK_LEFT:players->v.x = 0;break;case VK_RIGHT:players->v.x = 0;break;}}
}void update(player* players)
{int tx = players->pos.x;int ty = players->pos.y;players->pos.x += players->v.x, players->pos.y += players->v.y;if (players->pos.x<0 || players->pos.x>MAX_WIDTH){players->pos.x = tx;}if (players->pos.y<0 || players->pos.y>MAX_HIGHT){players->pos.y = ty;}
}int main()
{//初始化界面initgraph(640, 480); //建立一个矩形setbkcolor(RGB(214, 214, 214)); //设置背景颜色cleardevice();//设置了随机数种子srand(time(NULL));player players;play_init(&players);player_drew(&players);//产生可以吃的小球Food food[FOOD_NUM] = { 0 };//初始化每个小球的信息for (int i = 0; i < FOOD_NUM; ++i){food_init(food + i);}while (1){BeginBatchDraw();cleardevice();//绘制食物for (int i = 0; i < FOOD_NUM; ++i){Food_drew(food + i);}player_drew(&players);EndBatchDraw();for (int i = 0; i < FOOD_NUM; ++i){//如果被吃了,那么就更新球的位置,半径加1if (eatting(players.pos.x, players.pos.y, food[i].pos.x, food[i].pos.y) < players.r){food_init(food+i);players.r++;}}update(&players);//消息处理(按键 鼠标)ExMessage msg = { 0 };//获取消息if (peekmessage(&msg)){move(&players, &msg);}Sleep(1); } _getch();closegraph(); //关闭界面return 0;
}
相关文章:
项目预备知识
导入两个头文件 #include <graphics.h> // 引入 EasyX 的图形库头文件 #include <conio.h> // 引入 conio.h 以使用 getch() 窗口创建函数:小黑屏 initgraph(640, 480, SHOWCONSOLE); closegraph(); //关闭一个窗口 设置背景颜色:这…...

redis实战笔记汇总
文章目录 1 NoSQL入门概述1.1 能干嘛?1.2 传统RDBMS VS NOSQL1.3 NoSQL数据库的四大分类1.4 分布式数据库CAP原理 BASE原则1.5 分布式集群简介1.6 淘宝商品信息的存储方案 2 Redis入门概述2.1 是什么?2.2 能干嘛?2.3 怎么玩?核心…...

elment-ui table表格排序后 清除排序箭头/恢复默认排序 的高亮样式
问题描述: 1.默认排序是按照名称升序排列(图一) 2.在选择了筛选项以及其他排序方式之后,箭头高亮是这样的(图二) 3.当我点击清空按钮后,类型清空了,并且传给后端的排序方式是名称/升…...
MySQL数据库基本操作(二)
查询语句 1. 排序查询* 语法:order by 子句* order by 排序字段1 排序方式1 , 排序字段2 排序方式2... * 排序方式:* ASC:升序,默认的。* DESC:降序。 * 注意:* 如果有多个排序条件&#…...

Unity(第十部)时间函数和文件函数
时间函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatefloat timer 0;void Start(){//游戏开始到现在所花的时间Debug.Log(Time.time);//时间缩放值…...

【Java学习笔记】
常见算法 查找算法 1.基本查找 public class BasicSearchDemo01 {public static void main(String[] args) {//基本查找//核心://从0索引开始挨个往后查找//需求:定一个方法利用基本查找,查询某个元素是否存在//数据如下:{131&…...

Python列表生成式你学会了吗
1.最基本的列表生成方式 生成 1-10 之间的整数的一个列表 list1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(list1) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] list2 list(range(1, 11)) print(list2) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2.通过程序的方式生成[4, 9, 16, 25,…...

【Mybatis】快速入门 基本使用 第一期
文章目录 Mybatis是什么?一、快速入门(基于Mybatis3方式)二、MyBatis基本使用2.1 向SQL语句传参2.1.1 mybatis日志输出配置2.1.2 #{}形式2.1.3 ${}形式 2.2 数据输入2.2.1 Mybatis总体机制概括2.2.2 概念说明2.2.3 单个简单类型参数2.2.4 实体…...

在 Rust 中实现 TCP : 1. 联通内核与用户空间的桥梁
内核-用户空间鸿沟 构建自己的 TCP栈是一项极具挑战的任务。通常,当用户空间应用程序需要互联网连接时,它们会调用操作系统内核提供的高级 API。这些 API 帮助应用程序 连接网络创建、发送和接收数据,从而消除了直接处理原始数据包的复杂性。…...

STM32-ADC一步到位学习手册
1.按部就班陈述概念 ADC 是 Analog-to-Digital Converter 的缩写,指的是模拟/数字转换器。它将连续变量的模拟信号转换为离散的数字信号。在 STM32 中,ADC 具有高达 12 位的转换精度,有多达 18 个测量通道,其中 16 个为外部通道&…...
【文件管理】关于上传下载文件的设计
这里主要谈论的是产品设计里面的文件管理,比如文件的上传交互及背后影响到的前后端设计。 上传文件 场景:一条记录,比如个人信息,有姓名,出生年月,性别等一般的字段,还可以允许用户上传附件作为…...

微服务架构 SpringCloud
didi单体应用架构 将项目所有模块(功能)打成jar或者war,然后部署一个进程--医院挂号系统; > 优点: > 1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。 > 2:技术单一:项目不需要复杂的技术栈,往往一套熟…...

前端 css 实现标签的效果
效果如下图 直接上代码: <div class"label-child">NEW</div> // css样式 // 父元素 class .border-radius { position: relative; overflow: hidden; } .label-child { position: absolute; width: 150rpx; height: 27rpx; text-align: cente…...

SLAM基础知识-卡尔曼滤波
前言: 在SLAM系统中,后端优化部分有两大流派。一派是基于马尔科夫性假设的滤波器方法,认为当前时刻的状态只与上一时刻的状态有关。另一派是非线性优化方法,认为当前时刻状态应该结合之前所有时刻的状态一起考虑。 卡尔曼滤波是…...

云时代【6】—— 镜像 与 容器
云时代【6】—— 镜像 与 容器 四、Docker(三)镜像 与 容器1. 镜像(1)定义(2)相关指令(3)实战演习镜像容器基本操作离线迁移镜像镜像的压缩与共享 2. 容器(1)…...

【QT+QGIS跨平台编译】之五十三:【QGIS_CORE跨平台编译】—【qgssqlstatementparser.cpp生成】
文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…...

JMeter性能测试基本过程及示例
jmeter 为性能测试提供了一下特色: jmeter 可以对测试静态资源(例如 js、html 等)以及动态资源(例如 php、jsp、ajax 等等)进行性能测试 jmeter 可以挖掘出系统最大能处理的并发用户数 jmeter 提供了一系列各种形式的…...

你知道什么是回调函数吗?
c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…...

mac苹果电脑c盘满了如何清理内存?2024最新操作教程分享
苹果电脑用户经常会遇到麻烦:内置存储器(即C盘)空间不断缩小,电脑运行缓慢。在这种情况下,苹果电脑c盘满了怎么清理?如何有效清理和优化存储空间,提高计算机性能?成了一个重要的问题。今天,我想给大家详细介…...

k8s-kubeapps图形化管理 21
结合harbor仓库 由于kubeapps不读取hosts解析,因此需要添加本地仓库域名解析(dns解析) 更改context为全局模式 添加repo仓库 复制ca证书 添加成功 图形化部署 更新部署应用版本 再次进行部署 上传nginx 每隔十分钟会自动进行刷新 在本地仓库…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...