【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏
文章目录
- 前言
- 开始项目
- 网格生成
- Block方块脚本
- 俄罗斯方块基类,绘制方块形状
- 移动逻辑
- 限制移动
- 自由下落
- 下落后设置对应风格为不可移动类型
- 检查当前方块是否可以向指定方向移动
- 旋转逻辑
- 消除逻辑
- 游戏结束逻辑
- 怪物生成
- 源码
- 参考
- 完结
前言
当今游戏产业中,经典游戏的复刻一直是一项受欢迎且具有挑战性的任务。俄罗斯方块是一个深入人心、令人上瘾的经典游戏,在过去几十年里一直享有广泛的流行度。其简单而富有策略性的玩法吸引了无数玩家的关注。因此,我决定利用Unity引擎来复刻这款经典游戏,以让更多的人重新体验其中的乐趣。
通过使用Unity引擎,我能够利用其强大的工具和功能,从头开始构建一个与原版俄罗斯方块游戏相似的游戏。我将努力保持原版游戏的核心要素,包括七种不同形状的方块(俄罗斯方块),玩家可以通过旋转和移动这些方块来填充完整的水平行,完成消除并得分的目标。
除了保留原版玩法外,我还计划为游戏添加一些额外的功能和改进。例如,增加多样化的难度级别,使得游戏适合任何玩家的技能水平。我还计划添加特殊的道具或技能,使游戏更加丰富有趣。此外,我还将注重游戏的视觉效果和音效,以提升玩家的沉浸感。
我的目标是创造一个令人难以抗拒的游戏体验,让玩家们在回忆经典之余,也能感受到崭新的乐趣。无论是单人挑战高分,还是与朋友们一较高下,这个复刻版的俄罗斯方块游戏都将带给玩家们小时候的回忆和喜悦。
我非常兴奋能够应用Unity引擎来实现这个愿望,并期待将来能与大家分享这款复刻版俄罗斯方块游戏。在这个过程中,我将努力改进和完善游戏,以确保它可以在各种平台上流畅运行,并为玩家们带来最佳的游戏体验。
谢谢大家的支持和关注!让我们一起回味经典,畅享游戏的乐趣吧!
先来看看实现的最终效果
开始项目
链接:https://pan.baidu.com/s/1BMlwclVV2gOdnNppSc7v6A
提取码:hxfs
网格生成
泛型单例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SingleBase<T> : MonoBehaviour where T : class
{public static T Instance;protected virtual void Awake(){Instance = this as T;}
}
游戏管理类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameManager : SingleBase<GameManager>
{protected override void Awake(){base.Awake();}private void Start(){OnStartGame();}//开始游戏void OnStartGame(){//网格生成MapManager.Instance.InitMap();}
}
简单工厂类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///<summary>
//简单工厂
///</summary>
public static class SimpleFactory
{//创建Resources/Model中的物体public static GameObject CreateModel(string name, Transform parent){return Object.Instantiate(Resources.Load("Model/" + name), parent) as GameObject;}
}
网格地图生成
//常量类
public static class Defines
{public static readonly int RowCount = 15;//网格行数public static readonly int ColCount = 10;//网格列数public static readonly float Offset = 0.9f;//格子间隔
}
网格地图管理器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//网格地图管理器
public class MapManager : SingleBase<MapManager>
{//初始化网格地图public void InitMap(){for (int row = 0; row < Defines.RowCount; row++){for (int col = 0; col < Defines.ColCount; col++){GameObject obj = SimpleFactory.CreateModel("block", transform);obj.transform.localPosition = new Vector3(col * Defines.Offset, -row * Defines.Offset, 0);}}}
}
挂载GameManager和MapManager
运行效果
Block方块脚本
新建Block 方块脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public enum BlockType
{Empty,//空Static,//不动Model,//模型
}//方块脚本
public class Block : MonoBehaviour
{public BlockType type;public int RowIndex;public int ColIndex;public SpriteRenderer sp;public Sprite normalSprite;//默认的图片public Sprite modelSprite;//怪物图片public void Init(int row, int col, BlockType type){this.type = type;this.RowIndex = row;this.ColIndex = col;}private void Awake(){sp = GetComponent<SpriteRenderer>();normalSprite = sp.sprite;modelSprite = Resources.Load<Sprite>("Icon/gbl");}private void Start(){SetTypeToSp();}public void SetTypeToSp(){switch (this.type){case BlockType.Empty:sp.sprite = normalSprite;sp.color = Color.white;break;case BlockType.Static:sp.color = Color.red;break;case BlockType.Model:sp.sprite = modelSprite;sp.color = Color.white;break;}}
}
网格地图管理器MapManager 调用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//网格地图管理器
public class MapManager : SingleBase<MapManager>
{public Block[,] blockArr;//初始化网格地图public void InitMap(){blockArr = new Block[Defines.RowCount,Defines.ColCount];for (int row = 0; row < Defines.RowCount; row++){for (int col = 0; col < Defines.ColCount; col++){GameObject obj = SimpleFactory.CreateModel("block", transform);obj.transform.localPosition = new Vector3(col * Defines.Offset, -row * Defines.Offset, 0);Block b = obj.AddComponent<Block>();b.Init(row, col, BlockType.Model);//存储到二维数组blockArr[row, col] = b;}}}
}
运行效果
俄罗斯方块基类,绘制方块形状
MapManager新增方法
//切换对应下标的方块的类型
public void ChangeType(int row, int col, BlockType type)
{Block b = blockArr[row, col];b.type = type;b.SetTypeToSp();
}
俄罗斯方块基类
//俄罗斯方块基类
public class TetrisBase
{public int rowIndex;//对应整个网格的行坐标public int colIndex;//对应整个网格的列坐标public int rowCount;//存储形状的行总数public int colCount;//存储形状的列总数public BlockType[,] blockArr;//存储枚举的二维数组//初始化public virtual void Init(){}//画自己(更改网格对应的图片精灵)public virtual void DrawMe(){for (int row = 0; row < rowCount; row++){for (int col = 0; col < colCount; col++){if (blockArr[row, col] != BlockType.Empty){int map_rowIndex = rowIndex + row;int map_colIndex = colIndex + col;MapManager.Instance.ChangeType(map_rowIndex, map_colIndex, blockArr[row, col]);}}}}//擦除自己public virtual void WipeMe(){for (int row = 0; row < rowCount; row++){for (int col = 0; col < colCount; col++){if (blockArr[row, col] != BlockType.Empty){int map_rowIndex = rowIndex + row;int map_colIndex = colIndex + col;MapManager.Instance.ChangeType(map_rowIndex, map_colIndex, BlockType.Empty);}}}}//向下移动public virtual void MoveDown(){rowIndex++;}//左移动public virtual void MoveLeft(){colIndex--;}//右移动public virtual void MoveRight(){colIndex++;}
}
T形状的俄罗斯方块
//T形状的俄罗斯方块
public class Tetris_T : TetrisBase
{public override void Init(){rowCount = 2;colCount = 3;blockArr = new BlockType[,]{{BlockType.Model,BlockType.Model,BlockType.Model},{BlockType.Empty,BlockType.Model,BlockType.Empty}};}
}
GameManager调用,绘制方块形状
TetrisBase currentTetris;//当前操作的俄罗斯//开始游戏
void OnStartGame()
{//网格生成MapManager.Instance.InitMap();currentTetris = CreateTetris();//画出来currentTetris.DrawMe();
}//创建
TetrisBase CreateTetris()
{TetrisBase t = new Tetris_T();t.Init();t.colIndex = Defines.ColCount / 2 - t.colCount / 2;return t;
}
效果
移动逻辑
定义移动方向枚举
//移动方向
public enum Direction
{None,Right,Left,Down
}
修改俄罗斯方块基类TetrisBase
//根据方向移动
public virtual void MoveByDir(Direction dir)
{//擦除自己WipeMe();switch (dir){case Direction.None:break;case Direction.Right:MoveRight();break;case Direction.Left:MoveLeft();break;case Direction.Down:MoveDown();break;}DrawMe();//画自己
}
GameManager新增用户操作
void Update(){InputCtl();
}
//用户操作
public void InputCtl()
{if (Input.GetKeyDown(KeyCode.A))currentTetris.MoveByDir(Direction.Left);if (Input.GetKeyDown(KeyCode.D))currentTetris.MoveByDir(Direction.Right);if (Input.GetKeyDown(KeyCode.S))currentTetris.MoveByDir(Direction.Down);
}
运行效果
限制移动
俄罗斯方块基类TetrisBase新增方法
//是否能移动的方向
public virtual bool IsCanMove(Direction dir)
{int _rowIndex = rowIndex;int _colIndex = colIndex;switch (dir){case Direction.None:break;case Direction.Right:_colIndex++;break;case Direction.Left:_colIndex--;break;case Direction.Down:_rowIndex++;break;}//超出网格if (_colIndex < 0 || _colIndex + colCount > Defines.ColCount || _rowIndex + rowCount > Defines.RowCount){return false;}return true;
}
GameManager调用
//用户操作
public void InputCtl()
{if (Input.GetKeyDown(KeyCode.A)){if (currentTetris.IsCanMove(Direction.Left)){currentTetris.MoveByDir(Direction.Left);}}if (Input.GetKeyDown(KeyCode.D)){if (currentTetris.IsCanMove(Direction.Right)){currentTetris.MoveByDir(Direction.Right);}}if (Input.GetKeyDown(KeyCode.S)){if (currentTetris.IsCanMove(Direction.Down)){currentTetris.MoveByDir(Direction.Down);}}
}
运行效果
自由下落
Defines新增常用类
public static readonly float downTime = 1;//下落时间间隔
修改GameManager
float timer;//开始游戏
void OnStartGame()
{timer = Defines.downTime;
}
void Update()
{AutoMoveDown();
}//自动下落
public void AutoMoveDown()
{timer -= Time.deltaTime;if (timer <= 0){timer = Defines.downTime;if (currentTetris.IsCanMove(Direction.Down)){currentTetris.MoveByDir(Direction.Down);}else{//不能移动重新创建currentTetris = CreateTetris();currentTetris.DrawMe();}}
}
效果
下落后设置对应风格为不可移动类型
MapManager新增方法
//设置不可移动后的俄罗斯方块对应的位置为Static类型
public void SetStatic(TetrisBase t)
{for (int row = 0; row < t.rowCount; row++){for (int col = 0; col < t.colCount; col++){if (t.blockArr[row, col] != BlockType.Empty){int map_rowIndex = row + t.rowIndex;int map_colIndex = col + t.colIndex;ChangeType(map_rowIndex, map_colIndex, BlockType.Static);}}}
}
GameManager调用
if (!currentTetris.IsCanMove(Direction.Down))
{//设置不可移动类型MapManager.Instance.SetStatic(currentTetris);
}
运行效果
检查当前方块是否可以向指定方向移动
解决方块下落重叠的问题
修改俄罗斯方块基类TetrisBase的IsCanMove方法
遍历当前方块的每个单元格,如果单元格不为空且对应最近的地图单元格是静态的(即已经被其他方块占据),则返回false表示不能移动,否则返回true表示可以移动
//是否能移动的方向
public virtual bool IsCanMove(Direction dir)
{int _rowIndex = rowIndex;int _colIndex = colIndex;switch (dir){case Direction.None:break;case Direction.Right:_colIndex++;break;case Direction.Left:_colIndex--;break;case Direction.Down:_rowIndex++;break;}//超出网格if (_colIndex < 0 || _colIndex + colCount > Defines.ColCount || _rowIndex + rowCount > Defines.RowCount){return false;}//检查当前方块是否可以向指定方向移动for (int row = 0; row < rowCount; row++){for (int col = 0; col < colCount; col++){if (blockArr[row, col] != BlockType.Empty){int map_rowIndex = _rowIndex + row;int map_colIndex = _colIndex + col;Block b = MapManager.Instance.blockArr[map_rowIndex, map_colIndex];if (b.type == BlockType.Static){return false;}}}}return true;
}
效果
旋转逻辑
TetrisBase俄罗斯方块基类新增控制旋转方法
//旋转
public void Rotate()
{//二维数组互换int new_rowCount = colCount;int new_colCount = rowCount;//互换行列后是否超出网格if (rowIndex + new_rowCount > Defines.RowCount || colIndex + new_colCount > Defines.ColCount) return;BlockType[,] tempArr = new BlockType[new_rowCount, new_colCount];for (int row = 0; row < new_rowCount; row++){for (int col = 0; col < new_colCount; col++){tempArr[row, col] = blockArr[new_colCount - 1 - col, row];if (tempArr[row, col] != BlockType.Empty){//对应位置是静态类型static不能旋转if (MapManager.Instance.blockArr[row + this.rowIndex, col + this.colIndex].type == BlockType.Static) return;}}}//擦除WipeMe();rowCount = new_rowCount;colCount = new_colCount;blockArr = tempArr;DrawMe();//画
}
GameManager调用
if (Input.GetKeyDown(KeyCode.W)) currentTetris.Rotate();
效果
消除逻辑
GameManager新增方法
# 调用
//检测删除行
CheckDelete();//检测删除行
public void CheckDelete()
{//最后一行开始遍历for (int row = Defines.RowCount - 1; row >= 0; row--){int count = 0;//静态类型的个数for(int col = 0; col < Defines.ColCount; col++){BlockType type = MapManager.Instance.blockArr[row, col].type;if (type == BlockType.Static)count++;}if(count == Defines.ColCount){for (int dropRow = row; dropRow > 1; dropRow--){for (int dropCol = 0; dropCol < Defines.ColCount; dropCol++){//上一行类型覆盖当前行BlockType type = MapManager.Instance.blockArr[dropRow - 1, dropCol].type;MapManager.Instance.ChangeType(dropRow, dropCol, type);}}row++;}}
}
效果
游戏结束逻辑
修改GameManager代码
bool isStop = false;//游戏结束标识//开始游戏
void OnStartGame()
{isStop = false;
}void Update()
{if (isStop == true){return;}
}//当前俄罗斯生成的时候对应位置是不可移动(覆盖)说明游戏结束
public bool IsGameOver()
{for (int row = 0; row < currentTetris.rowCount; row++){for (int col = 0; col < currentTetris.colCount; col++){BlockType type = currentTetris.blockArr[row, col];if (type != BlockType.Empty){int map_rowIndex = row + currentTetris.rowIndex;int map_colIndex = col + currentTetris.colIndex;if (MapManager.Instance.blockArr[map_rowIndex, map_colIndex].type == BlockType.Static) return true;}}}return false;
}
调用
//自动下落
public void AutoMoveDown()
{timer -= Time.deltaTime;if (timer <= 0){timer = Defines.downTime;if (currentTetris.IsCanMove(Direction.Down)){currentTetris.MoveByDir(Direction.Down);}else{//设置不可移动类型MapManager.Instance.SetStatic(currentTetris);//检测删除行CheckDelete();//不能移动重新创建currentTetris = CreateTetris();if (IsGameOver() == true){isStop = true;Debug.Log("game over");return;}currentTetris.DrawMe();}}
}
效果
怪物生成
修改GameManager代码
//检测删除行
public void CheckDelete()
{//最后一行开始遍历for (int row = Defines.RowCount - 1; row >= 0; row--){//。。。if(count == Defines.ColCount){for (int dropCol = 0; dropCol < Defines.ColCount; dropCol++){//当前行生成哥布林SimpleFactory.CreateModel("gbl", null).transform.position = MapManager.Instance.blockArr[row, dropCol].transform.position;}//。。。}}
}
怪物触碰boss造成伤害和特效,还有游戏结束效果,就自己扩展了,也很简单,还有不同形状的方块
效果
源码
要啥源码,好好看,好好学!
参考
【视频】https://www.bilibili.com/video/BV1Fr4y1x7mx
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
相关文章:
【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏
文章目录 前言开始项目网格生成Block方块脚本俄罗斯方块基类,绘制方块形状移动逻辑限制移动自由下落下落后设置对应风格为不可移动类型检查当前方块是否可以向指定方向移动旋转逻辑消除逻辑游戏结束逻辑怪物生成源码参考完结 前言 当今游戏产业中,经典游…...
Docker容器内数据备份到系统本地
Docker运行容器时没将目录映射出来,或者因docker容器内外数据不一致,导致docker运行错误的,可以使用以下步骤处理: 1.进入要备份的容器: docker exec -it <容器名称或ID> /bin/bash2.在容器内创建一个临时目录…...
学信息系统项目管理师第4版系列06_项目管理概论
1. 项目基础 1.1. 项目是为创造独特的产品、服务或成果而进行的临时性工作 1.1.1. 独特的产品、服务或成果 1.1.2. 临时性工作 1.1.2.1. 项目有明确的起点和终点 1.1.2.2. 不一定意味着项目的持续时间短 1.1.2.3. 临时性是项目的特点,不是项目目标的特点 1.1…...
Java发送(QQ)邮箱、验证码发送
前言 使用Java应用程序发送 E-mail 十分简单,但是首先需要在项目中导入 JavaMail API 和Java Activation Framework (JAF) 的jar包。 菜鸟教程提供的下载链接: JavaMail mail.jar 1.4.5JAF(版本 1.1.1) activation.jar 1、准备…...
PostgresSQL----基于Kubernetes部署PostgresSQL
【PostgresSQL----基于Kubernetes部署PostgresSQL】 文章目录 一、创建SC、PV和PVC存储对象1.1 准备一个nfs服务器1.2 编写SC、PV、PVC等存储资源文件1.3 编写部署PostgresSQL数据库的资源声明文件 二、部署PostgresSQL2.1 部署 PV、PVC等存储对象2.2 部署PostgresSQL数据库2.3…...
7 个适合初学者的项目,可帮助您开始使用 ChatGPT
推荐:使用 NSDT场景编辑器快速搭建3D应用场景 从自动化日常任务到预测复杂模式,人工智能正在重塑行业并重新定义可能性。 当我们站在这场人工智能革命中时,我们必须了解它的潜力并将其整合到我们的日常工作流程中。 然而。。。我知道开始使…...
JDBC操作SQLite的工具类
直接调用无需拼装sql 注入依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.43.0.0</version></dependency>工具类 import org.sqlite.SQLiteConnection;/*** Author cpf* Dat…...
SEO百度优化基础知识全解析(了解百度SEO标签作用)
百度SEO优化的作用介绍: 百度SEO优化是指通过对网站的内部结构、外部链接、内容质量、用户体验等方面进行优化,提升网站在百度搜索结果中的排名,从而提高网站的曝光率和流量。通过百度SEO优化,可以让更多的潜在用户找到你的网站&…...
用python实现基本数据结构【03/4】
说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…...
软件测试面试题汇总
测试技术面试题 软件测试面试时一份好简历的重要性 1、什么是兼容性测试?兼容性测试侧重哪些方面? 5 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 5 3、测试的策略…...
AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动
产品描述 AP5101C 是一款高压线性 LED 恒流芯片 , 外围简单 、 内置功率管 , 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 ,温度保护点为…...
【大数问题】字符串相减(大数相减)<模拟>
类似 【力扣】415. 字符串相加(大数相加),实现大数相减。 题解 模拟相减的过程,先一直使大数减小数,记录借位,最后再判断是否加负号。(中间需要删除前导0,例如10001-1000000001&am…...
easycode生成代码模板配置
实体: ##引入宏定义 $!define##使用宏定义设置回调(保存位置与文件后缀)$!autoImport import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; i…...
【数据结构】堆排序和Top-k问题
【数据结构】堆 堆排序 如果只是将待排数组建立一个大堆或者小堆是无法得到一个升序或者降序的数组,因为对与一个堆,我们没法知道同一层的大小关系。 但是,如果建立了一个大堆,那么堆顶元素一定是这个数组中最大的,…...
经典的生产者和消费者模型问题
典型的生产者-消费者问题,可以使用 Java 中的 java.util.concurrent 包提供的 BlockingQueue 来实现。BlockingQueue 是一个线程安全的队列,它可以处理这种生产者-消费者的场景。以下是一个示例代码: import java.util.concurrent.ArrayBlockingQueue; import java.util.co…...
Java基础:代理
这里写目录标题 什么是代理1.静态代理(委托类、代理类):使用步骤:示例优缺点 2.动态代理(委托类、中介类)2.1 JDK动态代理使用:中介类:示例1:示例2: 2.2 CGLi…...
每日一学——防火墙2
防火墙是一种网络安全设备,用于保护计算机网络免受未经授权的访问、攻击和恶意行为的影响。以下是一些防火墙的基本概念: 防火墙规则:防火墙会根据预先设置的规则来决定允许或拒绝特定的网络流量。这些规则可以指定源 IP 地址、目标 IP 地址、…...
Web学习笔记-React(组合Components)
笔记内容转载自 AcWing 的 Web 应用课讲义,课程链接:AcWing Web 应用课。 CONTENTS 1. 创建父组件2. 从上往下传递数据3. 传递子节点4. 从下往上调用函数5. 兄弟组件间传递消息6. 无状态函数组件7. 组件的生命周期 本节内容是组件与组件之间的组合&#…...
【strstr函数的介绍和模拟实现——超详细版】
strstr函数的介绍和模拟实现 strstr函数的介绍 资源来源于cplusplus网站 strstr函数声明: char *strstr( const char *str1, const char *str2 ); 它的作用其实就是: 在字符串str1中查找是否含有字符串str2,如果存在,返回str2在…...
【Terraform】Terraform自动创建云服务器脚本
Terraform 是由 HashiCorp 创建的开源“基础架构即代码”工具 (IaC) 使用HCL(配置语言)描述云平台基础设施(这里教你使用低级基础设施:交换机、云服务器、VPC、带宽) Terraform提供者…...
TCP机制之确认应答及超时重传
TCP因为其可靠传输的特性被广泛使用,这篇博客将详细介绍一下TCP协议是如何保证它的可靠性的呢?这得主要依赖于其确认应答及超时重传机制,同时三次握手四次挥手也起到了少部分不作用,但是主要还是由确认应答和超时重传来决定的;注意:这里的可靠传输并不是说100%能把数据发送给接…...
Openharmony3.2 源码编译(ubuntu 22.04) 过程记录
OS: ubuntu 22.04 x64 1. 下载源码 1.1 安装码云repo工具 sudo apt install python3-pip git-lfsmkdir ~/bin curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo chmod ax ~/bin/repo pip3 install -i https://repo.huaweicloud.com/repository/p…...
PostgreSQL 数据库使用 psql 导入 SQL
最近我们有一个 SQL 需要导入到 PostgreSQL ,但数据格式使用的是用: -- -- TOC entry 7877 (class 0 OID 21961) -- Dependencies: 904 -- Data for Name: upload_references; Type: TABLE DATA; Schema: public; Owner: - --COPY public.upload_refere…...
容器编排学习(三)端口映射与Harber镜像仓库介绍
一 对外发布服务(端口映射) 1 概述 新创建容器的IP 地址是随机的 容器在重启后每次 IP 都会发生变化 容器服务只有宿主机才能访问 如何才能使用容器对外提供稳定的服务? 容器端口可以与宿主机的端口进行映射绑定 从而把宿主机变成对应的服务&a…...
Day_13 > 指针进阶(2)
目录 1.函数指针数组 2.指向函数指针数组的指针 3.回调函数 qsort()函数 代码示例 void* 4.结束 今天我们在进阶指针的基础上,学习进阶指针的第二部分 1.函数指针数组 首先我们回顾一下指针数组 char* arr[5]://字符指针数组 - 数组 - 存放的是字符指针 in…...
对Transformer中的Attention(注意力机制)的一点点探索
摘要:本文试图对 Transformer 中的 Attention 机制进行一点点探索。并就 6 个问题深入展开。 ✅ NLP 研 1 选手的学习笔记 简介:小王,NPU,2023级,计算机技术 研究方向:文本生成、摘要生成 文章目录 一、为啥…...
车内信息安全技术-安全技术栈-软件安全
操作系统 1.隔离技术 信息安全中的隔离技术通常指的是将不同安全级别的信息或数据隔离开来,以保护敏感信息不受未授权的访问或泄露。在操作系统中,常见的隔离技术包括:虚拟化技术:通过虚拟化软件,将物理计算机分割成多个独立的虚拟计算机,每个虚拟计算机都可以运行独立的…...
Redis常见命令
命令可以查看的文档 http://doc.redisfans.com/ https://redis.io/commands/ 官方文档(英文) http://www.redis.cn/commands.html 中文 https://redis.com.cn/commands.html 个人推荐这个 https://try.redis.io/ redis命令在线测试工具 https://githubfa…...
Android Studio实现一笔画完小游戏
文章目录 一、项目概述二、开发环境三、详细设计3.1、数据库设计3.2、普通模式3.3、随机模式3.4、关卡列表 四、运行演示五、项目总结六、源码获取 一、项目概述 Android一笔画完是一种益智游戏,玩家需要从起点开始通过一条连续的线,将图形中所有的方块…...
【Python 程序设计】数据人员入门【02/8】
一、说明 介绍如何管理 Python 依赖项和一些虚拟环境最佳实践。 以下文章是有关 Python 数据工程系列文章的一部分,旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。迄今为止,本初学者指南包括&#…...
网站底部特效/长沙正规seo优化价格
自定义 ASP.NET UpdatePanel 控件的错误处理.NET Framework 4 其他版本 此主题尚未评级 - 评价此主题 如果在 UpdatePanel 控件中更新部分页时发生错误,则默认行为是显示带有错误消息的浏览器消息框。 本教程将向您演示如何自定义向用户显示错误的方式以及如何自定义…...
wordpress 文章8小时/网络营销简介
项目背景 最近小周的项目上线了,服务器在机房,客户端在用户的办公室。两者距离很远,经常要跑机房去操作,然而机房的管理特别的严格。不许带电脑、手机,只能带笔杠杠。。。。。内心10000只草泥马在奔腾! 6台服务器&am…...
美食网站建设日程表/网络营销的模式有哪些?
企业根CA如何发放客户机证书-L2TP证书问题的补充说明<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />在ISA系列第二十一篇的博文中,我们介绍了如何在***服务器中使用L2TP协议。L2TP可以使用证书或预共享密…...
wordpress 群晖 局域网/杭州小周seo
CGGeometry参考定义几何结构和功能,操作简单。数据结构中的一个点CGPoint代表在一个二维坐标系统。数据结构的位置和尺寸CGRect代表的一个长方形。数据结构的尺寸CGSize代表宽度和高度。 1、创建一个几何原始数值 CGPoint CGPointMake(CGPoint A,CGPoint B&…...
浙浙江省建设信息港/seo关键词如何布局
2019独角兽企业重金招聘Python工程师标准>>> 我对一个String对象调用replaceAll(".","/") 本意是想将路径转换为URI格式,没想到调错了,导致整个String变成了// 后来才发现是应该调用replace(.,/) 前面那个方法按照正则解析的,我晕 转载于:https…...
网站移动字幕要怎么做/绍兴seo排名外包
Docker Hub目前Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量超过15000个镜像。大部分需求都可以通过在Docker Hub中直接下载镜像来使用。注册登录可以在https://hub.docker.com 免费注册一个Docker账号。在命令行执行docker login输入用户名及密码来…...