不写一行代码,使用ChatGpt开发一个射击游戏

1.简介

最近需要开发一个网页应用,想到了使用ChatGpt生成Html页面,生成的效果非常好,说几句话就可以实现复杂的功能。不过需要一步步耐心的引导。然后我就想到可以用ChatGpt生成一个网页游戏。这个游戏包含了人物移动、跳跃、射击、生命值,敌人的生成、移动。还有金币掉落、商店功能。如下图所示:基本玩法
商店界面

2.环境介绍

  • ChatGpt:现在已经开放注册,不需要手机号了。如果由于网络环境访问不了,则可以用国内的大模型(比如Kimi、讯飞星火))代替,效果我没有测试,感兴趣的可以自己尝试一下。
  • VS Code:强大的文本编辑器,适合用来做网页开发。不过本项目其实不需要写代码,只要复制ChatGpt生成的代码保存就可以,所以使用记事本也满足需求了。
  • Edge浏览器:用来调试我们生成的游戏,有开发人员工具,很方便实用。

3.实现过程

刚开始是想实现一个简单的平台跳跃游戏,主角躲避敌人,营救公主获得胜利。后来我又加入了射击游戏的元素,可以击杀敌人。最后我增加了经济系统,可以获取和花费金币。

4.提示过程

以下是我引导ChatGpt的记录

  • 视频:
  • **

---------------------文字记录:---------------------

You:

  • 使用html+js实现一个用WASD或者方向键控制人物在画面中移动

ChatGPT:

  • 好的,我来为你提供一个简单的示例,使用HTML和JavaScript来实现通过WASD键或方向键来控制一个人物在画面中移动。我们将使用HTML来创建一个画布,然后在JavaScript中编写代码来控制人物的移动。

首先,让我们创建一个HTML文件,命名为index.html,在其中添加以下内容:

[代码省略]

接下来,我们创建JavaScript文件,命名为game.js,在其中添加以下内容:

[代码省略]

这段代码创建了一个简单的画布和一个蓝色的人物,然后监听键盘事件来控制人物的移动。按下W、A、S、D键或方向键即可控制人物上、下、左、右移动。

你可以将这两段代码保存到同一目录下,并在浏览器中打开index.html文件,即可看到效果。

3.5

You:

  • 在人物运动到边缘时,阻止其继续移动

ChatGPT:

  • 好的,我们可以对人物的移动进行边界检测,当人物触碰到画布的边缘时,阻止其继续移动。我来修改一下JavaScript代码:

[代码省略]

在代码中,我们在每次移动之前都检查了人物的位置,如果人物即将移动到画布的边缘,我们就阻止其继续移动。这样就可以确保人物不会超出画布边界。保存并运行这段代码,你将看到人物移动时会自动停止在画布边缘。

3.5

You:

  • 增加一个移动速度参数,用来控制人物的移动速度。取消按住按键到连续移动的延迟

ChatGPT:

  • 好的,我会添加一个移动速度参数,并取消按住按键时出现的连续移动延迟。我们可以通过使用setInterval函数来实现按住按键后的连续移动效果。下面是修改后的代码:

[代码省略]

在这个修改后的代码中,我们创建了一个keys对象来记录按键的状态,按键按下时设置为true,松开时设置为false。然后,我们在每帧中检查按键的状态,并根据按键状态来更新人物的位置。同时,我们使用setInterval函数来控制游戏循环,取消了按住按键时的连续移动延迟。

3.5

You:

  • 将游戏画布扩展,填充屏幕宽度,画布长宽比为16:9

ChatGPT:

  • 好的,让我们来调整画布的尺寸,使其填充整个屏幕,并保持16:9的长宽比。我会修改HTML和JavaScript代码来实现这一点。

首先,我们需要修改HTML文件index.html中的画布元素:

[代码省略]

接下来,我们修改JavaScript文件game.js中的相关代码,以确保画布具有16:9的长宽比,并填充整个屏幕:

[代码省略]

这样,我们的画布将会以16:9的长宽比填充整个屏幕,并且人物移动的控制功能将保持不变。

3.5

You:

  • 添加实时响应屏幕尺寸,改变画布的尺寸功能

ChatGPT:

  • 好的,让我们添加实时响应屏幕尺寸变化的功能,并在屏幕尺寸变化时改变画布的尺寸。这样可以确保画布始终填充整个屏幕,并且在窗口大小改变时保持比例。

我们需要在game.js文件中添加监听窗口大小变化的事件,并在事件触发时更新画布尺寸。下面是修改后的代码:

[代码省略]

现在,当窗口大小变化时,画布尺寸会自动调整以保持16:9的长宽比,并且人物的移动控制功能也会继续工作。

3.5

You:

  • 给人物添加持续的重力,按下上键或W键时,给人物施加一个向上的力

ChatGPT:

  • 好的,我们可以为人物添加一个重力效果,并在按下上键或W键时给人物施加一个向上的力。这样就可以模拟人物在空中跳跃的效果。

我们需要为人物添加一个垂直速度属性,以及一个表示重力的加速度属性。在每一帧更新人物的位置时,根据重力和施加的力来更新人物的垂直速度和位置。

下面是修改后的JavaScript代码:

[代码省略]

现在,当按下上键或W键时,人物会施加一个向上的力,并在空中跳跃,同时受到重力的作用。

3.5

You:

  • 请把左右移动的逻辑保留。添加一个红色方块代表敌人,玩家方块碰到敌人方块就会失败。游戏失败时显示一个重新开始的界面,该界面包括失败文字和重新开始按钮,点击重新开始则重置到初始状态

ChatGPT:

  • 好的,我们来添加一个敌人方块,当玩家方块碰到敌人方块时显示一个重新开始的界面。我们还会保留左右移动的逻辑,并且在玩家失败时提供一个重新开始按钮。

首先,我们需要在HTML文件index.html中添加一个隐藏的重新开始界面:

[代码省略]

接下来,我们修改JavaScript文件game.js,添加敌人方块和重新开始逻辑:

[代码省略]

这样,当玩家方块碰到敌人方块时,会显示一个重新开始的界面。点击重新开始按钮后,游戏将重置到初始状态。

4o

You:

  • 画布中间添加一段阶梯,玩家可以跳上阶梯,到达画布中心的位置。右下角放置一个绿色方块,触碰到绿色方块后,游戏胜利。游戏胜利后显示一个胜利界面,包含游戏胜利的文字,和重新开始的按钮

ChatGPT:

  • 好的,让我们在游戏中添加一个阶梯,放置一个绿色的胜利方块,并在玩家触碰到绿色方块后显示一个胜利界面。我们需要在HTML文件中添加一个新的胜利界面,同时修改JavaScript文件以实现这些功能。

首先,修改HTML文件index.html,添加一个新的胜利界面:

[代码省略]

接下来,修改JavaScript文件game.js,添加阶梯、胜利方块和胜利逻辑:

[代码省略]

现在,当玩家方块碰到敌人方块时,会显示一个重新开始的界面,当玩家触碰到绿色方块时,会显示一个胜利界面。点击重新开始按钮后,游戏将重置到初始状态。

4o

You:

  • 红色方块替换成骷髅的emoji,在游戏开始后,会追赶玩家。玩家增加生命值属性,初始有三点生命值,每次碰到骷髅emoji就会损失一点生命值。玩家的生命值使用红色爱心emoji,显示在屏幕的左上方

ChatGPT:

  • 好的,我们可以添加生命值系统,并用红色爱心Emoji显示在屏幕的左上方。骷髅Emoji会追赶玩家,每次碰到玩家会减少玩家的生命值,生命值为0时显示失败界面。

首先,我们需要确保在HTML文件中设置了字体以支持Emoji。然后,我们在JavaScript文件中实现这些功能。

修改后的HTML文件index.html如下:

[代码省略]

修改后的JavaScript文件game.js如下:

[代码省略]

现在,当玩家碰到骷髅Emoji时,生命值减少并显示在左上角。如果生命值降至0,显示失败界面。触碰绿色方块后显示胜利界面,并提供重新开始的选项。

4o

You:

  • 将玩家方块替换成🥷,绿色方块替换为👸,删除中间的阶梯。保留之前按键功能,新增按下J键或者Z键时,从玩家方块位置向鼠标所在位置发射一个匕首emoji,匕首emoji触碰到画布边缘会消失,触碰到敌人则将敌人消灭。每过3秒就生成一个新的敌人追赶玩家

ChatGPT:

  • 好的,我们可以将玩家和目标方块替换成Emoji,同时添加发射匕首的功能,以及每过3秒生成一个新的敌人追赶玩家。我们会删除中间的阶梯,保持之前的按键功能,并且处理发射匕首的逻辑。

下面是修改后的HTML文件index.html

[代码省略]

修改后的JavaScript文件game.js如下:

[代码省略]

在这个版本中,我们实现了以下功能:

  1. 使用🥷作为玩家方块,使用👸作为目标方块。
  2. 添加了发射匕首的功能,按下J键或者Z键时,从玩家位置向鼠标位置发射匕首Emoji🗡️。
  3. 每3秒生成一个新的敌人追赶玩家。
  4. 玩家碰到敌人会减少生命值,生命值为0时显示失败界面。
  5. 玩家触碰目标方块时显示胜利界面。

4o

You:

  • 敌人生成位置应该至少距离玩家5个身位。每过10秒钟,敌人的生命值就会增加1。增加一个积分参数,记录玩家击杀的敌人数量。敌人被消灭后有20%概率会生成一个有钱袋emoji,钱袋拥有重力。当玩家接近钱袋1个身位时,钱袋会飞向玩家。钱袋触碰到玩家时,增加玩家的金币,金币数量最少为1个,并会随着游戏时长线性增长。增加一个积分UI和金币数量UI。点击金币数量UI时,打开一个商店面板。商店面板有标题、关闭按钮和一个升级物品列表。玩家花费金币可以在商店中购买生命值升级、移动速度升级、匕首伤害升级、敌人减速升级、金币数量升级

ChatGPT:

  • 添加这些新功能需要多方面的修改,包括敌人生成、敌人属性、积分和金币系统,以及UI界面和商店功能的实现。下面是详细的实现步骤:

修改HTML文件

增加一个商店面板和UI显示部分:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人物移动控制</title>
<style>body, html {margin: 0;padding: 0;overflow: hidden;display: flex;justify-content: center;align-items: center;height: 100%;background-color: #f0f0f0;}canvas {display: block;margin: 0 auto;background-color: #ffffff;}#gameOver, #gameWin, #shopPanel {display: none;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);text-align: center;}#gameOver button, #gameWin button, #shopPanel button {margin-top: 20px;padding: 10px 20px;font-size: 16px;}#life, #score, #gold {position: absolute;top: 10px;font-size: 24px;}#life { left: 10px; }#score { left: 120px; }#gold { left: 230px; cursor: pointer; }#shopPanel {background-color: white;padding: 20px;border: 2px solid black;}#shopPanel h1 { margin: 0; }#shopPanel ul { list-style: none; padding: 0; }#shopPanel li { margin: 10px 0; }
</style>
</head>
<body>
<canvas id="gameCanvas"></canvas>
<div id="gameOver"><h1>游戏失败</h1><button onclick="restartGame()">重新开始</button>
</div>
<div id="gameWin"><h1>游戏胜利</h1><button onclick="restartGame()">重新开始</button>
</div>
<div id="shopPanel"><h1>商店</h1><button onclick="closeShop()">关闭</button><ul id="shopItems"><!-- 升级物品列表 --></ul>
</div>
<div id="life"></div>
<div id="score"></div>
<div id="gold" onclick="openShop()"></div>
<script src="game.js"></script>
</body>
</html>

修改JavaScript文件

添加和修改必要的功能实现。

// 获取画布和上下文
var canvas = document.getElementById("gameCanvas");
var ctx = canvas.getContext("2d");// 获取UI元素
var gameOverScreen = document.getElementById("gameOver");
var gameWinScreen = document.getElementById("gameWin");
var lifeDisplay = document.getElementById("life");
var scoreDisplay = document.getElementById("score");
var goldDisplay = document.getElementById("gold");
var shopPanel = document.getElementById("shopPanel");
var shopItems = document.getElementById("shopItems");// 设置画布尺寸
var aspectRatio = 16 / 9; // 16:9的长宽比function resizeCanvas() {var screenWidth = window.innerWidth;var screenHeight = window.innerHeight;// 根据长宽比调整画布尺寸if (screenWidth / screenHeight > aspectRatio) {canvas.width = screenHeight * aspectRatio;canvas.height = screenHeight;} else {canvas.width = screenWidth;canvas.height = screenWidth / aspectRatio;}// 居中画布canvas.style.marginTop = (screenHeight - canvas.height) / 2 + "px";canvas.style.marginLeft = (screenWidth - canvas.width) / 2 + "px";
}// 初始化画布尺寸
resizeCanvas();// 监听窗口大小变化事件
window.addEventListener("resize", function() {resizeCanvas();
});// 定义玩家对象
var player = {x: canvas.width / 2,y: canvas.height - 50, // 开始时放在地面width: 50,height: 50,speed: 5,gravity: 0.2, // 重力加速度velocityY: 0, // 垂直速度life: 3, // 生命值gold: 0 // 金币数量
};// 定义敌人对象列表
var enemies = [];// 定义匕首对象列表
var daggers = [];// 定义钱袋对象列表
var bags = [];// 定义胜利对象
var goal = {x: canvas.width - 70,y: canvas.height - 70,width: 50,height: 50
};// 定义键盘状态对象,用于记录按键状态
var keys = {};// 游戏状态
var gameOver = false;
var gameWin = false;// 积分
var score = 0;// 监听键盘按下和松开事件
document.addEventListener("keydown", function(event) {keys[event.key] = true;// 监听J键或者Z键发射匕首if (event.key === "j" || event.key === "z") {shootDagger(event);}
});document.addEventListener("keyup", function(event) {keys[event.key] = false;
});// 监听鼠标点击事件,获取鼠标位置
canvas.addEventListener("click", shootDagger);// 更新生命值显示
function updateLifeDisplay() {var lifeText = "";for (var i = 0; i < player.life; i++) {lifeText += "❤️";}lifeDisplay.innerHTML = lifeText;
}// 更新积分显示
function updateScoreDisplay() {scoreDisplay.innerHTML = `积分: ${score}`;
}// 更新金币显示
function updateGoldDisplay() {goldDisplay.innerHTML = `金币: ${player.gold}`;
}// 检查碰撞函数
function checkCollision(rect1, rect2) {return (rect1.x < rect2.x + rect2.width &&rect1.x + rect1.width > rect2.x &&rect1.y < rect2.y + rect2.height &&rect1.y + rect1.height > rect2.y);
}// 更新人物位置函数
function update() {if (gameOver || gameWin) return;// 应用重力player.velocityY += player.gravity;// 根据按键调整人物位置if ((keys["ArrowUp"] || keys["w"]) && player.y >= canvas.height - player.height) {// 当按下上键或W键且人物在地面上时,施加向上的力player.velocityY = -8; // 设置一个较大的向上速度,模拟跳跃效果}if (keys["ArrowLeft"] || keys["a"]) {if (player.x > 0) {player.x -= player.speed;}}if (keys["ArrowRight"] || keys["d"]) {if (player.x + player.width < canvas.width) {player.x += player.speed;}}// 更新人物的垂直位置player.y += player.velocityY;// 确保人物在画布内部if (player.y > canvas.height - player.height) {player.y = canvas.height - player.height;player.velocityY = 0;}// 更新敌人位置和生命值enemies.forEach(enemy => {if (enemy.x < player.x) {enemy.x += enemy.speed;} else {enemy.x -= enemy.speed;}if (enemy.y < player.y) {enemy.y += enemy.speed;} else {enemy.y -= enemy.speed;}// 检查与敌人的碰撞if (checkCollision(player, enemy)) {player.life -= 1;updateLifeDisplay();if (player.life <= 0) {gameOver = true;gameOverScreen.style.display = "block";} else {// 重置玩家位置player.x = canvas.width / 2;player.y = canvas.height - 50;player.velocityY = 0;}}});// 更新匕首位置daggers.forEach((dagger, index) => {dagger.x += dagger.vx;dagger.y += dagger.vy;// 移除超过边界的匕首if (dagger.x < 0 || dagger.x > canvas.width || dagger.y < 0 || dagger.y > canvas.height) {daggers.splice(index, 1);}// 检查匕首与敌人的碰撞enemies.forEach((enemy, enemyIndex) => {if (checkCollision(dagger, enemy)) {// 减少敌人生命值enemy.life -= dagger.damage;if (enemy.life <= 0) {enemies.splice(enemyIndex, 1);score += 1;updateScoreDisplay();// 20%概率生成钱袋if (Math.random() < 0.2) {spawnBag(enemy.x, enemy.y);}}daggers.splice(index, 1);}});});// 更新钱袋位置bags.forEach((bag, index) => {bag.y += bag.gravity;// 检查钱袋与玩家的距离var dx = bag.x - player.x;var dy = bag.y - player.y;var distance = Math.sqrt(dx * dx + dy * dy);if (distance < player.width) {bag.vx = (player.x - bag.x) / distance * 5;bag.vy = (player.y - bag.y) / distance * 5;bag.x += bag.vx;bag.y += bag.vy;}// 检查钱袋与玩家的碰撞if (checkCollision(player, bag)) {player.gold += bag.value;updateGoldDisplay();bags.splice(index, 1);}});// 检查与胜利方块的碰撞if (checkCollision(player, goal)) {gameWin = true;gameWinScreen.style.display = "block";}
}// 发射匕首函数
function shootDagger(event) {if (gameOver || gameWin) return;var rect = canvas.getBoundingClientRect();var mouseX = event.clientX - rect.left;var mouseY = event.clientY - rect.top;var angle = Math.atan2(mouseY - player.y, mouseX - player.x);var dagger = {x: player.x,y: player.y,width: 20,height: 20,vx: Math.cos(angle) * 10,vy: Math.sin(angle) * 10,damage: 1 // 匕首初始伤害};daggers.push(dagger);
}// 渲染函数,用于绘制人物、敌人、匕首、钱袋和胜利方块
function draw() {if (gameOver || gameWin) return;// 清除画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 绘制人物ctx.font = "50px Arial";ctx.fillText("🥷", player.x, player.y + player.height);// 绘制敌人(骷髅emoji)enemies.forEach(enemy => {ctx.fillText("💀", enemy.x, enemy.y + enemy.height);});// 绘制胜利方块(👸)ctx.fillText("👸", goal.x, goal.y + goal.height);// 绘制匕首daggers.forEach(dagger => {ctx.fillText("🗡️", dagger.x, dagger.y + dagger.height);});// 绘制钱袋bags.forEach(bag => {ctx.fillText("💰", bag.x, bag.y + bag.height);});
}// 生成新敌人
function spawnEnemy() {if (gameOver || gameWin) return;// 确保敌人生成位置距离玩家至少5个身位var newEnemy;do {newEnemy = {x: Math.random() * (canvas.width - 50),y: Math.random() * (canvas.height - 50),width: 50,height: 50,speed: 2, // 敌人速度life: 1 // 敌人初始生命值};} while (Math.abs(newEnemy.x - player.x) < player.width * 5 && Math.abs(newEnemy.y - player.y) < player.height * 5);enemies.push(newEnemy);
}// 生成钱袋
function spawnBag(x, y) {var newBag = {x: x,y: y,width: 30,height: 30,gravity: 0.1,value: Math.floor(Math.random() * (player.gold + 1) + 1), // 金币数量随着游戏时长线性增长vx: 0,vy: 0};bags.push(newBag);
}// 每10秒增加敌人的生命值
function increaseEnemyLife() {enemies.forEach(enemy => {enemy.life += 1;});
}// 主循环
function gameLoop() {// 更新人物位置update();// 渲染画面draw();
}// 启动游戏循环,取消按住按键的连续移动延迟
setInterval(gameLoop, 1000 / 60);// 每3秒生成一个新的敌人
setInterval(spawnEnemy, 3000);// 每10秒增加敌人的生命值
setInterval(increaseEnemyLife, 10000);// 重新开始游戏函数
function restartGame() {player.x = canvas.width / 2;player.y = canvas.height - 50;player.velocityY = 0;player.life = 3;player.gold = 0;score = 0;updateLifeDisplay();updateScoreDisplay();updateGoldDisplay();enemies = [];daggers = [];bags = [];spawnEnemy(); // 立即生成一个敌人gameOver = false;gameWin = false;gameOverScreen.style.display = "none";gameWinScreen.style.display = "none";
}// 打开商店面板
function openShop() {shopPanel.style.display = "block";
}// 关闭商店面板
function closeShop() {shopPanel.style.display = "none";
}// 购买升级物品函数
function buyUpgrade(type) {switch(type) {case 'life':if (player.gold >= 10) {player.gold -= 10;player.life += 1;updateLifeDisplay();updateGoldDisplay();}break;case 'speed':if (player.gold >= 10) {player.gold -= 10;player.speed += 1;updateGoldDisplay();}break;case 'dagger':if (player.gold >= 10) {player.gold -= 10;daggers.forEach(dagger => dagger.damage += 1);updateGoldDisplay();}break;case 'enemySlow':if (player.gold >= 10) {player.gold -= 10;enemies.forEach(enemy => enemy.speed -= 0.5);updateGoldDisplay();}break;case 'gold':if (player.gold >= 10) {player.gold -= 10;player.gold += Math.floor(Math.random() * 10 + 1);updateGoldDisplay();}break;}
}// 初始化商店物品列表
function initShopItems() {shopItems.innerHTML = `<li><button οnclick="buyUpgrade('life')">生命值升级 (10金币)</button></li><li><button οnclick="buyUpgrade('speed')">移动速度升级 (10金币)</button></li><li><button οnclick="buyUpgrade('dagger')">匕首伤害升级 (10金币)</button></li><li><button οnclick="buyUpgrade('enemySlow')">敌人减速升级 (10金币)</button></li><li><button οnclick="buyUpgrade('gold')">金币数量升级 (10金币)</button></li>`;
}// 初始化游戏
function initGame() {resizeCanvas();updateLifeDisplay();updateScoreDisplay();updateGoldDisplay();initShopItems();spawnEnemy();
}// 启动游戏
initGame();

解释

  • UI显示与交互 :增加了生命值、积分和金币的UI显示,以及商店面板和相关交互逻辑。
  • 敌人生成 :每3秒生成一个新敌人,确保生成位置距离玩家至少5个身位。每10秒增加所有敌人的生命值。
  • 钱袋逻辑 :匕首消灭敌人后有20%的概率生成钱袋,钱袋受重力影响,并会向靠近的玩家飞去。玩家碰到钱袋后增加金币。
  • 商店系统 :点击金币UI可以打开商店面板,玩家可以花费金币购买各种升级。
  • 其他改动 :保留了之前的键盘控制和匕首发射逻辑,并在玩家碰到胜利目标或生命值为0时显示相应界面。

5.总结

最后实现的游戏虽然比较简陋,但是已经可以看出ChatGpt的无限潜力,相信在不不久的将来,可以不用写代码也能生成出有趣而又复杂的游戏出来。

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

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

相关文章

02Django项目安装和环境变量设置

凯哥英语视频 Django项目安装和环境变量设置 凯哥英语视频1.汉化1.打开PyCharm&#xff0c;点击File&#xff0c;再点击Settings2.然后点击 Plugins&#xff0c;再Marketplace&#xff0c;找到Chinese&#xff08;simplified&#xff09;Language&#xff0c;再点击Install然后…

GPT-4o: 从最难的“大海捞针”基准看起

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果…

基于EBAZ4205矿板的图像处理:12二值化图像的膨胀与腐蚀

基于EBAZ4205矿板的图像处理&#xff1a;12二值化图像的膨胀与腐蚀 先看效果 注意&#xff1a;我的项目中的膨胀和腐蚀是对二值化图像中的像素值为255的像素进行处理&#xff0c;而我的图像中255为白色&#xff0c;0为黑色&#xff0c;所以是对颜色为白色的像素点进行的膨胀和…

Google I/O 2024:有关AI的一切已公布|TodayAI

2024年谷歌I/O大会圆满落幕&#xff0c;谷歌在会上发布了一系列更新&#xff0c;涵盖从最新的人工智能技术到Android系统的多项改进。此次大会特别关注于谷歌的Gemini人工智能模型&#xff0c;并详细介绍了这些模型如何被融入到Workspace、Chrome等多个应用程序中&#xff0c;展…

男士内裤哪个牌子质量好又舒服?五款不容错过的男士内裤

男士内裤&#xff0c;作为男士日常穿着的重要贴身衣物&#xff0c;其舒适度和透气性至关重要。尽管有些男士可能习惯长时间穿着同一条内裤&#xff0c;但为了确保健康和舒适&#xff0c;建议每3-6个月更换一次内裤。长时间不更换内裤会导致其舒适性和透气性下降&#xff0c;同时…

性价比王者HUSB237,极简PD Sink的“瘦身秘籍”

在小型化、高集成的要求下&#xff0c;慧能泰取电芯片进行技术升级后“瘦身成功”&#xff0c;推出最新一代极具性价比的最简PD Sink取电芯片——HUSB237。 图1&#xff1a;HUSB237 demo及封装图 HUSB237 是一款极具性价比的最简PD Sink取电芯片&#xff0c;支持PD3.1协议包含…

算法课程笔记——蓝桥云课第11次直播

算法课程笔记——蓝桥云课第11次直播

收藏与品鉴:精酿啤酒的艺术之旅

啤酒&#xff0c;这一古老的酒精饮品&#xff0c;不仅是人们生活中的日常饮品&#xff0c;更是一种艺术和文化的载体。对于Fendi club啤酒而言&#xff0c;收藏与品鉴更是一门深入骨髓的艺术之旅。 Fendi club啤酒的收藏&#xff0c;不仅仅是简单的存放和保管&#xff0c;而是一…

交换机组网最常见的8大故障及解决方式

有朋友多次提到网络故障&#xff0c;其中在交换机组网时常见的故障比较多&#xff0c;为了便于大家排除这些故障&#xff0c;在此介绍一些常见的典型故障案例及处理思路。 故障1&#xff1a;交换机刚加电时网络无法通信 【故障现象】 交换机刚刚开启的时候无法连接至其他网络…

k8s StatefulSet

Statefulset 一个 Statefulset 创建的每个pod都有一个从零开始的顺序索引&#xff0c;这个会体现在 pod 的名称和主机名上&#xff0c;同样还会体现在 pod 对应的固定存储上。这些 pod 的名称是可预知的&#xff0c;它是由 Statefulset 的名称加该实例的顺序索引值组成的。不同…

现货黄金在线交易有哪些优势_EE trade

现货黄金在线交易拥有几项独特优势&#xff0c;使其成为广受投资者青睐的贵金属投资方式&#xff1a; 1. 全天候交易 现货黄金市场几乎可以实现24小时不间断交易&#xff0c;投资者可以根据全球市场的变动随时参与交易&#xff0c;这提供了极大的灵活性和即时反应市场变化的能…

Nginx+Keepalived高可用集群

NginxKeepalived高可用集群 服务器准备 服务器名IP软件包主从n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTERn2RIP192.168.99.122 VIP 192.168.99.200nginx keepalivedh1RIP 192.168.99.133 VIP 192.168.99.200httpdh2RIP 192.168.32.144 VIP 192.168.99.200h…

从入门到精通:.gitlab-ci.yml文件的完整指南

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 从入门到精通&#xff1a;.gitlab-ci.yml文件的完整指南 前言.gitlab-ci.yml文件概述stagesimagesbefore_script和after_scripttagsonly和exceptonly关键字except关键字 artifacts使用方式产物路径其他…

写一个类ChatGPT应用,前后端数据交互有哪几种

❝ 对世界的态度&#xff0c;本质都是对自己的态度 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder 前言 最近&#xff0c;公司有一个AI项目&#xff0c;要做一个文档问答的AI产品。前端部分呢&#xff0c;还是「友好借鉴」Cha…

16.ABA问题

文章目录 ABA问题1.什么是ABA问题&#xff1f;2.ABA问题解决方案2.1.使用AtomicStampedReference解决ABA问题2.2.使用AtomicMarkableReference解决ABA问题 ABA问题 因为CAS操作的原子性能高&#xff0c;在JUC中广泛被应用&#xff0c;但是如果使用的不合理&#xff0c;CAS操作就…

数据结构【顺序表】

文章目录 1.顺序表的概念线性表物理结构逻辑结构 2.顺序表的分类2.1静态顺序表2.2动态顺序表 3.顺序表接口的实现头文件(SQList.h)如下源文件初始化顺序表销毁顺序表插入扩容尾插头插 封装扩容函数删除尾删头删 查找元素在指定位置前插入数据情况一(指定的位置不是首元素)情况二…

JAVA面试库

1、基础 1.1、面向对象编程有哪些特性 1、抽象 抽象就是对同一个目标的共有的属性、特征、方法、功能、行为等进行抽取并归纳总结&#xff0c;它是一种将复杂现实简单化为模型的过程&#xff0c;它关注的是对象行为&#xff0c;而不用关注具体的实现细节。 在面向对象编程中…

中关村论坛 | 区块链与隐私计算论坛倒计时1天!

「区块链与隐私计算论坛」 倒计时1天&#xff01; 地址&#xff1a;中关村国家自主创新示范区会议中心&#xff08;新建宫门路2号&#xff09;万春厅 时间&#xff1a;2024年4月27日&#xff0c;下午14:30-17:00 本次论坛围绕释放数据要素价值深入探讨如何将区块链与隐私计算…

【Docker学习】查询容器镜像的docker search

这个命令是使用Docker的必备技能。我们使用的各种官方镜像&#xff0c;一般都能通过这个命令找到。 命令&#xff1a; docker search 描述&#xff1a; 在Docker Hub上查找镜像。Docker Hub是为开发者和开源贡献者设计的容器镜像注册中心&#xff0c;它允许用户查找、使用和…

MySQL中order by排序时,数据存在null,排序在最前面

order by排序是最常用的功能&#xff0c;但是排序有时会遇到数据为空null的情况&#xff0c;这样排序就会乱了&#xff0c;这里以MySQL为例&#xff0c;记录我遇到的问题和解决思路。 sql 排序为 null 值问题&#xff1a; 排序时我们用 receive_date(一个统计的时间&#xff…