先做了一个流程 并没有实现功能
这样先把大概流程 先写出来 后面只需要专心研究 函数的实现
对我个人而言 是比较容易理解的 在写流程的时候也加入了清屏函数
在上一篇代码中,由于写完之后再去添加的清屏函数 逻辑出了一些问题
就省略了一些清屏函数 这次代码行数较少的情况 理解了清屏函数的放置位置
以及 必须要一些空语句 (使程序暂停 ) 搭配起来才能出现效果 昨天就是没有考虑
这一点 导致 清屏函数 把 需要停留的信息清除掉 整个流程的开关 也更加清晰 明了
可能后续填写函数功能的时候还是会出现一些问题
1 let readline = require("readline-sync"); 2 //清屏函数 3 let clear = () => process.stdout.write(process.platform === 'win32' ? '\x1Bc' : '\x1B[2J\x1B[3J\x1B[H'); 4 //难度全局变量level 5 var level = 16; //默认为普通难度 6 7 8 9 function soloMode() { 10 clear(); 11 console.log("欢迎进入单人模式"); 12 console.log("enter continue!"); 13 readline.question(""); 14 } 15 function doubleMode() { 16 clear(); 17 console.log("欢迎进入双人模式"); 18 console.log("enter continue!"); 19 readline.question(""); 20 } 21 function setLevel() { 22 let case3 = true; 23 while (case3) { 24 clear(); 25 console.log("1,简单 2,普通 3,困难 4,地狱 5,返回主菜单"); 26 let level = parseInt(readline.question("")); 27 switch (level) { 28 case 1: 29 clear(); 30 level = 15; 31 console.log(level); 32 console.log("设置完成!"); 33 console.log("enter continue!"); 34 readline.question(""); 35 break; 36 case 2: 37 clear(); 38 level = 16; 39 console.log(level); 40 console.log("设置完成!"); 41 console.log("enter continue!"); 42 readline.question(""); 43 break; 44 case 3: 45 clear(); 46 level = 17; 47 console.log(level); 48 console.log("设置完成!"); 49 console.log("enter continue!"); 50 readline.question(""); 51 break; 52 case 4: 53 clear(); 54 level = 18; 55 console.log(level); 56 console.log("设置完成,感受电脑的恐怖吧"); 57 console.log("enter continue!"); 58 readline.question(""); 59 break; 60 case 5: 61 clear(); 62 case3 = false; 63 break; 64 default: 65 console.log("别乱按了好吗? 听我的 我说了算!"); 66 console.log("我不要你觉得,我要我觉得!"); 67 console.log("这个问题不需要商量!"); 68 console.log("按enter键继续"); 69 readline.question(""); 70 } 71 } 72 } 73 74 75 function main() { 76 let startGame = true; 77 while (startGame) { 78 clear(); 79 console.log("1,单人模式 2,双人模式 3,设置电脑级别 4,游戏说明 5,退出游戏"); 80 let mode = parseInt(readline.question("")); 81 switch (mode) { 82 case 1: 83 clear(); 84 soloMode(); 85 break; 86 case 2: 87 clear(); 88 doubleMode(); 89 break; 90 case 3: 91 clear(); 92 setLevel(); 93 break; 94 case 4: 95 { 96 clear(); 97 console.log("单人模式规则:"); 98 console.log("单人模式下玩家可以连续抽牌,每回合抽取的点数为1-10点中任意一个点数"); 99 console.log("所有点数相加不能超过21点,然后总点数和电脑点数进行比较,谁更接近21点谁就算胜利\n"); 100 console.log("双人模式规则:"); 101 console.log("两名玩家轮流抽牌,在不超过21点的前提下进行总点数的比较,谁更接近21点谁就算胜利\n"); 102 console.log("按回车键返回"); 103 readline.question(""); 104 } 105 break; 106 case 5: 107 startGame = false; 108 break; 109 default: 110 clear(); 111 console.log("输出错误 按enter继续"); 112 readline.question(""); 113 } 114 } 115 } 116 main();
在写的过程中 单人模式 是与电脑产生的随机数比较 工作量较小
但是 在双人模式 中 更加复杂 一点是要控制player1 和 player2 的抽卡状态
2位玩家交替抽卡 玩家爆炸 自动结束 游戏
单人模式用两个while循环判断状态
双人模式需要用三个 while 循环 思考的时候要理清楚层级关系
不然容易出错 出现错误的时候 也要找准找到问题代码 分析产生问题的原因
在需求功能之外 还添加了 设置电脑难度功能
实现这个很简单 就是把 电脑产生随机数的范围 用一个全局变量level控制
这样电脑产生的数字就很大 玩家赢的游戏的难度也就越大
抽卡函数
1 function chou_ka(player) { 2 let cardPoint = Math.floor(Math.random() * 10 + 1); 3 console.log(`你抽到了${cardPoint}`); 4 player.point += cardPoint; 5 }
判别函数
1 function judge(player1, player2) { 2 if (player1.point > player2.point) { 3 console.log(`${player1.name} 总点数:${player1.point}`); 4 console.log(`${player2.name} 总点数:${player2.point}`); 5 console.log(`${player1.name}获胜`); 6 player1.vic++; 7 describe(player1, player2); 8 } 9 else if (player1.point < player2.point) { 10 console.log(`${player1.name} 总点数:${player1.point}`); 11 console.log(`${player2.name} 总点数:${player2.point}`); 12 console.log(`${player2.name}获胜`); 13 player2.vic++; 14 describe(player1, player2); 15 } 16 else { 17 console.log(`${player1.name} 总点数:${player1.point}`); 18 console.log(`${player2.name} 总点数:${player2.point}`); 19 console.log("平局"); 20 describe(player1, player2); 21 } 22 }
打印 描述 函数
1 function describe(player1, player2) { 2 console.log("\n当前比分如下:"); 3 console.log(`${player1.name}:${player1.vic} vs ${player1.name}:${player2.vic}`); 4 readline.question(""); 5 }
单人模式函数
1 function soloMode() { 2 clear(); 3 console.log("欢迎进入单人模式"); 4 //初始化对象 5 let player = { name: "玩家", vic: 0, point: 0 }; 6 let com = { name: "电脑", vic: 0, point: 0 }; 7 8 let solo = true; //solo mode switch 9 while (solo) { 10 let getCard = true; 11 while (getCard) { 12 clear(); 13 console.log(`当前的总点数为:${player.point}`); 14 console.log("是否要抽取一张牌?(Y/N)"); 15 let get = readline.question(""); 16 switch (get) { 17 case "y": 18 case "Y": 19 chou_ka(player); 20 if (player.point > 21) { 21 console.log("You Out!"); 22 readline.question(""); 23 getCard = false; 24 break; 25 } 26 console.log("按回车键继续"); 27 readline.question(""); 28 break; 29 break; 30 case "N": 31 case "n": 32 getCard = false; 33 break; 34 break; 35 default: 36 console.log("输入有误,请重新输入"); 37 console.log("不要乱整!!!"); 38 readline.question(""); 39 } 40 } 41 42 //退出抽卡环节 进入比较环节 43 if (player.point > 21) { 44 console.log("电脑获胜"); 45 com.vic++; 46 describe(player, com); 47 } 48 else { 49 com.point = Math.floor(Math.random() * (21 - level + 1) + level); 50 judge(player, com); 51 } 52 53 //是否继续单人模式 54 while (1) { 55 console.log("是否继续单人模式 Y/N "); 56 let again = readline.question(""); 57 if (again === "Y" || again === "y") { 58 player.point = 0; 59 com.point = 0; 60 break; 61 } 62 else if (again === "N" || again === "n") { 63 solo = false; 64 break; 65 } 66 else { 67 console.log("error!!! re-input!!"); 68 readline.question(""); 69 } 70 } 71 } 72 clear(); 73 console.log("最终比分如下:"); 74 console.log(`玩家:${player.vic} vs 电脑:${com.vic}`); 75 console.log("enter continue!"); 76 readline.question(""); 77 }
双人模式函数
1 function doubleMode() { 2 clear(); 3 console.log("欢迎进入双人模式"); 4 //初始化对象 5 //可以将AB的抽卡状态 写在对象里面 更符合实际情况 6 //写在外面也可以 7 let player1 = { name: "玩家AAA", vic: 0, point: 0, state: true }; 8 let player2 = { name: "玩家BBB", vic: 0, point: 0, state: true }; 9 10 let double = true; //double mode switch 11 while (double) { //双人模式 循环 12 let getCard = true; 13 while (player1.state || player2.state) { 14 //根据两个对象的state属性判断是否继续抽卡 15 if (player1.state) { 16 let inputState = true; 17 //只要输入了正确的isTake 就会停止 下一个状态判断循环 会打开开关 18 //输入验证 19 while (inputState) { 20 clear(); 21 console.log("总点数:"); 22 // console.log(``) 23 console.log(`${player1.name}:${player1.point} vs ${player2.name}:${player2.point}`); 24 console.log("玩家A 是否抽牌?(Y/N)"); 25 let isTake = readline.question(""); 26 switch (isTake) { 27 case "Y": 28 case "y": 29 inputState = false; // 做输入验证 30 chou_ka(player1); // 抽一张牌 31 readline.question(""); 32 if (player1.point > 21) { 33 player1.state = false; 34 player2.state = false; 35 } 36 break; 37 case "N": 38 case "n": 39 40 inputState = false; 41 player1.state = false; 42 break; 43 default: 44 console.log("输入有误,请重新输入"); 45 readline.question(""); 46 } 47 } 48 } 49 if (player2.state) { 50 let inputState = true; 51 while (inputState) { 52 clear(); 53 console.log("总点数:") 54 console.log(`玩家A:${player1.point} vs 玩家B:${player2.point}`); 55 console.log("玩家B 是否抽牌?(Y/N)"); 56 let isTake = readline.question(""); 57 switch (isTake) { 58 case "Y": 59 case "y": 60 inputState = false; 61 chou_ka(player2); 62 readline.question(""); 63 if (player2.point > 21) { 64 player1.state = false; 65 player2.state = false; 66 } 67 break; 68 case "N": 69 case "n": 70 inputState = false; 71 player2.state = false; 72 break; 73 default: 74 console.log("输入有误,请重新输入"); 75 readline.question(""); 76 } 77 } 78 } 79 } 80 //退出抽卡环节 进入比较环节 81 if (player1.point > 21) { 82 console.log("玩家A已爆炸!"); 83 console.log("玩家B获胜"); 84 player2.vic++; 85 describe(player1, player2); 86 } 87 else if (player2.point > 21) { 88 console.log("玩家B已爆炸!"); 89 console.log("玩家A获胜"); 90 player1.vic++; 91 describe(player1, player2); 92 } 93 else { 94 judge(player1, player2); 95 } 96 97 //是否继续双人模式 98 while (1) { 99 console.log("是否继续双人模式 Y/N "); 100 let again = readline.question(""); 101 if (again === "Y" || again === "y") { 102 player1.point = 0; 103 player2.point = 0; 104 player1.state = true; 105 player2.state = true; 106 break; 107 } 108 else if (again === "N" || again === "n") { 109 double = false; 110 break; 111 } 112 else { 113 console.log("error!!! re-input!!"); 114 readline.question(""); 115 } 116 } 117 } 118 clear(); 119 console.log("最终比分如下:"); 120 console.log(`${player1.name}:${player1.vic} vs ${player2.name}:${player2.vic}`); 121 console.log("enter continue!"); 122 readline.question(""); 123 }
整个程序 循环 分支较多 需要慢慢理清思路
想好再写 事半功倍
大问题化小
未完待续 (短路了 不知道说什么了)