JS编写的控制台摸鱼小游戏

📅 发布时间:2026/7/8 6:55:28 👁️ 浏览次数:
JS编写的控制台摸鱼小游戏
上班空闲时瞎玩儿着写的过完年忙起来也没什么兴致更新了等有空了再完善吧!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title控制台三国-v0.0.5/title !-- script srchttps://cdn.bootcss.com/eruda/1.5.4/eruda.js/script script eruda.init(); /script -- script src./name.js/script script let debug false; //调试模式 let country []; //国家 let country_id 0; // ming-姓名 xing-姓氏 wu-武 zhi-智 jian-健1-健康 2-受伤 guan-官0-在野 1-君王 2-将领 3-俘虏 mei-魅 // king-君主0-否 1-是 2-特殊 guo-国名 win-胜利次数 lose-失败次数 work-工作次数 study-提升次数 const ori_heroes [ //将领池 { id: 0, ming: 曹操, xing: 曹, wu: 75, zhi: 72, jian: 1, guan: 0, mei: 90, king: 1, guo: 魏, win: 0, lose: 0, work: 0, study: 0 }, { id: 1, ming: 刘备, xing: 刘, wu: 77, zhi: 74, jian: 1, guan: 0, mei: 92, king: 1, guo: 蜀, win: 0, lose: 0, work: 0, study: 0 }, { id: 2, ming: 孔融, xing: 孔, wu: 6, zhi: 84, jian: 1, guan: 0, mei: 86, king: 1, guo: 鲁, win: 0, lose: 0, work: 0, study: 0 }, { id: 3, ming: 董卓, xing: 董, wu: 82, zhi: 43, jian: 1, guan: 0, mei: 33, king: 1, guo: 秦, win: 0, lose: 0, work: 0, study: 0 }, { id: 4, ming: 吕布, xing: 吕, wu: 94, zhi: 17, jian: 1, guan: 0, mei: 40, king: 1, guo: 霸, win: 0, lose: 0, work: 0, study: 0 }, { id: 5, ming: 张绣, xing: 张, wu: 72, zhi: 43, jian: 1, guan: 0, mei: 53, king: 0, guo: , win: 0, lose: 0, work: 0, study: 0 }, { id: 6, ming: 公孙瓒, xing: 公孙, wu: 66, zhi: 55, jian: 1, guan: 0, mei: 68, king: 1, guo: 燕, win: 0, lose: 0, work: 0, study: 0 }, { id: 7, ming: 刘表, xing: 刘, wu: 31, zhi: 81, jian: 1, guan: 0, mei: 82, king: 1, guo: 齐, win: 0, lose: 0, work: 0, study: 0 }, { id: 8, ming: 刘焉, xing: 刘, wu: 27, zhi: 78, jian: 1, guan: 0, mei: 80, king: 1, guo: 渝, win: 0, lose: 0, work: 0, study: 0 }, { id: 9, ming: 关羽, xing: 关, wu: 92, zhi: 72, jian: 1, guan: 0, mei: 81, king: 0, guo: , win: 0, lose: 0, work: 0, study: 0 }, { id: 10, ming: 张飞, xing: 张, wu: 90, zhi: 53, jian: 1, guan: 0, mei: 47, king: 0, guo: , win: 0, lose: 0, work: 0, study: 0 }, ****** ]; let heroes []; //本局游戏将领池 let heroesId 0; //本局游戏将领id最大值 let map_max_point 20; //地图大小默认 0-19 const ori_cityes [ //城市池 capital-首都 point-坐标 power-特殊能力0-无 1-演武 2-诗会 3-宴席 // map_max_point 10 { id: 0, countryId: -1, guo: , capital: false, name: 武威, power: 0, point: 0,0, near: 1;6;, neaeName: 天水;代郡; }, { id: 1, countryId: -1, guo: , capital: false, name: 天水, power: 0, point: 2,3, near: 0;2;3;, neaeName: 武威;河东;长安; }, { id: 2, countryId: -1, guo: , capital: false, name: 河东, power: 0, point: 8,2, near: 1;5;6;, neaeName: 天水;洛阳;代郡; }, { id: 3, countryId: -1, guo: , capital: false, name: 长安, power: 2, point: 5,6, near: 1;4;5;7;, neaeName: 天水;南阳;洛阳;汉中; }, { id: 4, countryId: -1, guo: , capital: false, name: 南阳, power: 0, point: 9,8, near: 3;5;8;9;, neaeName: 长安;洛阳;陈留;襄阳; }, // map_max_point 15 { id: 5, countryId: -1, guo: , capital: false, name: 洛阳, power: 0, point: 10,4, near: 2;3;4;8;, neaeName: 河东;长安;南阳;陈留; }, { id: 6, countryId: -1, guo: , capital: false, name: 代郡, power: 1, point: 12,0, near: 0;2;11;, neaeName: 武威;河东;渔阳; }, { id: 7, countryId: -1, guo: , capital: false, name: 汉中, power: 0, point: 3,11, near: 3;10;, neaeName: 长安;成都; }, { id: 8, countryId: -1, guo: , capital: false, name: 陈留, power: 0, point: 13,7, near: 4;5;13;14;, neaeName: 洛阳;南阳;北海;下邳; }, { id: 9, countryId: -1, guo: , capital: false, name: 襄阳, power: 2, point: 8,12, near: 4;12;16;, neaeName: 南阳;江夏;武陵; }, { id: 10, countryId: -1, guo: , capital: false, name: 成都, power: 3, point: 1,14, near: 7;17;, neaeName: 汉中;交趾; }, ****** ]; let cityes []; //本局城市池 let owner -1; //本局游戏选中国家下标 let own_cityes_set_capital { //本局玩家可用于迁都的城市 ids: [], list: [], }; let own_cityes_set_power { //本局玩家可用于提升能力的城市 ids: [], list: [], }; let ownerId null; //本局游戏选中国家id let year 200; //本局游戏年份 let part 1; //本局游戏季度 const part_text [, 春季 , 夏季, 秋季, 冬季]; let operateFlag false; //是否执行操作 let chooseVal { //本回合可执行操作 key: [], value: [], attKey: [], attValue: [], }; let maxPerson 5; //最多计算将领人数 let ai_need_reduce false; //有势力灭亡时遍历下标需要-1 let add_event_country 0; //有事件势力登场时新势力需要跳过本回合 const ori_office_level [ //官职数据 level-等级 max-限制人数0-不限制 heroeId-所属君主 { id: 0, level: 1, max: 0, heroeId: [], name: 太守, desc: 城市长官 }, { id: 4, level: 3, max: 0, heroeId: [], city: 2, zhi: 80, name: 刺史, desc: 地方长官 }, // zhi80 { id: 5, level: 3, max: 0, heroeId: [], city: 2, name: 州牧, desc: 地方长官 }, { id: 1, level: 2, max: 1, heroeId: [], city: 1, bing: 6000, liang: 6000, zhi: 80, name: 别驾从事, desc: 地方长官助理 }, // zhi80 { id: 2, level: 2, max: 1, heroeId: [], city: 1, bing: 6000, liang: 6000, wu: 80, name: 督军从事, desc: 地方长官助理 }, // wu80 { id: 3, level: 2, max: 0, heroeId: [], city: 1, bing: 6000, liang: 6000, name: 治中从事, desc: 地方长官助理 }, { id: 6, level: 4, max: 1, heroeId: [], city: 4, zhi: 80, name: 大司农, desc: 九卿 }, // zhi80 { id: 7, level: 4, max: 1, heroeId: [], city: 4, wu: 80, name: 廷尉, desc: 九卿 }, // wu80 { id: 8, level: 4, max: 1, heroeId: [], city: 4, mei: 80, name: 大鸿胪, desc: 九卿 }, //mei80 { id: 9, level: 4, max: 1, heroeId: [], city: 4, zhi: 70, name: 宗正, desc: 九卿 }, // zhi70 ****** ]; let office_level []; //本局官职数据 let ori_country_office [ //势力内部官职 heroeId-绑定的将领id zhi|wu 该将领的原始数据 { id: 0, name: 军师, desc: 文官担任该职务时智力 10, heroeId: -1, zhi: 0 }, { id: 1, name: 校尉, desc: 武官担任该职务时武力 10, heroeId: -1, wu: 0 }, ]; const random_event [ //突发事件 //1-春 2-夏 3-秋 4-冬 { id: 0, part:1;, active: 5;55;, name: 倒春寒, desc: 粮食减产2成 }, //粮食*0.8 { id: 1, part:1;, active: 30;60;90;, name: 义兵来投, desc: 兵力增加3000 }, //兵力3000 { id: 2, part:2;, active: 21;37;, name: 山洪倒灌, desc: 兵力损失1000粮食减产1成 }, //兵力-1000 粮食*0.9 { id: 3, part:2;, active: 18;35;, name: 名将来投, desc: 随机获取一名在野将领 }, //将领1 { id: 4, part:3;, active: 40;80;, name: 颗粒无收, desc: 粮食减产5成 }, //粮食*0.5 { id: 5, part:3;, active: 6;9;69;96;, name: 福瑞降世, desc: 粮食增产2成 }, //粮食*1.2 ****** ]; console.log(- - - - - - - - - - - - - - - -) console.log(初始化国家 createCountry(1数字11)) //初始化 function createCountry(num) { if (owner ! -1) { console.log(请先中止游戏 endGame()) return } country [] let king_heroes JSON.parse(JSON.stringify(ori_heroes.filter(item item.king 1))) if (!num || num 2) { num 2 } else if (num 10) { num 10 } else { num parseInt(num) } //生成城市地图 - start cityes [] if (num 7) { //大图 20格 60将 cityes JSON.parse(JSON.stringify(ori_cityes)) map_max_point 20 heroes JSON.parse(JSON.stringify(ori_heroes)) } else if (num 3) { //中图 15格 50将 cityes JSON.parse(JSON.stringify(ori_cityes.slice(0, 11))) map_max_point 15 let her_arr JSON.parse(JSON.stringify(ori_heroes)) heroes [...her_arr.slice(0,30),...her_arr.slice(41,61)] } else { //小图 10格 40将 cityes JSON.parse(JSON.stringify(ori_cityes.slice(0, 5))) map_max_point 10 let her_arr JSON.parse(JSON.stringify(ori_heroes)) heroes [...her_arr.slice(0,15),...her_arr.slice(25,35),...her_arr.slice(46,61)] } heroesId 1 (heroes.at ? heroes.at(-1).id : heroes[heroes.length-1].id) //生成城市地图 - end office_level JSON.parse(JSON.stringify(ori_office_level)) for (let i0; inum; i) { let index Math.random() * king_heroes.length let obj king_heroes.splice(index, 1)[0] heroes heroes.filter(item item.id ! obj.id) obj.guan 1 office_level[0].heroeId.push(obj.id) let country_obj { id: country_id, guo: obj.guo, heroes: [{...obj}], bing: 1000, liang: 3000, cityes: 0, office: JSON.parse(JSON.stringify(ori_country_office)), } let free_cityes cityes.filter(ci ci.countryId -1) let city_random Math.floor(Math.random() * free_cityes.length) if (city_random free_cityes.length - 1) { city_random free_cityes.length - 1 } free_cityes[city_random].countryId country_id; free_cityes[city_random].guo obj.guo; free_cityes[city_random].capital true; country_obj.cityes 1 country.push(country_obj) country_id console.log(势力${obj.guo} 都城${free_cityes[city_random].name} 君主${obj.ming}-${i1}) } console.log(- - - - - - - - - - - - - - - - - -) console.log(选择你扮演的君主编号 selectHeroes(数字)) } //选择君主随机城池 function selectHeroes(index) { if (country.length 0) { console.log(请先创建国家 createCountry(数字)) return } else if (owner ! -1) { console.log(请先中止游戏 endGame()) return } else if (index country.length) { console.log(请输入正确的编号) return } if (index 0) { index 1; } else if (index country.length) { index country.length; } owner index-1; ownerId country[owner].id console.log(- - - - - - - - - - - - - - - - - -) console.log(已选择[${country[owner].guo}] ${country[owner].heroes[0].ming} 武力${country[owner].heroes[0].wu} 智力${country[owner].heroes[0].zhi} 魅力${country[owner].heroes[0].mei}) setTimeout(() { next() }, 1000) } //下一回合 async function next() { ****** } //每年年初判定君主官职 async function checkOffice() { return new Promise((resolve, reject) { ****** }) } //操作 async function choose(i, attI) { ****** } //判定随机事件 async function chooseEvent(index) { return new Promise((resolve, reject) { ****** }) } //操作执行 async function chooseOperate(i, index, king, attI null) { return new Promise((resolve, reject) { ****** }) } //结束游戏 function endGame(result) { if (owner ! -1) { if ((result ! 1 result ! 2) || isNaN(result)) { result 3 } console.log(- - - - - - 游戏结束 - - - - - -) console.log(游戏结局${result 1 ? 胜 : result 2 ? 败 : 和}) console.log(游戏时长${year-200}年) console.log(国家${country[owner].guo}) let king country[owner].heroes.filter(item item.king 1)[0] let king_level office_level.filter(off_item off_item.heroeId.indexOf(king.id) ! -1)[0] console.log(官职${king_level.name}) console.log(君主${king.ming}) console.log(士兵${country[owner].bing}) console.log(粮草${country[owner].liang}) console.log(将领${country[owner].heroes.length}) //保存历史记录-start if (!debug) { let history localStorage.getItem(TkingdomsAlone-history) history (history undefined || history null) ? [] : JSON.parse(history) history.push({ result: result 1 ? 1 : result 2 ? 2 : 3, //游戏结局 1-胜利 2-失败 else-中止 long: year-200, //游玩时长 guo: country[owner].guo, //国家 king: king.ming, //君主 office: king_level.name, //官职 time: getNowTime(), //结束时间 }) localStorage.setItem(TkingdomsAlone-history, JSON.stringify(history)) console.log(- - - - - 存档已记录 - - - - -) } //保存历史记录-end //初始化-start country_id 0 heroes [] heroesId 0 owner -1 ownerId null year 200 part 1 operateFlag false maxPerson 5 ai_need_reduce false //初始化-end console.log(- - - - - - - - - - - - - - - -) console.log(初始化国家 createCountry(1数字11)) } else { console.log(未开始游戏) } } //帮助 function find(i, cityName) { ****** } //随机排序数组 function shuffle(arr) { for (let i arr.length - 1; i 0; i--) { const j Math.floor(Math.random() * (i 1)); [arr[i], arr[j]] [arr[j], arr[i]]; // 交换元素 } return arr; } //数值小数点处理 function fixNum(val, num) { return Number(Number(val).toFixed(num)) } //获取当前系统时间 function getNowTime() { let time new Date() let Y time.getFullYear() let M ((time.getMonth() 1) 10 ? 0 : ) (time.getMonth() 1) let D (time.getDate() 10 ? 0 : ) time.getDate() let h (time.getHours() 10 ? 0 : ) time.getHours() let m (time.getMinutes() 10 ? 0 : ) time.getMinutes() let s (time.getSeconds() 10 ? 0 : ) time.getSeconds() return ${Y}-${M}-${D} ${h}:${m}:${s} } /script /head body div stylemargin-top: 20px; margin-left: 20px;请在控制台中查看/div script /** * * 版本描述 * * v0.0.1:2024-11-22 * 1.增加武将池数据 * 2.增加初始化势力功能 * 3.增加选择君主功能 * 4.增加回合操作功能征兵、征粮、出兵、招募、治疗 * 5.增加结束游戏功能 * 6.增加查看功能12345 * * * v0.0.2:2024-11-27 * 1.增加debug开关 * 2.更新武将池 * 3.修改回合指令展示为季节 * 4.增加魅力属性值 * 5.优化征兵、征粮、招募判定概率计算 * 6.修改出兵、战斗判定 * 7.优化各功能模块执行触发条件限定 * * * v0.0.3:2024-11-29 * 1.更新武将池 * 2.增加城市池数据 * 3.修改初始化势力功能增加城市池数据关联 * 4.修改征兵、征粮、招募判定概率计算逻辑 * 5.修改出兵触发判断条件 * 6.修改战斗判定条件、事件逻辑处理 * 7.增加随机事件池 * 8.增加随机事件判定触发逻辑 * 9.更新查看功能67 * * * v0.0.42024-12-15 * 1.修改[袁术]势力国号为[仲] * 2.出兵事件战败方增加武将概率受伤/死亡逻辑 * 3.出兵事件战败方增加[董卓吕布]特殊事件 * 4.修复随机事件[名将来投]报错 * 5.优化招募判定概率 * 6.增加首都城市设置增加灭国条件判定首都城市丢失 * 7.更新查看功能1, 7, 8910 * 8.增加君主官职系统 * 9.修复特殊事件[陈桥兵变]新势力登场后当前回合内不进行指令操作 * * * v0.0.52025-01-23 * 1.修复特殊事件[陈桥兵变]新增势力未初始化君主数据导致的报错 * 2.武将数据增加姓氏[xing]数据 * 3.增加特殊事件[家族荣耀] * 4.增加特殊城池属性-将领能力提升功能 * 5.增加势力武将官职系统 * 6.修改特殊事件触发季节、概率 * * * v0.0.6待定 * 1.增加成就系统 * 2.增加势力俘虏的受伤将领下野/死亡判定 * 3.增加默认剧本系统 * 4.增加宝物系统 * */ /script /body /html1、游戏初始化2、游戏中回合操作3、游戏历史统计信息注有些bug目前还没修复应该是在随机事件那部分会触发的概率高一些。