模拟二十一点飞镖游戏



我尝试在DartPad中编写一个程序来模拟一系列21点游戏,其中玩家遵循与庄家完全相同的策略,即直到得分超过16。根据这里和这里的文章庄家至少比玩家有5%的优势。我如何解释这个优势?同样,为什么完全按照发牌人的方式玩游戏会使赔率对玩家有利。下面是前面提到的程序:-

/*
* PROGRAM SIMULATIING BLACKJACK
* 
* PLAYER KEEPS HITTING UNTIL THE SCORE EXEEDS 16
* 
* RESULTS:
* 
* PLAYER WINS ~ 43.8% OF TIMES
* MATCH IS DRAW ~ 12.4% OF TIMES
* DEALER WINS ~ 43.8% OF TIMES
* 
* PROGRAM DOESN'T TAKE INTO ACCOUNT THE CARDS ALREADY DISTRIBUTED
* I.E. DISTRIBUTES CARDS FROM A FULL DECK OF CARDS TO BOTH THE 
* PLAYER AND THE DEALER.
* 
* */
import 'dart:math';
class Player {
int score;
bool hardHand, busted;
Player() {
this.score = 0;
this.hardHand = false;
this.busted = false;
}
void hit() {
int randomNumber = Random().nextInt(13) + 1;
if (randomNumber > 10) {
this.score += 10;
} else if (randomNumber == 1) {
this.score += 11;
this.hardHand = true;
} else {
this.score += randomNumber;
}
if (this.score > 21) {
if (this.hardHand) {
this.hardHand = false;
this.score -= 10;
}
}
if (this.score > 21) this.busted = true;
}
}
void main() {
int turns = 100000;
int wins = 0, loses = 0, draws = 0;
for (int i = 0; i < turns; i++) {
Player player1 = new Player();
Player dealer = new Player();
while (player1.score < 17) {
player1.hit();
}
while (dealer.score < 17) {
dealer.hit();
}
//print("score: ${player1.score} busted: ${player1.busted}");
if (player1.score > dealer.score) {
wins++;
} else if (player1.score == dealer.score) {
draws++;
} else {
loses++;
}
}
double winPercent = (wins / (wins + loses + draws)) * 100;
double drawPercent = (draws / (wins + loses + draws)) * 100;
double lossPercent = 100 - winPercent - drawPercent;
print("WIN Percentage: $winPercent");
print("DRAW Percentage: $drawPercent");
print("LOSS Percentage: $lossPercent");
}

当我在提供的链接中阅读它们时,您的代码似乎偏离了21点规则。

  1. 如果你失败了,你就输了。在那之后庄家不需要做任何事,即使他们也破产了,你也输了。因此,您需要从if (player1.busted) { loses++; } else ...开始的规则。

  2. 如果你没有破产,但庄家破产了,你就赢了。所以是if (dealer.busted) { wins++; } else ...

  3. 你计算平局,但有相同的分数意味着庄家赢了,所以if (dealer.score >= player1.score) { loses++; } else { wins++; }

  4. 最后,您计数"硬牌",但忽略了有两个a的可能性,因此我可能会计数a,而不是只有一个布尔值。这实际上不太可能有多大关系。

解决这个问题,我得到这样的:

import 'dart:math';
class Player {
int score = 0;
int acesHigh = 0;
void hit() {
int randomNumber = Random().nextInt(13) + 1;
if (randomNumber > 10) {
score += 10;
} else if (randomNumber == 1) {
score += 11;
acesHigh++;
} else {
score += randomNumber;
}
if (score > 21) {
if (acesHigh > 0) {
acesHigh--;
score -= 10;
}
}
}

bool get busted => score > 21;
}
void main() {
int turns = 100000;
int wins = 0, losses = 0;
for (int i = 0; i < turns; i++) {
Player player1 = new Player();
while (player1.score < 17) {
player1.hit();
}
if (player1.busted) {
losses++;
continue;
}
Player dealer = new Player();
while (dealer.score < 17) {
dealer.hit();
}
if (dealer.busted) {
wins++;
continue;
}

// print("score: ${player1.score} busted: ${player1.busted}");
if (player1.score > dealer.score) {
wins++;
} else {
losses++;
}
}
assert(wins + losses == turns);
double winPercent = (wins / turns) * 100;
double lossPercent = 100 - winPercent;
print("WIN Percentage: $winPercent");
print("LOSS Percentage: $lossPercent");
}

这通常会给我带来40.8%的胜利和59.2%的失败。

庄家总是赢。

最新更新