【问题标题】:Simulating the game of BlackJack in Dart [closed]在 Dart 中模拟二十一点游戏[关闭]
【发布时间】:2021-10-10 12:46:14
【问题描述】:

我尝试在DartPad 中编写一个程序来模拟一系列二十一点游戏,其中玩家遵循与庄家完全相同的策略,即击球直到分数超过16。现在根据文章herehere房子应该比玩家至少有 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");
}

【问题讨论】:

    标签: dart probability blackjack


    【解决方案1】:

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

    1. 如果你破产了,你就输了。庄家在那之后不需要做任何事情,即使他们也破产了,你也输了。所以,你需要规则以if (player1.busted) { loses++; } else ...开头。

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

    3. 你算平局,但得分相同意味着庄家获胜,所以if (dealer.score &gt;= 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% 的失败。

    房子总是赢。

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 2012-07-13
      • 2023-03-21
      • 2020-05-18
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2014-10-22
      • 2022-11-12
      相关资源
      最近更新 更多