4.1皇冠和锚的赌博游戏

游戏规则,有一个6面的骰子,分别标有:皇冠,锚,红桃,梅花,黑桃,和方块。骰子总共有三个,
玩家可以下注。下注规则如下:
image.png
玩家初始有50便士,游戏分为三个部分:下注,投骰子,开奖结果。玩家的金钱输完,或本金翻倍,游戏结束。
分解流程图如下:

image.png

4.2 if else 语句

语法:

  1. if ( 条件 ) {
  2. //代码块1
  3. }else {
  4. //代码块2
  5. }

流程图:
image.png
演示案例:

  1. // 如果张三JavaScript考试成绩大于90分, 老师就奖励他一个苹果
  2. // 否则老师就罚他蹲马步
  3. let score = 100;
  4. if (score > 90) {
  5. console.log("老师说:不错,奖励一个苹果!");
  6. } else {
  7. console.log("老师说: 惩罚蹲5分钟马步! ");
  8. }

4.3 while循环

语法:

  1. while ( 循环条件 ) {
  2. 循环操作
  3. }

流程图:
image.png
示例:

  1. let i = 1;
  2. while (i <= 100) {
  3. console.log("第" + i + "遍写:好好学习,天天向上!");
  4. i++;
  5. }

4.4 do-while循环

语法:

  1. do {
  2. 循环操作
  3. }while ( 循环条件 );

流程图:
image.png
演示案例:

  1. //求从1加到100的总
  2. let sum = 0;
  3. let i = 1;
  4. do {
  5. sum = sum + i;
  6. i++;
  7. } while (i <= 100);
  8. console.log("从1加到100的总和是:" + sum);

4.5 for循环

语法:

  1. for(循环变量初始化;条件判断;更新循环变量){
  2. 循环操作
  3. }

流程图:
表达式1==循环变量初始化
表达式1==条件判断
表达式1==更新循环变量
image.png
演示案例:

  1. let sum = 0;
  2. for (let i = 1; i <= 100; i++) {
  3. sum = sum + i;
  4. }
  5. console.log("从1加到100的总和是:" + sum);

4.6最后的整合

玩家托马斯,他会从右边口袋随机拿出一把硬币(少则一枚硬币,多则全部拿出),这就是他本轮的资金。另外,托马斯很迷信,他相信数字7可以给他带来好运。所以如果他正好拿出了7枚硬币,他就会把他们都放回去,然后把所有钱压红桃上,否则他会把拿到的钱随机下注。
流程拆解
变量定义 funds(本金) = 50,bets(下注)={},hand(开奖)=[]。
一个M到N之间的随机数方法,包括rand(1,6)
随机的字符串表示骰子向上的一面(比如:红桃,皇冠):randFace();
下注给bets对象属性赋值
开奖给数组添加元素 hand.push();
结果计算 funds-totalBet,funds+winnings
回合记录:roll++
循环条件 (funds>0,funds<100)
特殊情况判断 totalBet===7

  1. //骰子
  2. const touzi = ["皇冠", "锚", "红桃", "黑桃", "梅花", "方块"];
  3. //返回随机数
  4. function rand(m, n) {
  5. return m + Math.floor((n - m + 1) * Math.random());
  6. }
  7. //返回骰子的任意一面
  8. function randFace() {
  9. let index = rand(0, 5);
  10. return touzi[index];
  11. }
  12. //下注
  13. let bets = {
  14. 皇冠: 0,
  15. 锚: 0,
  16. 红桃: 0,
  17. 黑桃: 0,
  18. 梅花: 0,
  19. 方块: 0
  20. };

特殊情况下注流程图
image.png

  1. let funds = 50; //本金
  2. let round = 0; //回合次数
  3. while (funds > 0 && funds < 100) {
  4. round++;
  5. console.log(`第${round}回合:`);
  6. console.log(`\t 本金或剩余金钱:${funds} p`);
  7. let totalBet = rand(1, funds);
  8. //特殊情况
  9. if (totalBet === 7) {
  10. //全部下注红桃
  11. totalBet = funds;
  12. bets.红桃 = totalBet;
  13. } else {
  14. //随机分配下注
  15. }
  16. funds = funds - totalBet;
  17. console.log(`\t 下注详情:` + Object.keys(bets).map(face => `${face}:${bets[face]}¥`).join(",") +
  18. `(总共下注:${totalBet} ¥)`);
  19. }

随机下注流程图
image.png

  1. //随机分配下注
  2. let remaining = totalBet;
  3. do {
  4. let bet = rand(1, remaining);
  5. let face = randFace();
  6. bets[face] = bets[face] + bet;
  7. remaining = remaining - bet;
  8. } while (remaining > 0);

掷骰子流程图
image.png

  1. const hand = [];
  2. for (let roll = 0; roll < 3; roll++) {
  3. hand.push(randFace());
  4. }
  5. console.log(`\t 开奖:${hand.join(', ')}`);

收集赢钱的流程图
image.png

  1. //收集赢到的钱
  2. let winnings = 0;
  3. for (let die = 0; die < hand.length; die++) {
  4. let face = hand[die];
  5. if (bets[face] > 0) {
  6. winnings = winnings + bets[face];
  7. }
  8. }
  9. funds = funds + winnings;
  10. console.log(`\t 赢:${winnings}`);

4.7switch语句

语法

  1. switch (表达式) {
  2. case 常量 1:
  3. 语句;
  4. break;
  5. case 常量 2:
  6. 语句;
  7. break;
  8. default:
  9. 语句;
  10. }

在皇冠和锚游戏中,如果玩家有多个迷信的数字,可以用switch语句来处理这个场景、例如:当玩家托马斯拿出了11或13便士时,他就会停止下注。

  1. switch (totalBet) {
  2. case 7:
  3. totalBet = funds;
  4. break;
  5. case 11:
  6. case 13:
  7. totalBet = 0;
  8. break;
  9. default:
  10. break;
  11. }
  12. //如果13比11更不吉利,当拿到13,不仅要停止下注,还要拿出1便士来做慈善。

4.8break和continue

break,打破跳出,提前结束流程
continue,跳出当前循环继续下一次循环
return 退出当前方法,并返回相应值
throw 异常处理机制,抛出异常

  1. let sum = 0;
  2. for (let i = 1; i <= 100; i++) {
  3. if (i % 2 === 0) {
  4. continue;
  5. }
  6. sum = sum + i;
  7. }
  8. console.log("1到100奇数的和是:" + sum);

4.9for-in和for-of

for-in 循环是为了循环对象中的属性key设计的。
语法

  1. for(变量 in 对象){
  2. 语句
  3. }

演示案例

  1. for (let prop in player) {
  2. if (!player.hasOwnProperty(prop)) {
  3. continue;
  4. }
  5. console.log(prop + ':' + player[prop]);
  6. }

for-of运算符是ES6中的新语法,他提供了另一种在集合中遍历元素的方法.
语法

  1. for(变量 of 对象){
  2. 语句
  3. }

演示案例:

  1. const hand = ['皇冠', '锚', '红桃'];
  2. for (let face of hand) {
  3. console.log(face);
  4. }