// 21点游戏 分为人机对战和人人对战
   
  
   // 玩家每次抽一张牌 牌的点数为1-10点随机数 谁更接近21点谁就获胜
   
  
   let readline = require("readline-sync");
   
  
   // 清屏函数
   
  
   let clear = () => process.stdout.write(process.platform === 'win32' ? '\x1Bc' : '\x1B[2J\x1B[3J\x1B[H');
   
  
   // 抽牌函数 接收一个参数 玩家对象
   
  
   let takeCard = function (player) {
   
  
   let point = Math.floor(Math.random() * 10 + 1); // 随机获取一个点数
   
  
   console.log(`你抽取到的点数为:${point}`);
   
  
   player.titlePoint += point; // 改变玩家对象的总点数
   
  
   }
   
  
   // 结果比较函数 接收2个参数 两个玩家对象
   
  
   let judge = function (player1, player2) {
   
  
   if (player1.titlePoint > player2.titlePoint) {
   
  
   return 1;
   
  
   }
   
  
   else if (player1.titlePoint < player2.titlePoint) {
   
  
   return 2;
   
  
   }
   
  
   else {
   
  
   return 0;
   
  
   }
   
  
   }
   
  
   // 主函数
   
  
   let main = function () {
   
  
   let useSys = true; // 是否使用系统 默认值true代表一直使用
   
  
   while (useSys) {
   
  
   clear();
   
  
   console.log("欢迎来到21点的世界");
   
  
   console.log("请选择游戏选项: 1.单人模式 2.双人模式 3.游戏说明 4.退出游戏");
   
  
   let funcSelect = parseInt(readline.question(""));
   
  
   switch (funcSelect) {
   
  
   // 单人模式
   
  
   case 1:
   
  
   {
   
  
   // 首先初始化两个对象,一个玩家,一个电脑
   
  
   let player = { victory: 0, titlePoint: 0 };
   
  
   let computer = { victory: 0, titlePoint: 0 };
   
  
   let continuePlay = true; // 是否继续单人模式
   
  
   while (continuePlay) {
   
  
   let isTakeCard = true; // 玩家是否有资格抽取下一张牌 默认是true 有资格抽取
   
  
   // 玩家抽牌的循环
   
  
   while (isTakeCard) {
   
  
   clear();
   
  
   console.log(`当前的总点数为:${player.titlePoint}`);
   
  
   console.log("是否要抽取一张牌?(Y/N)");
   
  
   let isTake = readline.question("");
   
  
   switch (isTake) {
   
  
   case "Y":
   
  
   case "y":
   
  
   takeCard(player); // 用户已经抽取了一张牌,里面有点数了
   
  
   // 玩家每抽取一张牌,都要进行是否超过21点的判断 如果超过21点,就不能继续抽牌了
   
  
   // 直接将isTakeCard值改为false
   
  
   if (player.titlePoint > 21) {
   
  
   console.log("你已经爆炸了!");
   
  
   readline.question("");
   
  
   isTakeCard = false;
   
  
   break;
   
  
   }
   
  
   console.log("\n按回车键继续");
   
  
   readline.question("");
   
  
   break;
   
  
   case "N":
   
  
   case "n":
   
  
   isTakeCard = false;
   
  
   break;
   
  
   default:
   
  
   console.log("输入有误,请重新输入");
   
  
   readline.question("");
   
  
   }
   
  
   }
   
  
   // 如果退出了上面的while,说明两种情况,一是玩家爆了,二是玩家主动退出来的
   
  
   // 所以我们首先判断玩家的总点数是否大于21
   
  
   if (player.titlePoint > 21) {
   
  
   console.log("电脑获胜");
   
  
   computer.victory++;
   
  
   }
   
  
   else {
   
  
   // 如果没有进入上面的if,说明玩家是主动退出来的
   
  
   // 那么我们就让电脑对象生成总点数,然后将两个对象传入judge函数进行比较
   
  
   computer.titlePoint = Math.floor(Math.random() * 7 + 15); // 电脑随机的总点数为15-21的随机数
   
  
   console.log(`你的总点数为${player.titlePoint},电脑的总点数为${computer.titlePoint}`);
   
  
   let result = judge(player, computer);
   
  
   // 根据judge函数返回的结果来显示不同的信息
   
  
   switch (result) {
   
  
   case 0:
   
  
   console.log("本局为平局,不加分");
   
  
   break;
   
  
   case 1:
   
  
   console.log("玩家获胜");
   
  
   player.victory++;
   
  
   break;
   
  
   case 2:
   
  
   console.log("电脑获胜");
   
  
   computer.victory++;
   
  
   break;
   
  
   }
   
  
   }
   
  
   // 打印信息
   
  
   console.log("\n当前比分如下:");
   
  
   console.log(`玩家:${player.victory} vs 电脑:${computer.victory}`);
   
  
   readline.question("");
   
  
   // 询问玩家是否要继续单人模式 如果不继续了,直接将continuePlay修改为false
   
  
   while (true) {
   
  
   console.log("是否继续游戏?(Y/N)");
   
  
   let isAgain = readline.question("");
   
  
   // 如果要继续单人模式 那么需要将两个对象的总点数重置为0
   
  
   if (isAgain === 'Y' || isAgain === 'y') {
   
  
   player.titlePoint = 0;
   
  
   computer.titlePoint = 0;
   
  
   break;
   
  
   }
   
  
   else if (isAgain === 'N' || isAgain === 'n') {
   
  
   continuePlay = false;
   
  
   break;
   
  
   }
   
  
   else {
   
  
   console.log("输入有误,请重新输入\n");
   
  
   }
   
  
   }
   
  
   }
   
  
   // 能够来到这里,说明玩家输入的n,这时continuePlay的值为false
   
  
   // 打印最终结果即可
   
  
   clear();
   
  
   console.log("最终比分如下:");
   
  
   console.log(`玩家:${player.victory} vs 电脑:${computer.victory}`);
   
  
   console.log("\n按回车键返回");
   
  
   readline.question("");
   
  
   }
   
  
   break;
   
  
   // 双人模式
   
  
   case 2:
   
  
   {
   
  
   // 和单人游戏模式一样,还是初始化两个对象,不过这两个对象多了一个isTakeCard属性
   
  
   let player1 = { victory: 0, titlePoint: 0, isTakeCard: true };
   
  
   let player2 = { victory: 0, titlePoint: 0, isTakeCard: true };
   
  
   // continuePlay变量表示是否继续双人模式
   
  
   let continuePlay = true;
   
  
   while (continuePlay) {
   
  
   // 根据两个玩家对象的isTakeCard属性值判断是否抽牌,只要两个对象有一个属性值为true就会进入while循环
   
  
   while (player1.isTakeCard || player2.isTakeCard) {
   
  
   // 根据玩家1的isTakeCard属性值来判断玩家1是否抽牌
   
  
   if (player1.isTakeCard) {
   
  
   let inputValidate = true; // 此变量为输入验证 用于后面验证玩家的输入
   
  
   while (inputValidate) {
   
  
   clear();
   
  
   // 在抽牌之前首先打印当前的点数信息,然后开始询问玩家是否抽牌
   
  
   console.log("总点数:")
   
  
   console.log(`玩家A:${player1.titlePoint} vs 玩家B:${player2.titlePoint}`);
   
  
   console.log("玩家A 是否抽牌?(Y/N)");
   
  
   let isTake = readline.question("");
   
  
   switch (isTake) {
   
  
   case "Y":
   
  
   case "y":
   
  
   inputValidate = false; // 做输入验证
   
  
   takeCard(player1); // 抽一张牌
   
  
   readline.question("");
   
  
   // 大于21,直接将两个玩家的isTakeCard都修改为false,这样可以退出上上个while
   
  
   if (player1.titlePoint > 21) {
   
  
   player1.isTakeCard = false;
   
  
   player2.isTakeCard = false;
   
  
   }
   
  
   break;
   
  
   case "N":
   
  
   case "n":
   
  
   // 代表玩家不抽牌了,将isTakeCard属性改为false
   
  
   inputValidate = false;
   
  
   player1.isTakeCard = false;
   
  
   break;
   
  
   default:
   
  
   console.log("输入有误,请重新输入");
   
  
   readline.question("");
   
  
   }
   
  
   }
   
  
   }
   
  
   // 和上面相同
   
  
   if (player2.isTakeCard) {
   
  
   let inputValidate = true;
   
  
   while (inputValidate) {
   
  
   clear();
   
  
   console.log("总点数:")
   
  
   console.log(`玩家A:${player1.titlePoint} vs 玩家B:${player2.titlePoint}`);
   
  
   console.log("玩家B 是否抽牌?(Y/N)");
   
  
   let isTake = readline.question("");
   
  
   switch (isTake) {
   
  
   case "Y":
   
  
   case "y":
   
  
   inputValidate = false;
   
  
   takeCard(player2);
   
  
   readline.question("");
   
  
   if (player2.titlePoint > 21) {
   
  
   player1.isTakeCard = false;
   
  
   player2.isTakeCard = false;
   
  
   }
   
  
   break;
   
  
   case "N":
   
  
   case "n":
   
  
   inputValidate = false;
   
  
   player2.isTakeCard = false;
   
  
   break;
   
  
   default:
   
  
   console.log("输入有误,请重新输入");
   
  
   readline.question("");
   
  
   }
   
  
   }
   
  
   }
   
  
   }
   
  
   // 代码来到这里说明两个玩家的isTakeCard都为false,接下来直接进行比较即可
   
  
   if (player1.titlePoint > 21) {
   
  
   console.log("玩家A已爆炸!");
   
  
   console.log("玩家B获胜");
   
  
   player2.victory++;
   
  
  
    }
   
  
    else if (player2.titlePoint > 21) {
   
  
    console.log("玩家B已爆炸!");
   
  
    console.log("玩家A获胜");
   
  
    player1.victory++;
   
  
    }
   
  
    else {
   
  
    let result = judge(player1, player2);
   
  
    switch (result) {
   
  
    case 0:
   
  
    console.log("本局为平局,不加分");
   
  
    break;
   
  
    case 1:
   
  
    console.log("玩家A获胜");
   
  
    player1.victory++;
   
  
    break;
   
  
    case 2:
   
  
    console.log("玩家B获胜");
   
  
    player2.victory++;
   
  
    break;
   
  
    }
   
  
    }
   
  
    console.log("\n当前比分如下:");
   
  
    console.log(`玩家A:${player1.victory} vs 玩家B:${player2.victory}`);
   
  
    readline.question("");
   
  
    while (true) {
   
  
    console.log("是否继续游戏?(Y/N)");
   
  
    let isAgain = readline.question("");
   
  
    if (isAgain === 'Y' || isAgain === 'y') {
   
  
    player1.titlePoint = 0;
   
  
    player2.titlePoint = 0;
   
  
    player1.isTakeCard = true;
   
  
    player2.isTakeCard = true;
   
  
    break;
   
  
    }
   
  
    else if (isAgain === 'N' || isAgain === 'n') {
   
  
    continuePlay = false;
   
  
    break;
   
  
    }
   
  
    else {
   
  
    console.log("输入有误,请重新输入\n");
   
  
    }
   
  
    }
   
  
    }
   
  
    clear();
   
  
    console.log("最终比分如下:");
   
  
    console.log(`玩家A:${player1.victory} vs 玩家B:${player2.victory}`);
   
  
    console.log("\n按回车键返回");
   
  
    readline.question("");
   
  
    }
   
  
    break;
   
  
    // 游戏说明
   
  
    case 3:
   
  
    {
   
  
    clear();
   
  
    console.log("单人模式规则:");
   
  
    console.log("单人模式下玩家可以连续抽牌,每回合抽取的点数为1-10点中任意一个点数");
   
  
    console.log("所有点数相加不能超过21点,然后总点数和电脑点数进行比较,谁更接近21点谁就算胜利\n");
   
  
    console.log("双人模式规则:");
   
  
    console.log("两名玩家轮流抽牌,在不超过21点的前提下进行总点数的比较,谁更接近21点谁就算胜利\n");
   
  
    console.log("按回车键返回");
   
  
    readline.question("");
   
  
    }
   
  
    break;
   
  
    // 退出游戏
   
  
    case 4:
   
  
    {
   
  
    // 要退出游戏 直接将useSys修改为false
   
  
    useSys = false;
   
  
    }
   
  
    break;
   
  
    }
   
  
    }
   
  
    clear();
   
  
    console.log("Thank you for playing");
   
  
   }
   
  
   main();
   
 
 
转载于:https://www.cnblogs.com/zai1/p/11176486.html
                
        
 
相关资源:JavaScript编写的小游戏 射击 21点 贪吃蛇等等