3

ブラックジャックゲームを作ろうとしています!私はプレイヤーの相互作用に成功しています!しかし、私はそれをステップアップしてAIを実行することにしました。これにより、AIと対戦し、いわばもっと戦闘を行うことができます。

しかし、私の主な問題は、AIがどのように機能し、どのように使用できるかを考えて約1時間ここに座っていたのですが、機能するものは何も考えられませんでした。それで、誰かが何かアイデアを持っているのか、それとも私をある方向に導くことができたのかと思っていました。

AIを開始する方法や、AIを操作する方法がわからないため、AIを開始するためのコードはありません。そういうわけで、私はある種の方向性を望んでいます。

次に、すべて関連があると思うクラスを投稿します。私はゲームクラスを除外しました。ゲームクラスは、カードやその他すべての素晴らしいものを検証およびチェックするためのものです。

クラスカード:

public class Card{
private int rank, suit;

private String[] suitNames = new String[]{ "H", "C", "S", "D" };
private String[] rankNumber = new String[]{ "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
private int[] points = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10};

Card(int suitIndex, int rankIndex){
    rank = rankIndex;
    suit = suitIndex;
}

public @Override String toString(){
    return rankNumber[rank]+suitNames[suit]; 
}

public int getRank(){
    return rank;
}

public int getSuit(){
    return suit;
}

public String getSuitName(){
    return suitNames[suit];
}

public String getRankName(){
    return rankNumber[rank];
}

public int getPoints(){
     return points[rank];
}

public ImageIcon ImageOfCard() throws Exception{
    ImageIcon icon = new ImageIcon("/StandardDeck/GameCards/"+getRankName() + getSuitName()+".png");
    return icon;
}
}

クラスBlackJack(すべてのものを備えたゲーム)はい私はそれに取り組むためだけにJavaGUIを使用しました。

public class BlackJack extends JFrame {
Game game;
Deck deck;
Card cards;
Player player;
Dealer dealer;
JLabel[] playerCardSlots;
JLabel[] dealerCardSlots;

public BlackJack() {
    String name = JOptionPane.showInputDialog(null, "Enter your name");
    deck = new Deck(4);
    game = new Game();
    player = new Player(name);
    dealer = new Dealer(deck);

    initComponents();
    SetButtons(false);
    playerCardSlots = new JLabel[]{Player1Card1, Player1Card2, Player1Card3, Player1Card4, Player1Card5};
    dealerCardSlots = new JLabel[]{DealerCard1, DealerCard2, DealerCard3, DealerCard4, DealerCard5};
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    Player1Card1 = new javax.swing.JLabel();
    Player1Card2 = new javax.swing.JLabel();
    Player1Card3 = new javax.swing.JLabel();
    Player1Card4 = new javax.swing.JLabel();
    Player1Card5 = new javax.swing.JLabel();
    Player1Name = new javax.swing.JLabel();
    HitButton = new javax.swing.JButton();
    StandButton = new javax.swing.JButton();
    PointsLabel = new javax.swing.JLabel();
    DealButton = new javax.swing.JButton();
    DealerCard1 = new javax.swing.JLabel();
    DealerCard2 = new javax.swing.JLabel();
    DealerCard3 = new javax.swing.JLabel();
    DealerCard4 = new javax.swing.JLabel();
    DealerCard5 = new javax.swing.JLabel();
    DealerPointsLabel = new javax.swing.JLabel();
    DealerLabel = new javax.swing.JLabel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    Player1Name.setText("Player 1 Name");

    HitButton.setText("Hit");
    HitButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            HitButtonActionPerformed(evt);
        }
    });

    StandButton.setText("Stand");
    StandButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            StandButtonActionPerformed(evt);
        }
    });

    PointsLabel.setText("points");

    DealButton.setText("Deal");
    DealButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            DealButtonActionPerformed(evt);
        }
    });

    DealerPointsLabel.setText("points");

    DealerLabel.setText("Dealer");

    org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .add(54, 54, 54)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(layout.createSequentialGroup()
                            .add(76, 76, 76)
                            .add(Player1Name)
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 104, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                .add(DealerPointsLabel)
                                .add(PointsLabel))
                            .add(128, 128, 128)))
                    .add(DealButton))
                .add(layout.createSequentialGroup()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                        .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
                            .add(Player1Card1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                            .add(Player1Card2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                            .add(Player1Card3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                            .add(Player1Card4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(12, 12, 12)
                            .add(Player1Card5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
                            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                .add(DealerLabel)
                                .add(layout.createSequentialGroup()
                                    .add(DealerCard1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                    .add(DealerCard2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(12, 12, 12)
                                    .add(DealerCard3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                            .add(DealerCard4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .add(DealerCard5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                        .add(HitButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(StandButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 75, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .add(13, 13, 13)
            .add(DealerLabel)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                .add(HitButton)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(DealerCard1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(DealerCard2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(DealerCard3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(DealerCard4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(DealerCard5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(StandButton)
                .add(DealerPointsLabel))
            .add(4, 4, 4)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(PointsLabel)
                .add(DealButton))
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(Player1Card1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(Player1Card2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(Player1Card3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(Player1Card4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(Player1Card5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(Player1Name)
            .addContainerGap(29, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

private void HitButtonActionPerformed(java.awt.event.ActionEvent evt) {                                          
    PlayerHit();
}                                         

private void StandButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    PlayerStand();
}                                           

private void DealButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
    ResetGame();
}                                          

public void SetName(){
    Player1Name.setText(player.getName());
}

public void DealCards(){
    player.AddCard(deck.DrawCard());
    dealer.AddCard(deck.DrawCard());
    player.AddCard(deck.DrawCard());
    dealer.AddCard(deck.DrawCard());
    ShowCards(player, player.CountCards());
    ShowCards(dealer, 1);

    SetButtons(true);
}

public void DealerHit(){
    dealer.AddCard(deck.DrawCard());
}

public void DealerStand(){
    dealer.PlayerStand();
}

public void PlayerHit(){
    player.AddCard(deck.DrawCard());
    ShowCards(player, player.CountCards());
}
public void PlayerStand(){
    player.PlayerStand();
    SetButtons(false);
    dealer.PlayerTurn();
}

public void ShowCards(Player person, int cards){
    if(!person.getName().equals("Dealer")){
        for(int i = 0; i < cards; i++){
            playerCardSlots[i].setText(person.getCard(i).toString());
        }

        int points = game.CardTotal(person);
        if(game.PlayerBust(points)){
            PointsLabel.setText("BUST!");
            SetButtons(false);
        }
        else{
            PointsLabel.setText(points+"");
        }

        if(game.CardDraw(person)){
            PointsLabel.setText("5 Card Draw!");
            SetButtons(false);
        }
    }
    else{
        for(int i = 0; i < cards; i++){
            dealerCardSlots[i].setText(person.getCard(i).toString());
        }

        int points = game.CardTotal(person, cards);

        if(game.PlayerBust(points)){
            DealerPointsLabel.setText("BUST!");
            SetButtons(false);
        }
        else{
            DealerPointsLabel.setText(points+"");
        }

        if(game.CardDraw(person)){
            DealerPointsLabel.setText("5 Card Draw!");
            SetButtons(false);
        }

        if(points >= 17){

        }
    }
}

public void SetButtons(boolean enabled){
        HitButton.setEnabled(enabled);
        StandButton.setEnabled(enabled);
}

public void ResetGame(){
    for(JLabel label : playerCardSlots){
        label.setText("");
    }
    for(JLabel label : dealerCardSlots){
        label.setText("");
    }

    player.ClearCards();
    dealer.ClearCards();

    deck = new Deck(4);
    DealCards();
    SetName();

    player.PlayerTurn();
    dealer.PlayerStand();
}

// <editor-fold defaultstate="collapsed" desc="Variables">
// Variables declaration - do not modify                     
private javax.swing.JButton DealButton;
private javax.swing.JLabel DealerCard1;
private javax.swing.JLabel DealerCard2;
private javax.swing.JLabel DealerCard3;
private javax.swing.JLabel DealerCard4;
private javax.swing.JLabel DealerCard5;
private javax.swing.JLabel DealerLabel;
private javax.swing.JLabel DealerPointsLabel;
private javax.swing.JButton HitButton;
private javax.swing.JLabel Player1Card1;
private javax.swing.JLabel Player1Card2;
private javax.swing.JLabel Player1Card3;
private javax.swing.JLabel Player1Card4;
private javax.swing.JLabel Player1Card5;
private javax.swing.JLabel Player1Name;
private javax.swing.JLabel PointsLabel;
private javax.swing.JButton StandButton;
// End of variables declaration                   
//</editor-fold>
}

クラスプレーヤー:

 public class Player{
 private String playerName;
 private ArrayList<Card> playerCards = new ArrayList<Card>();
 private boolean turn = false;

Player(String name){
    playerName = name;
}

public Card getCard(int index){
    return playerCards.get(index);
}

public void AddCard(Card card){
    playerCards.add(card);
}

public void ClearCards(){
    playerCards.clear();
}

public int CountCards(){
    return playerCards.size();
}

public String getName(){
    return playerName;
}

public void PlayerStand(){
    turn = false;
}

public void PlayerTurn(){
    turn = true;
}

public boolean getTurn(){
    return turn;
}

}
4

4 に答える 4

4

まず第一に、ブラックジャックはオタクの観点からは確かに興味深いものです。

誰かがコメントしたように:銀行はすべての行動に固定アルゴリズムを使用しています。これらの行動は(通常?または常に?あなたの自己を見つけてください。)銀行の手にのみ依存します。最初にそれを実装します。

プレーヤーの場合、ブラックジャックプレーヤーが「基本戦略」と呼ぶものを確実に実装する必要があります。私はグーグル検索があなたにたくさんのヒットを与えると思います。

これが私が研究したことです
銀行の固定戦略とプレーヤーの「基本戦略」を実装したら、モンテカルロシミュレーションを開始して、ゲームの期待を見つけることができます。おそらく多くのMCシミュレーションを実行したいので、MCシミュレーションコードをできるだけ速く取得するようにしてください。

次に、デッキを少し変更してみます。たとえば、デッキから5をすべて削除してみてください。次に、同じMCシミュレーションを実行し、これによって期待値が変わるかどうかを確認します。5秒なしのデッキでBJをプレイしませんか?

ここで、デッキを再度変更します。デッキ内のすべての10の半分を削除してみてください(値が10のすべてのカードの半分です)。それはプレイヤーの期待をどのように変えますか?

次に、デッキを再度変更します。10以外の値のカードの半分を削除してみてください。それは期待にどのように影響しますか?

デッキを少し変更し続け、残りのカードの分布のわずかな偏りが期待にどのように影響するかを理解するようにしてください。この理解を利用して、ゲームの賭け金を調整する必要があります。したがって、戦略はヒット/スタンドアクションではなく、靴の残りのデッキの分配バイアスに基づく資金管理です。「基本戦略」に基づいて、打撃/立位の決定を続けてください!

次のステップ:
おそらく、デッキに残っている既知のカードに基づいてゲームの期待値を推定するために、ニューラルネット(または他の推定アルゴリズム)をトレーニングできますか?(靴に残っているカードを追跡する必要があります。)MCシミュレーションツールをトレーニングアルゴリズムに接続して、一種の強化学習アルゴリズムを提供することもできます。これは実際に本当のオタクの楽しみのように聞こえ始めています!または、MCシミュレーターを非常に高速にして、その場で期待の良い答えを得ることができるかもしれません。

さらに別のステップ:
ゲームの期待を推定する良い方法を見つけたら、靴の残りのカード(および「基本的な「戦略」)が十分に速いことを考えると、強化学習アルゴリズムを実装できる可能性がありますお金の管理のために。

...または、単純な計画に固執することができます:前向きな期待=>ハイステークス。否定的な期待=>低い賭け金。

あなたの研究で頑張ってください、
-Øystein

于 2012-10-18T11:25:16.900 に答える
0

ブラックジャックにはいくつかのシステムがあります(勝つために約49%を取得します)。例: http: //www.docstoc.com/docs/79054261/Basic-Strategy-Chart---Easy-Money-Blackjack-System

したがって、{カード}、次に{アクション}アルゴリズムの場合、これは簡単です。

于 2012-10-17T18:47:48.123 に答える
0

AI プレーヤーが行うことができるすべての可能な動きをスコアリングするヒューリスティック関数を作成する必要があります。このヒューリスティック関数は、プレーヤーがアクセスできるすべての利用可能なデータを取り込み、スコアが高いほど、動きが良くなります。必要な特定のカードを獲得する確率と、ディーラーがバストする確率などを考慮に入れる必要があります。その後、AI は単純に最良の動き、つまりヒューリスティック スコアが最大の動きを選択する必要があります。

于 2012-10-17T18:40:55.597 に答える
0

一般に、主要な (そしておそらく唯一の) 戦略として検索に集中する場合を除き、ブラックジャック プレーヤーを作成するために命令型言語に (主に) 依存するべきではありません。代わりに、Clips (プロダクション ルール) または Drools を参照して、プロトタイプをすばやく作成してください。そこには最初の学習曲線があります。基本的に、プロダクション ルール、ロジック プログラミング、ニューラル ネットワーク、および遺伝的アルゴリズムは、実行または学習フェーズに検索を組み込む汎用アプローチです。では、なぜ検索だけでなくこれらを使用するのでしょうか。やはり検索アルゴリズムは非常に強力です。プロダクション ルール、ロジック プログラミング、ニューラル ネットワーク、および遺伝的アルゴリズムは、単に検索アルゴリズムを適用するよりも強力であり、問​​題の表現に集中できるからです。

考慮すべきもう 1 つのことは、ブラックジャックでは確率も取り入れたいということです (そしておそらくカードカウンティング!)。

于 2012-10-19T10:47:22.593 に答える