C/C++ 初级球球大作战练手
效果演示:
https://live.csdn.net/v/385490
游戏初始化
-
#include <stdbool.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #include <algorithm> #include<math.h> #include<mmsystem.h> #include <iostream> using namespace std; #pragma comment(lib,"winmm.lib") //所需要的库引入
- 需要准备的相关宏定义:
#define WIN_WIDTH 1024 #define WIN_HEIGHT 640 #define MAP_WIDTH (WIN_WIDTH*5) #define MAP_HEIGHT (WIN_HEIGHT*5) #define FOOD_NUM 1000 #define AI_NUM 500
- 初始化显示终端:initgraph(1024,640)
int main() {initgraph(WIN_WIDTH, WIN_HEIGHT);//初始化界面gameinit();while (true) {aimove();gamedraw();eatfood();playercontroller(10);}/*getchar();*/return 0; }
- 根据main函数主体逻辑串联整个代码体系
游戏初始化操作
- 游戏 初始化:在已经有的显示画面上进行布置球球的操作
- 通过随机种子 :随机布置食物球球的位置 玩儿家的随机小球位置 自由移动的小球的位置
- 前置定义:玩儿家,自由移动小球,食物小球
struct ball {int x;int y;int r;bool flag;DWORD color; }player,food[FOOD_NUM],ai[AI_NUM];
进入游戏的主题循环
- 自由小球的移动设置
void Chase(struct ball* chase,struct ball run) {chase->x < run.x ? chase->x += 2 : chase->x -= 2;chase->y < run.y ? chase->y += 2 : chase->y -= 2; }void aimove() {for (int i = 0; i < AI_NUM; i++){if (ai[i].flag){Chase(&ai[i], player);}} }
- 通过循环遍历
ai
数组。 - 检查每个元素的
flag
是否为真(即激活状态)。 - 如果是真,调用
Chase
函数,将ai[i]
(追击者的位置)和player
(目标的位置)作为参数传递给Chase
。 - 如果
chase->x
(追击者的横坐标)小于run.x
(目标的横坐标),则将chase->x
增加 2。 - 否则(即
chase->x
不小于run.x
),将chase->x
减少 2。 - 同理,对于纵坐标
y
,如果chase->y
小于run.y
,则chase->y
增加 2;否则chase->y
减少 2
- 缺乏边界检查:可按照如下的案例变动:
#include <limits.h> // 引入INT_MAX以确保不会除以零void Chase(struct ball* chase, struct ball run) {int dx = run.x - chase->x; // 计算目标和追击者之间的横坐标差int dy = run.y - chase->y; // 计算目标和追击者之间的纵坐标差// 确保不会除以零if (dx == 0 && dy == 0) {return;}// 限制移动速度int max_speed = 5; // 假设最大移动速度为5int speed = fmin(abs(dx), abs(dy)) * (dx < 0 ? -1 : 1); // 计算实际移动速度speed = fmin(speed, max_speed); // 限制速度不超过最大值// 更新追击者的位置if (dx < 0) {chase->x += speed;} else if (dx > 0) {chase->x -= speed;}if (dy < 0) {chase->y += speed;} else if (dy > 0) {chase->y -= speed;}// 确保移动后的位置不会超出边界int max_x = INT_MAX; // 假设横坐标的最大值int max_y = INT_MAX; // 假设纵坐标的最大值int min_x = INT_MIN; // 假设横坐标的最小值int min_y = INT_MIN; // 假设纵坐标的最大值chase->x = fmin(fmax(chase->x, min_x), max_x);chase->y = fmin(fmax(chase->y, min_y), max_y); }void aimove() {for (int i = 0; i < AI_NUM; i++) {if (ai[i].flag) {Chase(&ai[i], player);// 这里可以添加其他逻辑,例如检查玩家是否在AI的视野范围内}} }
进入游戏绘制
- 本质:在有了结构体 相当于有了对象,根据结构体对象,使其在画面上显示
-
IMAGE map(MAP_WIDTH, MAP_HEIGHT); POINT cameraPos;void CameraUpdate() {cameraPos.x = player.x - WIN_WIDTH / 2;cameraPos.y = player.y - WIN_HEIGHT / 2;if (cameraPos.x < 0) cameraPos.x = 0;if (cameraPos.y < 0) cameraPos.y = 0;if (cameraPos.x > MAP_WIDTH - WIN_WIDTH) cameraPos.x = MAP_WIDTH - WIN_WIDTH;if (cameraPos.y > MAP_HEIGHT - WIN_HEIGHT) cameraPos.y = MAP_HEIGHT - WIN_HEIGHT;}void gamedraw() {BeginBatchDraw();SetWorkingImage(&map);//设置图像setbkcolor(WHITE);//设置背景颜色cleardevice();//准备工作//绘制图像//1.食物圆for (int i = 0; i< FOOD_NUM; i++) {if (food[i].flag) {setfillcolor(food[i].color);solidcircle(food[i].x, food[i].y, food[i].r);}}//2.ai圆for (int i = 0; i < AI_NUM; i++){if (ai[i].flag){setfillcolor(ai[i].color);solidcircle(ai[i].x, ai[i].y, ai[i].r);}}//3.玩儿家圆if (player.flag){setfillcolor(player.color);solidcircle(player.x, player.y, player.r);settextcolor(BLACK);setbkmode(TRANSPARENT);// 确保文件编码支持中文,并且项目设置使用MBCSouttextxy(player.x, player.y, "百年好合");}//显示页面SetWorkingImage();CameraUpdate();putimage(0, 0, WIN_WIDTH, WIN_HEIGHT, &map, cameraPos.x, cameraPos.y);EndBatchDraw(); }
-
BeginBatchDraw();
: 开始批处理绘图,这通常意味着接下来所有的绘图操作都将被累积起来,直到EndBatchDraw
被调用时一次性渲染到屏幕上。SetWorkingImage(&map);
: 设置当前工作图像为map
,这通常是游戏中的地图或者背景图像 -
setbkcolor(WHITE);
: 设置背景颜色为白色。 -
cleardevice();
: 清除设备,通常是清除屏幕,使其变为背景颜色。 - 关注代码设计的核心逻辑 置于陌生的调用方法 了解能用即可
现在整个画面已经布局好 但是静态的 需要令其动起来
游戏运行 吃食物 根据按键动作
- 吃食物:遇见食物的坐标自身的小球的半径扩大即可
-
double DisTance(struct ball b1, struct ball b2) {return sqrt((double)(b1.x - b2.x) * (b1.x - b2.x) + (b1.y - b2.y) * (b1.y - b2.y)); }void eatfood() {//吃食物的逻辑 : 遇见食物就圆扩大for (int i = 0; i < FOOD_NUM; i++){if (food[i].flag && DisTance(player, food[i]) < player.r){food[i].flag = false;player.r += food[i].r / 4;}} }
函数
DisTance
DisTance
函数计算两个球体之间的欧几里得距离。这个函数对于游戏中的碰撞检测非常有用,比如判断玩家控制的球体是否接触到食物。函数的逻辑如下: - 接受两个
ball
类型的参数b1
和b2
,代表两个球体的位置。 - 返回两个球体之间的距离,使用欧几里得距离公式:(𝑥2−𝑥1)2+(𝑦2−𝑦1)2(x2−x1)2+(y2−y1)2。
函数 eatfood
函数处理玩家球体吃食物的逻辑。当玩家球体接触到食物时,球体会变大。函数的逻辑如下:
- 遍历
food
数组,该数组包含多个食物元素。 - 对于每个食物元素,检查它是否激活(
food[i].flag
为true
)以及玩家球体与食物之间的距离是否小于玩家球体的半径(player.r
)。 - 如果条件满足,说明玩家球体已经吃到食物,将食物的
flag
设置为false
,表示食物已被吃掉。 - 增加玩家球体的半径,增加的大小是食物半径的四分之一(
food[i].r / 4
)。这表示玩家球体在吃到食物后会变大。
游戏核心玩儿家运作
- 实质:根据按键 玩家控制小球的移动
-
void playercontroller(int speed) {//根据按键玩家控制移动if (GetAsyncKeyState(VK_UP) && player.y - player.r >= 0){player.y -= speed;}if (GetAsyncKeyState(VK_DOWN) && player.y + player.r < MAP_HEIGHT){player.y += speed;}if (GetAsyncKeyState(VK_LEFT) && player.x - player.r >= 0){player.x -= speed;}if (GetAsyncKeyState(VK_RIGHT) && player.x + player.r < MAP_WIDTH){player.x += speed;} }
使用了
GetAsyncKeyState
函数来检测按键的状态 -
if (GetAsyncKeyState(VK_UP) && player.y - player.r >= 0)
: 这行代码检查 ‘上’ 箭头键是否被按下,并且玩家的当前位置的 y 坐标减去其半径是否大于或等于 0。如果这两个条件都为真,意味着玩家不在屏幕底部,可以向上移动。 -
player.y -= speed;
: 如果 ‘上’ 箭头键被按下,并且玩家不在屏幕底部,玩家的 y 坐标会减去速度值,这样玩家就会在游戏世界中向上移动。 -
if (GetAsyncKeyState(VK_UP) && player.y - player.r >= 0)
: 这行代码检查 ‘上’ 箭头键是否被按下,并且玩家的当前位置的 y 坐标减去其半径是否大于或等于 0。如果这两个条件都为真,意味着玩家不在屏幕底部,可以向上移动。 -
player.y -= speed;
: 如果 ‘上’ 箭头键被按下,并且玩家不在屏幕底部,玩家的 y 坐标会减去速度值,这样玩家就会在游戏世界中向上移动。。。。。。。。。。
补充:
`CameraUpdate` 函数是用于更新游戏相机位置的函数。相机在游戏中的作用是让玩家能够看到游戏世界的一部分,通常是一个窗口(视口)。这个函数确保相机的位置始终在游戏世界的可视区域内。
以下是 `CameraUpdate` 函数的原理和逻辑:
1. `cameraPos.x = player.x - WIN_WIDTH / 2;`:计算相机在 x 轴的位置。相机的 x 坐标是玩家的 x 坐标减去屏幕宽度的一半。这样,相机就会在玩家正中间的位置。
2. `cameraPos.y = player.y - WIN_HEIGHT / 2;`:计算相机在 y 轴的位置。相机的 y 坐标是玩家的 y 坐标减去屏幕高度的一半。这样,相机就会在玩家正中间的位置。
3. `if (cameraPos.x < 0) cameraPos.x = 0;`:如果相机的位置在 x 轴上小于 0,则将相机的位置设置为 0。这意味着相机不能移动到游戏世界的左侧边界之外。
4. `if (cameraPos.y < 0) cameraPos.y = 0;`:如果相机的位置在 y 轴上小于 0,则将相机的位置设置为 0。这意味着相机不能移动到游戏世界的顶部边界之外。
5. `if (cameraPos.x > MAP_WIDTH - WIN_WIDTH) cameraPos.x = MAP_WIDTH - WIN_WIDTH;`:如果相机的位置在 x 轴上大于游戏世界的宽度减去屏幕宽度,则将相机的位置设置为游戏世界的右侧边界。
6. `if (cameraPos.y > MAP_HEIGHT - WIN_HEIGHT) cameraPos.y = MAP_HEIGHT - WIN_HEIGHT;`:如果相机的位置在 y 轴上大于游戏世界的高度减去屏幕高度,则将相机的位置设置为游戏世界的底部边界。
通过这些逻辑,`CameraUpdate` 函数确保相机始终在游戏世界的可视区域内,无论玩家在游戏世界中如何移动。这对于保持玩家在屏幕上的中心位置并显示游戏世界的重要部分非常重要。
全部代码:
//#include "contains.h"
#include <stdbool.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include <algorithm>
#include<math.h>
#include<mmsystem.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"winmm.lib")#define WIN_WIDTH 1024
#define WIN_HEIGHT 640
#define MAP_WIDTH (WIN_WIDTH*5)
#define MAP_HEIGHT (WIN_HEIGHT*5)
#define FOOD_NUM 1000
#define AI_NUM 500struct ball
{int x;int y;int r;bool flag;DWORD color;
}player,food[FOOD_NUM],ai[AI_NUM];
/*结构体定*/IMAGE map(MAP_WIDTH, MAP_HEIGHT);
POINT cameraPos;void PlayBackgroundMusic() {// 使用相对路径打开音频文件,假设音频文件名为"example.mp3"if (mciSendString("open mus.mp3 alias BGM", NULL, 0, NULL) != 0) {std::cerr << "Failed to open the audio file." << std::endl;return;}// 播放音频并设置为循环播放if (mciSendString("play BGM repeat", NULL, 0, NULL) != 0) {std::cerr << "Failed to play the audio." << std::endl;mciSendString("close BGM", NULL, 0, NULL); // 如果播放失败,关闭文件return;}
}void gameinit() {PlayBackgroundMusic();//bgm//随机种子srand((unsigned)time(NULL));//角色player.x = rand() % MAP_WIDTH;player.y = rand() % MAP_HEIGHT;player.r = 15;player.flag = true;player.color = RGB(rand() % 256, rand() % 256, rand() % 256);//食物for (int i = 0; i < FOOD_NUM; i++){food[i].x = rand() % MAP_WIDTH;food[i].y = rand() % MAP_HEIGHT;food[i].r = rand() % 5 + 1;food[i].flag = true;food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}//自由移动者for (int i = 0; i < AI_NUM; i++){ai[i].x = rand() % MAP_WIDTH;ai[i].y = rand() % MAP_HEIGHT;ai[i].r = rand() % 15 + 1;ai[i].flag = true;ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}
}void Chase(struct ball* chase,struct ball run)
{chase->x < run.x ? chase->x += 2 : chase->x -= 2;chase->y < run.y ? chase->y += 2 : chase->y -= 2;
}void aimove()
{for (int i = 0; i < AI_NUM; i++){if (ai[i].flag){Chase(&ai[i], player);}}
}void CameraUpdate()
{cameraPos.x = player.x - WIN_WIDTH / 2;cameraPos.y = player.y - WIN_HEIGHT / 2;if (cameraPos.x < 0) cameraPos.x = 0;if (cameraPos.y < 0) cameraPos.y = 0;if (cameraPos.x > MAP_WIDTH - WIN_WIDTH) cameraPos.x = MAP_WIDTH - WIN_WIDTH;if (cameraPos.y > MAP_HEIGHT - WIN_HEIGHT) cameraPos.y = MAP_HEIGHT - WIN_HEIGHT;}void gamedraw() {BeginBatchDraw();SetWorkingImage(&map);//设置图像setbkcolor(WHITE);//设置背景颜色cleardevice();//准备工作//绘制图像//1.食物圆for (int i = 0; i< FOOD_NUM; i++) {if (food[i].flag) {setfillcolor(food[i].color);solidcircle(food[i].x, food[i].y, food[i].r);}}//2.ai圆for (int i = 0; i < AI_NUM; i++){if (ai[i].flag){setfillcolor(ai[i].color);solidcircle(ai[i].x, ai[i].y, ai[i].r);}}//3.玩儿家圆if (player.flag){setfillcolor(player.color);solidcircle(player.x, player.y, player.r);settextcolor(BLACK);setbkmode(TRANSPARENT);// 确保文件编码支持中文,并且项目设置使用MBCSouttextxy(player.x, player.y, "百年好合");}//显示页面SetWorkingImage();CameraUpdate();putimage(0, 0, WIN_WIDTH, WIN_HEIGHT, &map, cameraPos.x, cameraPos.y);EndBatchDraw();
}double DisTance(struct ball b1, struct ball b2)
{return sqrt((double)(b1.x - b2.x) * (b1.x - b2.x) + (b1.y - b2.y) * (b1.y - b2.y));
}void eatfood() {//吃食物的逻辑 : 遇见食物就圆扩大for (int i = 0; i < FOOD_NUM; i++){if (food[i].flag && DisTance(player, food[i]) < player.r){food[i].flag = false;player.r += food[i].r / 4;}}
}void playercontroller(int speed) {//根据按键玩家控制移动if (GetAsyncKeyState(VK_UP) && player.y - player.r >= 0){player.y -= speed;}if (GetAsyncKeyState(VK_DOWN) && player.y + player.r < MAP_HEIGHT){player.y += speed;}if (GetAsyncKeyState(VK_LEFT) && player.x - player.r >= 0){player.x -= speed;}if (GetAsyncKeyState(VK_RIGHT) && player.x + player.r < MAP_WIDTH){player.x += speed;}
}int main() {initgraph(WIN_WIDTH, WIN_HEIGHT);//初始化界面gameinit();while (true) {aimove();gamedraw();eatfood();playercontroller(10);}/*getchar();*/return 0;
}
总结:至此简单实现的游戏完结,主要在于理清思路,拿此训练思维,孰能生巧。至于高级低级全看个人,随之成长日趋强键。
相关文章:

C/C++ 初级球球大作战练手
效果演示: https://live.csdn.net/v/385490 游戏初始化 #include <stdbool.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #include <algorithm> #include<math.h> #include<mmsy…...
ES6之字符串的扩展
字符串的扩展 关键的扩展点及其示例: Unicode 表示与处理 JavaScript 共有6种方法可以表示一个字符。codePointAtpos:String.fromCodePoint…codePoints: **字符串的遍历 for … of **字符串方法的增强 includessearchString[, position]&…...
微信小程序开发,构建NPM报错解决
报错信息如下: message: NPM packages not found. Please confirm npm packages which need to build are belong to miniprogramRoot directory. Or you may edit project.config.jsons packNpmManually and packNpmRelationList appid: wx7144a5d5411…...

【异常】SpringBoot整合RabbitMQ-发送消息报错
错误信息 reply-code406, reply-textPRECONDITION_FAILED - inequivalent arg ‘x-message-ttl’ for queue ‘hello-queue’ in vhost ‘/lq’: received none but current is the value ‘10000’ of type ‘signedint’, class-id50, method-id10 错误原因 hello-queue这…...

通过钉钉卡片进行工单审批
我们通常通过钉钉机器人来发送通知,提醒审批人名下有待办工单需要处理。这种通知方式仅能提醒审批人到ITSM中处理,审批人需要打开电脑登陆平台处理,我们就考虑是否能有一种方式能够满足移动端审批? 这里我们可以使用ITSM的移动端版…...
C语言中的控制语句:深入解析与案例实践2
五、使用goto实现无条件跳转 虽然goto语句在现代编程实践中往往被避免使用,因为它可能导致代码难以理解和维护,但在某些特定情况下,它仍然可以作为一种解决方案。goto语句允许程序无条件地跳转到代码中指定的标签位置。 案例代码:…...

【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】
请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器(ICSR)Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…...

深入解析C#中的async和await关键字
文章目录 一、异步编程的基本概念及其在C#中的实现二、async关键字的定义及其用法三、await关键字的定义及其用法示例代码:使用async和await编写一个简单的异步程序 四、async和await的优点注意事项 五、C#下async和await中常见问题汇总1. 异步方法中的await调用2. …...

【VUE.js】前端框架——未完成
基于脚手架创建前端工程 环境 当安装node.js时,它本身就携带有npm命令。(-v 查版本号)安装VUE CLI npm i vue/cli -g(全局) 创建 vue create 【project name】 镜像源解决方案 输入创建命令后,提示检查更…...

开源的文件压缩和解压缩软件7-Zip
7-Zip是一款开源的文件压缩和解压缩软件,它支持多种压缩格式,包括自有的7z格式以及常见的ZIP、RAR、TAR等格式。下面是对7-Zip的详细介绍,包括其功能特点、使用方法、优缺点等方面的内容。官网:7-Zip 1. 功能特点: 多…...
搜维尔科技:Patchwork 3D 新功能:爆炸视图动画
Patchwork 3D新功能:爆炸视图动画 为什么使用 Patchwork 3D? Patchwork 3D 软件有助于将 CAD 数据转换成真实感的 3D 模型以用于工业用途。 Patchwork 3D 可轻松进行实时渲染,有助于缩短设计周期,或者让您获得效果逼真的渲染图&…...
Redis——RedLock、Zookeeper及数据库实现分布式锁
在分布式系统中,实现分布式锁是确保数据一致性和防止并发问题的重要手段。以下是使用Redis的RedLock算法、ZooKeeper以及数据库实现分布式锁的基本概念和步骤: 1. Redis的RedLock算法 Redis的RedLock算法是Redis官方推荐的一种分布式锁实现方式&#x…...

OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析
OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析 起因 最近在学习安全协议,大多数实验都是基于Windows下IIS,或者Linux下nginx搭建的Web服务,搭建环境和编写配置文件比较麻烦。而且我有多个不同环境的设备,折腾起来…...

记录一次 vue2 前端项目整合过程
整合成功效果图 具体说明: 项目A是现在的vue2前端项目,项目B是一个开源的工作流前端,项目后端代码已经整合了,就不多提了。这里主要记录下前端整合的过程和思路。 1、开源工作流里面的功能,拷贝到自己对应的vue2项目里…...

物联网五层架构分析
物联网五层架构分析 随着科技的迅速发展,物联网(IoT)作为日常生活中不可或缺的一部分,已融入人们的生活和工作中。物联网五层架构,包括感知层、网络层、数据层、应用层和业务层,扮演着关键的角色。 感知层 …...

【Java EE】多线程(三)线程状态
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…...
FFmpeg常用API与示例(一)—— 工具库篇(av_log、AVDictionary、avio)
工具层 1.av_log 可以设置日志的级别,这个看看名字就明白了,也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…...

日志的基本用法
目标 1. 掌握如何设置日志级别 2. 掌握如何设置日志格式 3. 掌握如何将日志信息输出到文件中 1. logging模块 Python中有一个标准库模块logging可以直接记录日志 1.1 基本用法 import logging logging.debug("这是一条调试信息") logging.info("这是一条…...

什么是页分裂、页合并?
数据组织方式 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT)。 行数据,都是存储在聚集索引的叶子节点上的。而我们之前也讲解过InnoDB的逻辑结构图: 在I…...

软件2班20240513
第三次作业 package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) {ResourceBundle bundle ResourceBundle.getBundle("com/resources/db");// ctrl alt vString driver …...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...