- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试制作二十一点游戏!我在玩家互动方面很成功!然而,我决定更上一层楼,做一些人工智能,这样我就可以和人工智能对战,可以说,有更多的战斗。
但我的主要问题是,我已经坐在这里大约一个小时了,一直在思考 AI 的工作原理以及我可以如何使用它,但我一直想不出任何可行的方法。所以我想知道是否有人有任何想法,或者能够指导我的方向。
我没有任何启动 AI 的代码,因为我想不出如何启动或使用它。这就是为什么我希望找到某种方向。
现在我将发布我认为所有相关的类(class)。我确实遗漏了 Game 类。游戏类仅用于验证和检查卡片以及所有令人惊奇的东西。
类(class)卡片:
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;
}
}
Class BlackJack(包含所有内容的游戏)是的,我确实使用 Java GUI 来处理它。
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;
}
}
最佳答案
首先:从极客的角度来看,二十一点确实很有趣。
正如有人评论的那样:银行对其所有操作都使用固定算法。这些行动(通常?还是总是?找出你自己。)仅取决于银行的手。首先实现。
对于玩家,您应该明确执行 21 点玩家所说的“基本策略”。我猜谷歌搜索会给你很多点击率。
现在这是我要研究的内容:
实现银行固定策略和玩家“基本策略”后,您可以开始进行蒙特卡洛模拟以找到游戏的期望。尝试尽快获取 MC 模拟代码,因为您可能想要进行大量 MC 模拟。
现在试着稍微修改一下牌组。例如,尝试从牌组中移除所有 5。然后进行相同的 MC 模拟,看看这是否会改变预期。你想用没有 5s 的套牌玩 BJ 吗?
现在,再次修改牌组。尝试移除牌组中所有 10 的一半(即 所有 值为 10 的卡片的一半)。这如何改变玩家的期望?
现在再次修改牌组。尝试移除一半非 10 值卡片。这对预期有何影响?
继续稍微修改一副牌,并尝试了解剩余牌分布中的微小偏差如何影响预期。您应该使用这种理解来调整游戏的赌注。因此,该策略不是命中/停牌 Action ,而是基于鞋中剩余牌组的分配偏差的资金管理。根据“基本策略”继续打击/站立决定!
现在进一步的步骤:
也许你可以训练一个神经网络(或其他一些估计算法)来根据一副牌中已知的剩余牌来估计对游戏的期望? (你必须跟踪牌盒中剩余的牌。)也许你甚至可以将 MC 模拟工具连接到训练算法,从而为你提供一种强化学习算法。这实际上开始听起来像是真正的极客乐趣!或者,也许您可以让 MC 模拟器变得如此之快,以便在运行中得到一个很好的期望答案。
更进一步:
当您找到估计游戏期望的好方法时,考虑到牌盒中剩余的牌(和“基本”策略),速度足够快,您也许能够为资金管理实现强化学习算法.
... 或者您可以坚持简单的计划:积极的期望 => 高风险。负面期望 => 低风险。
祝你学习顺利,
-Øystein
关于java - 为二十一点创建人工智能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12940994/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!