//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);//随机1-10的个数
console.log(`你抽到的点数是:${point}`);
player.titlePoint+=point;//改变玩家的总点数
}
//结果比较
let judeg=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点,超过直接失败
//将isTakeCard值改为fales
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("");
}
}
//如果退出上面的循环,要么是玩家输了,要么是玩家主动退出
//所以先判断玩家的总点数是否大于21点
if(player.titlePoint>21){
console.log("电脑获胜");
computer.victory++;
}else{
//如果没有进入上面的if,说明是主动退出
//那我们就让电脑对象生成总点数,然后将两个对象传入judge函数比较
computer.titlePoint=Math.floor(Math.random()*21+1);
console.log(`您的总点数为:${player.titlePoint},电脑的总点数为:${computer.titlePoint}`);
let result=judeg(player,computer);
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("");
//继续单人模式 不继续直接将continuePlay改成fales
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:
{
//和单人模式一样,还是初始化对象,不过多了一个isTakeCare属性
let player1={victory:0,titlePoint:0,isTakeCard:true};
let player2={victory:0,titlePoint:0,isTakeCard:true};
//continuePlay变量表示是否继续双人模式
let continuePlay=true;
while(continuePlay){
//根据两个对象的isTakePlay属性值判断是否抽牌,只要两个对象有一个属性值为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都为fales,接下来直接比较
if(player1.titlePoint>21){
console.log("玩家A失败!");
console.log("玩家B获胜!");
player2.victory++;
}else if(player2.titlePoint>21){
console.log("玩家A获胜!");
console.log("玩家B失败!");
player1.victory++;
}else{
let result=judeg(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
console.log("感谢您的使用")
useSys=false;
}
break;
}
}
clear();
console.log("Thank you for playing");
}
main();

JS-21点游戏的更多相关文章

  1. JavaScript中纯JS写21点游戏

    // 21点游戏 分为人机对战和人人对战 // 玩家每次抽一张牌 牌的点数为1-10点随机数 谁更接近21点谁就获胜 let readline = require("readline-syn ...

  2. JS开发HTML5游戏《神奇的六边形》(四)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  3. JS开发HTML5游戏《神奇的六边形》(一)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  4. JS开发HTML5游戏《神奇的六边形》(二)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  5. JS开发HTML5游戏《神奇的六边形》(三)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  6. JS贪吃蛇游戏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. Vue.js实现拼图游戏

    Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...

  8. 使用html+css+js实现弹球游戏

    使用html+css+js实现弹球游戏 效果图: 代码如下,复制即可使用: <!doctype html> <head> <style type="text/c ...

  9. 使用JS实现俄罗斯方块游戏

    简单的JS俄罗斯方块游戏源码 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  10. pixi.js 微信小游戏 入手

    pixi是什么?一款h5游戏引擎 优点:简单简洁性能第一 缺点:大多数用的国产三大引擎,pixi资料少,工具少, 为什么学,装逼 用pixi开发小游戏行吗? 行.但要简单处理下 下载官网上的 weap ...

随机推荐

  1. XCode保存问题

    1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中心重新生成一个. 3. 包标识符不与描述文件包含的包标识符不一致,按照它的提示换一下就好了,最好不要点 ...

  2. .NET能开发出什么样的APP?盘点通过Smobiler开发的APP

    .NET程序员一定最熟悉所见即所得式开发,亲切的Visual Studio开发界面,敲了无数个日夜的C#代码. Smobiler也是因为具备这样的特性,使开发人员,可以在VisualStudio上,像 ...

  3. IOS系统在Safari安装ipa文件

    配置点击下载的地址 itms-services://?action=download-manifest&url= "plist文件路径"plist文件配置 IIS网站配置要 ...

  4. MySQL中日期和时间类型

    1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割 ...

  5. Qt在window下的环境变量PATH的配置

    Qt在window下的环境变量PATH的配置 路劲: C:\Qt\Qt5.6.0\5.6\mingw49_32\bin C:\Qt\Qt5.6.0\Tools\mingw492_32\bin 发布Qt ...

  6. [PHP] Ubuntu快速安装起PHP7.4

    先安装一下这个命令 add-apt-repositoryapt-get install software-properties-common 添加第三方源:add-apt-repository ppa ...

  7. [PHP] 近期接手現有的企邮前端框架业务所遇困难

    1.邮箱前端有三大产品线,包括免费邮箱,VIP邮箱,企业邮箱,使用的一套代码,在代码中进行的逻辑判断处理,根据不同的配置进行不同的业务操作.有很多逻辑是各产品线是不同的,需要仔细开发和判断才能不会影响 ...

  8. golang中的接口

    CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...

  9. nginx 与 uWsgi 详解

    什么是nginx nginx是一个开源的,支持高性能,高并发的代理服务软件 nginx不但是一个优秀的web服务软件,还可以作为反想代理和负载均衡,以及缓存服务或使用 为什么使用nginx 支持高并发 ...

  10. python27期JavaScript:

    JavaScript:(简称“JS”) 是一种轻量级的编程语言(ECMAscript5或6)是一种解释性脚本语言(代码不进行预编译)主要用来向HTML页面添加交互行为JavaScript 是互联网上最 ...