-
Notifications
You must be signed in to change notification settings - Fork 1
YSHIDM/starChess3D
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
let 游戏简介 = {
自言自语: '迁移到 midway.js 试试',
原因: {
红警与星际: `小学时听同学吹牛,红警如何如何,光棱塔、间谍,
脑补了好多类似间谍到一个满是光棱塔监视的城市盗取情报的画面
等学者打红警时,发现一个叫星际争霸的游戏也有大兵:问号.jpg。
从一个星球打到另一个星球,这不是《星球大战》?
事实证明,就像对红警一样我想多了,根本没有那么好的特效😑。
就像认为红警2里的超时空运输真能穿越时空开一个新存档一样不现实。
星际2有一个功能,可以把集结点设置到某个士兵身上,非常好的功能。
`,
星尘战略与真菌世界: `这是大学时期我玩过的两款安卓游戏,很棒,就是废手指头。
你得一直搓屏幕,控制军队移动,否则大后方的士兵不能一直支援到前线
真菌世界可以让军队集结到前方————应该是用的图的最短路径算法吧,
但是并不能把以前集结的士兵一并输送走,或许是为了让后方兵力不会太过空虚。
或许,我个人感受,这个功能很复杂,如果不是战线很长不是必须的
`,
halo光环: `最近这些年为数不多能称之为科幻的东西了,
星球大战、复仇者、x战警、变形金刚,这些都是魔戒一样的现代魔法,不是科幻。
光环给了我很多启发,例如,现在的xx就像先行者一样不可救药,
对于这个游戏,利用黑洞毁灭星球,传送星球,在光环中也曾出现。
`
},
设计: `制作一个类似星尘战略、真菌世界的游戏。
但是,没有画面,目前只有一个简单的输入框,通过socket.io与后台交互数据。
其实这个简单页面也还没做好😂
3D?星球的坐标的确是三个数值的数组,同时兼容两个的。。。
`
,
游戏结构: `通过自动生成(或自定义)星球坐标,确定星球间距离,
根据玩家移动距离生成graph(所以,星球坐标是3维还是2维貌似关系不大)。
默认每秒移动一单位距离(你行你改吧🙄)。
后期研发出虫洞,秒传兵力或星球,
`,
特点: `《星尘战略》不支持兵力集结 —— 既将 A 星球的兵力不间断输送到 B 星球。
《真菌世界》有集结兵力功能(加权有向图两点间最短路径),以及按数值输送兵力功能;
但 O 星球兵力集结到 P 星球的时候不会把已经生产的兵力及接收的兵力输送出去。
本游戏试图实现该功能。
另外,游戏为用户提供了若干主动技能,如通过虫洞传送兵力甚至星球。
关于技能,部分灵感来自于《halo》等游戏以及一些常见的科学幻想。
如果未来可以设置剧情,✋
`,
难点: {
军队偏移: `我自己编的一个概念,很不友好。可以简单理解为“行军日志”
主要用来记录星球输送出多少军队,通过时间戳推算每一批军队的移动距离,
星球兵力结算时使用,
`,
集结结算: `这个是本游戏的特点,根据接收兵力的来源以及时间,倒推出一个有向图
目前:“行军日志”存储在game下,采用深度优先计算,
优化:star分别记录自己的兵力接收日志,game对其进行广度优先计算。(可以彼此测试)
`,
最短路径: `并行于集结的兵力输送方案,既兵力到达目标星球之前不受操作影响,
用于长距离、跨星球输送兵力,类似于《真菌世界》操作方式
`,
兵力撤退: `用于集结过程中,目标星球被占领后兵力撤退,
其实就是倒转运动中的军队的时间戳,
`,
UI: `这个也是本游戏的特点,根本没什么操作界面,也没有战斗画面。
但我仍然构思了若干种方案,在后面有
`,
不可能的任务: `根据要求的地图特点,倒推生成星球坐标`
},
科技与技能: {
说明: '数据是随意编的,没有任何科学依据',
玩家: {
科技: [
{ 名称: '星际旅行', 研发资源消耗: 200, 效果: '开启星际探索[实现]' },
{ 名称: '人工智能', 研发资源消耗: 300, 效果: '取消最大兵力' },
{ 名称: '星际网络', 研发资源消耗: 400, 效果: '全图星球信息' },
{ 名称: '可控聚变', 研发资源消耗: 500, 效果: '开启高级科技[实现]' }
],
技能: [
{ 名称: '戴森球', 研发资源消耗: 500, 技能消耗: 500, 效果: '资源、兵力产量及防御翻倍,敌方无法侦察,只能通过传送进入[不靠谱]' },
{ 名称: '微型黑洞', 研发资源消耗: 1000, 技能消耗: 1000, 效果: '毁灭一颗星球,及其附近所有兵力' },
{ 名称: '微型虫洞', 研发资源消耗: 1500, 技能消耗: 2100, 效果: '传送军队' },
{ 名称: '星球传送', 研发资源消耗: 2000, 技能消耗: 10000, 效果: '传送星球' },
{ 名称: '星球创造', 研发资源消耗: 2500, 技能消耗: 30000, 效果: '创造一颗满级星球' }
]
},
星球等级: {
防御力: [
{ 防御力: 300, 研发资源消耗: 100, 兵力消耗: 100 },
{ 防御力: 600, 研发资源消耗: 100, 兵力消耗: 200 },
{ 防御力: 900, 研发资源消耗: 100, 兵力消耗: 300 },
],
生产力: [
{ 资源生产提升: 10, 兵力生产提升: 10, 研发资源消耗: 100 },
{ 资源生产提升: 20, 兵力生产提升: 20, 研发资源消耗: 100 },
{ 资源生产提升: 30, 兵力生产提升: 30, 研发资源消耗: 100 },
]
}
}
}
// let
let DB = {
Star: '星球',
Player: '玩家',
_sendArmy: {// 兵力输送方式:指派
startMusterTime: '游戏时间',
army: '军队数量'
},
_musterArmy: {// 兵力输送方式:集结
startMusterTime: '游戏时间',
military: '集结开始时兵力生产力',
endTime: '集结结束时间'
},
_fromMap: {// 兵力来源星球
fromStar: [
_sendArmy | _musterArmy
]
},
_toMap: {// 兵力目标星球
toStar: _fromMap,
},
marchMap: {// 玩家兵力输送日志
player: _toMap,
}
}
/**
* 逻辑核心
*/
let core = {
Game: {
playerNumber: '玩家数',
id: 'id',
state: '游戏状态,0:等待加入;1:正在游戏;2:暂停游戏(先不考虑)',
starsNumber: '星球数量',
spaceSize: '星空大小(正方体边)',
starsMap: '全部星球',
starsDistance: '星球距离表',
marchMap: '行军日志',
gameTime: '游戏开始时间',
detectMap: '侦察日志',
//------------------初始化------------------
/**
* 按模式初始化游戏
* @param {number} mode 游戏模式
* @param {number} starsNumber 星球数量
* @param {number} spaceSize 星空大小(正方体边)
*/
initGameByMode(mode, starsNumber, spaceSize) { },
/**
* 初始化游戏
* @param {number} starsNumber 星球数量
* @param {number} spaceSize 星空大小(正方体边)
*/
initGame(starsNumber = 10, spaceSize = 30) {
this._initStars()// 生成群星
this._initStarsMap()// 生成星距
this.gameTime// 记录游戏时间
},
/**
* 生成星球位置,默认原点对角顶点
* @param {number[]} coordinate 默认原点对角顶点
*/
initStar(coordinate) {
this.starsMap // starsMap存储星球
},
/**
* 生成群星,初始化this.starsMap
*/
_initStars() {
// 循环调用
this.initStar(coordinate)// 初始化this.starsMap
},
/**
* 初始化this.starsDistance
*/
_initStarsMap() {
// 根据 this.starsMap 生成 this.starsDistance
},
//------------------兵力运输------------------
/**
* 开始输送兵力
* @param {string} playerId 玩家id
* @param {string} fromStar 出发星球
* @param {string} toStar 目标星球
* @param {number} startMusterTime 集结开始时间,game.secondUp()
* @param {number} military 生产力 做乘法
*/
startMuster(playerId, fromStar, toStar) { },
/**
* 时间段颗粒化
* _musterArmy: {// 兵力输送方式:集结
* startMusterTime: '游戏时间',
* military: '集结开始时兵力生产力',
* endTime: '集结结束时间'
* }
* 转换为:
* _sendArmy: {// 兵力输送方式:指派
* startMusterTime: '游戏时间',
* army: '军队数量'
* }
* @param {Map<string|number,number>} armyOffset 行军日志
*/
_militaryToArmy(armyOffset) { },
/**
* 停止输送兵力
* @param {string} playerId 玩家id
* @param {string} fromStar 出发星球
* @param {string} toStar 目标星球
*/
endMuster(playerId, fromStar, toStar) {
this._militaryToArmy()
},
/**
* 军队运动结算
* 获取输送到目标星球的兵力,同时返回向目标星球输送兵力的 时间数组
* 时间数组 用来筛选兵力是否输送到
* @param {Map<number|string, number>} armyOffset
* @param {number|number[]} timeS 时间段开始 或时间数组
* @param {number} timeE 时间段结束
* @returns {[number,number[]]}
*/
_marchOffset(armyOffset, timeS, timeE = 0) { },
/**
* 当前星球集结军队数量
* 根据时间与距离判断 toStar 接收的兵力总数
* @param {string} playerId 玩家id
* @param {string} toStar 目标星球
* @param {number|number[]} timeS 当前(toStar)星球开始收到兵力时间,或时间数组
* @param {number} timeE 当前(toStar)星球兵力结算时间,外部调用是为当前时间点
*/
receiveSettle(playerId, toStar, timeS, timeE = 0) {
this.getDistanceByStar()
this._marchOffset()
this.receiveSettle()
},
/**
* 调动军队时间戳
* @param {string} playerId 玩家id
* @param {string} fromStar 出发星球
* @param {string} toStar 目标星球
* @param {number} army 军队数量
*/
moveArmy(playerId, fromStar, toStar, army) {
this.marchMap.get(playerId).get(toStar).get(fromStar).set(this.secondUp(), army);
},
/**
* 当前兵力结算
* @param {string} playerId 玩家id
* @param {string} toStar 目标星球
*/
armySettle(playerId, toStar) {// 未完成 outTime, //调用util
this.starsMap.get(toStar)
this.secondUp()// 游戏进行时间
star.militarySettle()// 生产兵力
this.receiveSettle();// 接收兵力
star.startMilitaryTime// 军队结算时间
star.armies[playerId]
},
/**
* 输出兵力//存入星图
* @param {string} playerId 玩家id
* @param {string} fromStar 出发星球
* @param {string} toStar 目标星球
* @param {number} army 兵力数量,army 大于总兵力或小于等于零,则赋值为总兵力
*/
sendArmy(playerId, fromStar, toStar, army = 0) { },
/**
* 向目标星球集结军队//存入星图
* @param {string} fromStar 出发星球
* @param {string} toStar 目标星球
*/
musterArmy(fromStar, toStar) { },
fallback: {//wait
params: {
param: ``,
},
comment: ``,
},
//------------------命令------------------
//--------星空信息--------
getAllStar: {
params: {
param: ``,
},
comment: `获取所有星球`,
},
getAllStarCoordinate: {
params: {
param: ``,
},
comment: `获取所有星球的坐标`,
},
getStarGroup: {
params: {
param: ``,
},
comment: `获取星球分组信息`,
},
navigate: {
params: {
param: ``,
},
comment: `获取两颗星球最近距离(加权图最短路径)`,
},
//--------命令--------
/**
* 获取所有拥有的星球
* @param {string} playerId 玩家id
* @returns {string[]} starIds
*/
getAllOwnStar(playerId) { },
getStarInfo: {
params: {
param: ``,
},
comment: `获取星球信息`,
},
/**
* 获取临近星球
* @param {string} starId
* @param {number} steps
* @returns {string[]}
*/
getAbutStar(starId, steps) { },
getAllAbutStar: {
params: {
param: ``,
},
comment: ``,
},
/**
* 侦察星球
* 客户端第一次访问进行记录并返回消耗时间,客户端setTimeout,
* 第二次访问进行比较验证
* @param {string} playerId 玩家id
* @param {string} toStar 星球名称
* {{time:number,starId1:string,starId2:string,distance:number}}
*/
detect(playerId, toStar) { },
/**
* 进行比较验证,返回侦察结果
* @param {string} uuid 侦察操作uuid
*/
detectCheck(uuid) { },
/**
* 发动攻击-军队首先进入星球范围,等待命令作战
* @param {string} starId 星球名称
*/
occupy(starId) { },
//------------------科技------------------
/**
* 安装戴森球
* @param {string} starId 星球名称
*/
hideStar(starId) { },
/**
* 使用黑洞-毁灭星球
* @param {string} starId 星球名称
*/
destroyStar(starId) { },
/**
* 虫洞-传送兵力
* @param {string} starId 星球名称
* @param {number[]} transferCoordinate 目标坐标
*/
transferArmy(starId = '', army = [0, 0, 0]) { },
/**
* 虫洞-传送星球
* @param {string} starId 星球名称
* @param {number[]} transferCoordinate 目标坐标
*/
transferStar(starId = '', transferCoordinate = [0, 0, 0]) { },
/**
* 创造星球
* @param {number[]} createCoordinate 目标坐标
*/
createStar(createCoordinate = [0, 0, 0]) { },
//------------------util------------------
/**
* 根据两颗星球id获得距离
* @param {string} fromStar 出发星球
* @param {string} toStar 目标星球
*/
getDistanceByStar(fromStar, toStar) { },
// random: {
// params: {
// param: ``,
// },
// comment: `mix 到 max 随机数`,
// },
/**
* 获取当前游戏进行的时间
*/
secondUp() { },
/**
* 坐标比较
* @param {number[]} coordinate1 第一个坐标
* @param {number[]} coordinate2 第二个坐标
*/
_checkCoordinate(coordinate1, coordinate2) { }
},
Star: {
Property: {
id: `星球id`,
coordinate: `星球坐标`,
belong: `用户id`,
ownDysonBall: `是否拥有戴森球`,
receiveArmyTime: `兵力接收时间,既是fromStar发兵时间`,
military: `军队生产力`,
startMilitaryTime: `军队结算时间/兵力生产时间:时间差*生产力=生产军队
重置:1.停止输出军队,2.军队结算`,
armies: `{playerId:army} 野怪/军队`,
musterTo: `兵力输出目标`,
defence: `防御`,
defenceLevel: `防御力等级`,
production: `生产力`,
productionLevel: `生产力等级`,
productSettle: `资源统计时间戳 productTimestamp`,
resources: `星球拥有资源`
},
initGameByMode: {//wait
params: {
param: ``,
param: ``,
param: ``,
},
comment: ``,
},
//---------------------旧--------------------
upgradeDefence: '防御力升级',
upgradeProduction: {
comment: '资源及军队生产力升级',
invoke: ['starsMapUtil.endMuster', 'starsMapUtil.startMuster']
},
armySettle: '当前兵力结算',
receiveSettle: {
comment: '接收兵力统计',
invoke: ['starsMapUtil.countMassByTime']
},
sendArmy: {
comment: '输出兵力//存入星图',
invoke: ['starsMapUtil.countMassByTime']
},
musterArmy: {
comment: '向目标星球集结军队//存入星图',
invoke: ['starsMapUtil.startMuster']
},
militarySettle: '军队产出结算',
resourcesSettle: 'resources结算'
},
Player: {
Property: {
id: `id`,
userId: `用户id`,
resources: `资源`,
level: `星际航行等级`,
steps: `星际航行距离`,
ownTechnologies: `拥有多少科技`
},
initGameByMode: {//wait
params: {
param: ``,
param: ``,
param: ``,
},
comment: ``,
},
initGameByMode: {//wait
params: {
param: ``,
param: ``,
param: ``,
},
comment: ``,
},
upgradeTravel: '星际旅行升级',
upgradeTechnology: '技能升级',
countResources: '统计资源总量',
hide: '安装戴森球',
destroy: '使用黑洞',
transferArmy: '虫洞-传送军队',
transferStar: '虫洞-传送星球',
occupy: '占领星球',
detect: '侦察星球',
muster: '兵力集结命令'
},
router: {
createGame: {
comment: '创建游戏',
invoke: ['createGame']
},
createPlayerByGame: {
comment: '创建角色',
invoke: ['(new Player)']
},
getPlayer: {
comment: '获取个人信息',
invoke: ['Player.getPlayer']
},
getGame: {
comment: '获取游戏信息',
},
joinGame: {
comment: '加入游戏',
invoke: ['getGame', '(new Player)']
},
getAllOwnStar: '获取拥有的星球列表',
getStarInfo: '获取星球信息',
getAbutStar: '获取临近星球',
getAllAbutStar: '获取所有邻接星球',
getAllStarCoordinate: '获取所有星球坐标',
getStarGroup: '获取星球分组信息',
navigate: '获取两颗星球最近距离(加权图最短路径)',
upgradeDefence: '升级星球防御力',
upgradeProduction: '升级星球生产力',
upgradeTechnology: '升级科技',
upgradeTravel: '星际旅行升级',
detect: '侦察星球',
sendArmy: '向星球派兵',
musterArmy: '向星球集结兵力',
occupy: '发动攻击',
fallback: '撤退',
hide: '安装戴森球',
destroy: '使用黑洞-毁灭星球',
transferArmy: '传送兵力',
transferStar: '传送星球',
createStar: '创造星球',
},
fastMode: {
fast: '兵力直接传送'
},
MongoDB: {
},
command: {
'abut starId1': {
comment: '邻近星球1',
regExp: /abut (?<starId1>\d+)/
},
'detect starId1': {
comment: '侦察星球1',
regExp: /detect (?<starId1>\d+)/
},
'move army starId1 starId2 army1?': {
comment: 'starId1向starId2输送兵力若干(army1为空则为全部)',
regExp: /move army (?<starId1>\d+) (?<starId2>\d+) (?<army>\d+)/
},
'muster starId1 starId2': {
comment: 'starId1向starId2集结兵力',
regExp: /muster (?<starId1>\d+) (?<starId2>\d+)/
},
'transfer army starId1 starId2 army1?': {
comment: '将兵力(缺省为全部)从星球1传送至星球2',
regExp: /transfer army (?<starId1>\d+) (?<starId2>\d+) (?<army>\d+)/
},
'transfer star starId1 x y z': {
comment: '将星球传送至坐标2',
regExp: /transfer star (?<starId1>\d+) (?<x>\d+) (?<y>\d+) (?<z>\d+)/
},
'destroy starId1': {
comment: '利用黑洞毁灭starId1(只能是自己的星球或邻近星球)',
regExp: /destroy (?<starId>\d+)/
},
'hide starId1': {
comment: '利用戴森球隐藏starId1',
regExp: /hide (?<starId1>\d+)/
},
'create star x y z': {
comment: '在坐标1创建星球',
regExp: /create star (?<x>\d+) (?<y>\d+) (?<z>\d+)/
},
'occupy starId1': {
comment: '攻击星球1的敌人',
regExp: /occupy (?<starId1>\d+)/
}
}
}
let UI = {
command: '程序员,努力做得像终端,直接粗暴',
table: '普通人,大约需要n种表格',
svg_graph: '2D直观,对于程序员来说图什么的还算友好直观吧',
chart_coordinate: '3D可操作,对普通人更友好(并不确定)',
AR_VR: '想多了,兄弟🤣!',
辅助AI: 'Co...,NO!'
}
let 模式 = [['2D', '3D'], ['单人', '双人'], ['正常', '快速'], ['自动', '自定义星球坐标', '自定义开始位置']]
let string = '所有的点都可以映射到一个面上吧,一束光不行就两束'
About
没有画面的游戏,类似星尘战略、真菌世界,可以集结兵力,省手指头。
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published