先做了一个流程 并没有实现功能 

这样先把大概流程 先写出来 后面只需要专心研究 函数的实现

对我个人而言 是比较容易理解的  在写流程的时候也加入了清屏函数

在上一篇代码中,由于写完之后再去添加的清屏函数 逻辑出了一些问题 

就省略了一些清屏函数 这次代码行数较少的情况  理解了清屏函数的放置位置 

以及 必须要一些空语句 (使程序暂停 ) 搭配起来才能出现效果  昨天就是没有考虑

这一点 导致 清屏函数 把 需要停留的信息清除掉  整个流程的开关 也更加清晰 明了 

可能后续填写函数功能的时候还是会出现一些问题   

  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 }

 

 

整个程序 循环  分支较多 需要慢慢理清思路 

想好再写 事半功倍 

大问题化小 

未完待续 (短路了    不知道说什么了)