4.1皇冠和锚的赌博游戏
游戏规则,有一个6面的骰子,分别标有:皇冠,锚,红桃,梅花,黑桃,和方块。骰子总共有三个,
玩家可以下注。下注规则如下:
玩家初始有50便士,游戏分为三个部分:下注,投骰子,开奖结果。玩家的金钱输完,或本金翻倍,游戏结束。
分解流程图如下:
4.2 if else 语句
语法:
if ( 条件 ) {
//代码块1
}else {
//代码块2
}
流程图:
演示案例:
// 如果张三JavaScript考试成绩大于90分, 老师就奖励他一个苹果
// 否则老师就罚他蹲马步
let score = 100;
if (score > 90) {
console.log("老师说:不错,奖励一个苹果!");
} else {
console.log("老师说: 惩罚蹲5分钟马步! ");
}
4.3 while循环
语法:
while ( 循环条件 ) {
循环操作
}
流程图:
示例:
let i = 1;
while (i <= 100) {
console.log("第" + i + "遍写:好好学习,天天向上!");
i++;
}
4.4 do-while循环
语法:
do {
循环操作
}while ( 循环条件 );
流程图:
演示案例:
//求从1加到100的总
let sum = 0;
let i = 1;
do {
sum = sum + i;
i++;
} while (i <= 100);
console.log("从1加到100的总和是:" + sum);
4.5 for循环
语法:
for(循环变量初始化;条件判断;更新循环变量){
循环操作
}
流程图:
表达式1==循环变量初始化
表达式1==条件判断
表达式1==更新循环变量
演示案例:
let sum = 0;
for (let i = 1; i <= 100; i++) {
sum = sum + i;
}
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
//骰子
const touzi = ["皇冠", "锚", "红桃", "黑桃", "梅花", "方块"];
//返回随机数
function rand(m, n) {
return m + Math.floor((n - m + 1) * Math.random());
}
//返回骰子的任意一面
function randFace() {
let index = rand(0, 5);
return touzi[index];
}
//下注
let bets = {
皇冠: 0,
锚: 0,
红桃: 0,
黑桃: 0,
梅花: 0,
方块: 0
};
特殊情况下注流程图
let funds = 50; //本金
let round = 0; //回合次数
while (funds > 0 && funds < 100) {
round++;
console.log(`第${round}回合:`);
console.log(`\t 本金或剩余金钱:${funds} p`);
let totalBet = rand(1, funds);
//特殊情况
if (totalBet === 7) {
//全部下注红桃
totalBet = funds;
bets.红桃 = totalBet;
} else {
//随机分配下注
}
funds = funds - totalBet;
console.log(`\t 下注详情:` + Object.keys(bets).map(face => `${face}:${bets[face]}¥`).join(",") +
`(总共下注:${totalBet} ¥)`);
}
随机下注流程图
//随机分配下注
let remaining = totalBet;
do {
let bet = rand(1, remaining);
let face = randFace();
bets[face] = bets[face] + bet;
remaining = remaining - bet;
} while (remaining > 0);
掷骰子流程图
const hand = [];
for (let roll = 0; roll < 3; roll++) {
hand.push(randFace());
}
console.log(`\t 开奖:${hand.join(', ')}`);
收集赢钱的流程图
//收集赢到的钱
let winnings = 0;
for (let die = 0; die < hand.length; die++) {
let face = hand[die];
if (bets[face] > 0) {
winnings = winnings + bets[face];
}
}
funds = funds + winnings;
console.log(`\t 赢:${winnings}`);
4.7switch语句
语法
switch (表达式) {
case 常量 1:
语句;
break;
case 常量 2:
语句;
break;
default:
语句;
}
在皇冠和锚游戏中,如果玩家有多个迷信的数字,可以用switch语句来处理这个场景、例如:当玩家托马斯拿出了11或13便士时,他就会停止下注。
switch (totalBet) {
case 7:
totalBet = funds;
break;
case 11:
case 13:
totalBet = 0;
break;
default:
break;
}
//如果13比11更不吉利,当拿到13,不仅要停止下注,还要拿出1便士来做慈善。
4.8break和continue
break,打破跳出,提前结束流程
continue,跳出当前循环继续下一次循环
return 退出当前方法,并返回相应值
throw 异常处理机制,抛出异常
let sum = 0;
for (let i = 1; i <= 100; i++) {
if (i % 2 === 0) {
continue;
}
sum = sum + i;
}
console.log("1到100奇数的和是:" + sum);
4.9for-in和for-of
for-in 循环是为了循环对象中的属性key设计的。
语法
for(变量 in 对象){
语句
}
演示案例
for (let prop in player) {
if (!player.hasOwnProperty(prop)) {
continue;
}
console.log(prop + ':' + player[prop]);
}
for-of运算符是ES6中的新语法,他提供了另一种在集合中遍历元素的方法.
语法
for(变量 of 对象){
语句
}
演示案例:
const hand = ['皇冠', '锚', '红桃'];
for (let face of hand) {
console.log(face);
}