//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 7.3 解决自定义类无法自动联想

    正在苦拼的码友们,最近是不是觉得在写代码的时候很是头疼,甚至连个最基本的系统自带的语法啊.单词啊等等都不能联想了,之前习惯了的码友们,这个时候肯定会觉得是不是自己写错了,然后也往下翻了一大篇,还是找不 ...

  2. iOS滑动手势UIPanGestureRecognizer 注意事项

    今天在做侧滑页面时,发现页面随着滑动手势而滑动,到临界点时,如果再滑动会出现抖动现象.找到解决办法是进入方法后先判断一次,再判断是在滑动范围内让页面滑动.遂将滑动手势(UIPanGestureReco ...

  3. 用Toad for Oracle创建数据库表空间和用户

    打开Toad, 1,菜单栏Session—>new Connection….打开如下窗口: 2,进入之后,菜单DatebaseàSechema  Brower...找到Table Space(表 ...

  4. Falling back to java on path. This behavior is deprecated

    windows启动elasticsearch报错:warning: Falling back to java on path. This behavior is deprecated. Specify ...

  5. Docker Harbor

    简介: Harbor是一个用于存储Docker镜像的企业级Registry服务:本章将介绍如何搭建Harbor Registry! Github官方安装文档: https://github.com/g ...

  6. CodeForces - 1257E (思维)

    题意 https://vjudge.net/problem/CodeForces-1257E 三个人,每个人有一些数字,组合起来是1~n,每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人 ...

  7. day58_9_24多对多建表手动,form组件(判断类型),cookies和session

    一.多对多建表关系之手动添加. 1.全自动 像之前讲过的一样,我们可以通过manytomanyField的字段来建立多对多关系: class Book(models.Model): title = m ...

  8. 洛谷 P4316 绿豆蛙的归宿

    洛谷 P4316 绿豆蛙的归宿 洛谷传送门 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度, ...

  9. 【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)

    \(IDA^*\) 说实话,这道题我一开始没想出正解,于是写了一个\(IDA^*\)... 但神奇的是,这个\(IDA^*\)居然连字符串长度分别为\(2500,4000\)的数据都跑得飞快,不过数据 ...

  10. Spring Boot(十二):LocalDateTime格式化处理

    Java 8之后,日期类的处理建议使用java.time包中对应的LocalDateTime, LocalDate, LocalTime类.(参考Java8新特性) 在Spring Boot中(验证版 ...