• JS小游戏----决胜21点


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

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

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

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

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

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

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

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

      1 let readline = require("readline-sync");
      2 //清屏函数
      3 let clear = () => process.stdout.write(process.platform === 'win32' ? 'x1Bc' : 'x1B[2Jx1B[3Jx1B[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点谁就算胜利
    ");
    100                     console.log("双人模式规则:");
    101                     console.log("两名玩家轮流抽牌,在不超过21点的前提下进行总点数的比较,谁更接近21点谁就算胜利
    ");
    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("
    当前比分如下:");
    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 }

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

    想好再写 事半功倍 

    大问题化小 

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

  • 相关阅读:
    KubeSphere 3.1.0 GA:混合多云走向边缘,让应用无处不在
    5.29 相约杭州!云原生 Meetup 第二期杭州站开启报名
    SQL查询每门课程的前几名
    JavaScript之构造函数
    wchar*与char *相互转换 [MultiByteToWideChar、WideCharToMultiByte函数用法]
    面试、笔试中常用的SQL语句(数据库知识必杀)一共50个!!!
    HTTP协议详解
    浅谈model, orm, dao和active record的区别
    ASP.NET 2.0中的跨页面提交
    YII框架yiic、gii工具使用方法
  • 原文地址:https://www.cnblogs.com/ATnTention/p/11408286.html
Copyright © 2020-2023  润新知