我正在寻找一个能够为特定洗牌分配值的函数.
该功能必须是双射的.甲板上有52张牌,所以有52张牌!不同的shuffle,因此域是52张卡的所有排列的集合,并且codomain是从1到52的整数!
快速有效地执行此操作的最佳算法是什么?
我是一个Clojure新手.我想获得两份卡套装的副本.我能想到的非DRY方式是
(def suits [:clubs :diamonds :hearts :spades])
(def two-times (concat suits suits))
Run Code Online (Sandbox Code Playgroud)
必须有更多功能的方式(即使它需要更多的字符:-)).如果我想要N次怎么办?有什么建议?
我试过的所有事情,比如
(replicate 2 suits)
Run Code Online (Sandbox Code Playgroud)
导致两个单独的向量:
([:clubs :diamonds :hearts :spades] [:clubs :diamonds :hearts :spades])
Run Code Online (Sandbox Code Playgroud)
如何"压扁"结构?
是否可以向F#区分联合添加常量字段值?
我可以这样做吗?
type Suit
| Clubs("C")
| Diamonds("D")
| Hearts("H")
| Spades("S")
with
override this.ToString() =
// print out the letter associated with the specific item
end
Run Code Online (Sandbox Code Playgroud)
如果我正在编写Java枚举,我会向构造函数添加一个私有值,如下所示:
public enum Suit {
CLUBS("C"),
DIAMONDS("D"),
HEARTS("H"),
SPADES("S");
private final String symbol;
Suit(final String symbol) {
this.symbol = symbol;
}
@Override
public String toString() {
return symbol;
}
}
Run Code Online (Sandbox Code Playgroud) 我想在F#中代表标准扑克牌.我的目标是实现一个微软纸牌(Windows附带的一个)的克隆,一个卡片套装,面部和颜色很重要的游戏.这个练习主要是为了学习一些F#.
我考虑过使用歧视的工会:
type Suit =
| Diamonds
| Hearts
| Clubs
| Spades
type Color =
| Red
| Black
type Face =
Two | Three | Four | Five | Six | Seven |
Eight | Nine | Ten | Jack | Queen | King | Ace
Run Code Online (Sandbox Code Playgroud)
卡的记录类型:
type Card = {
suit: Suit;
face: Face;
color: Color;
}
Run Code Online (Sandbox Code Playgroud)
但是,卡片的颜色可以从它的套装中推断出来 - 所有钻石和红心都是红色的,所有的俱乐部和黑桃都是黑色的.不能仅从Color确定套装.也许这样的事情是合适的:
type Suit =
| Diamonds of Color //should always be red
| Hearts …Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序来评估4张扑克牌的整数值(数字1-13),并显示一个等于24的解决方案.我有一个很大的if语句,我已经为此编写并且意识到它只是太多的解决方案来添加它们.我正在寻找有关如何将其浓缩为更优化版本的建议.代码运行正常,没有错误,这是我的整个代码:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.scene.image.ImageView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicReference;
import java.util.*;
public class Main extends Application {
private Card card1;
private Card card2;
private Card card3;
private Card card4;
private int a;
private int b;
private int c;
private int d;
private int e=0;
private int f=0;
boolean par=false;
@Override
public void start(Stage primaryStage) …Run Code Online (Sandbox Code Playgroud) 这是我的第一个问题.只是为了澄清,我确实在询问之前是否有任何问题可以帮助我.如果我做错了什么事,请提前道歉,我是新人.
无论如何,对于我的AP CS课程,我必须制作卡片并在文本窗口中打印出来.我相信我非常接近完成.正如标题所说,一般来说,我如何创建一组专注于静态数组的卡片?但此外(在我下面询问的错误解决后),在查看我到目前为止生成的代码时,这是正确的方法吗?
这是给定的代码(意思是这不能改变):
public class Card
{
private String suit;
private String rank;
private int value;
public Card(String s, String r, int v)
{
suit = s;
rank = r;
value = v;
}
public String getSuit() { return suit; }
public String getRank() { return rank; }
public int getValue() { return value; }
public void setSuit(String s) { suit = s; }
public void setRank(String r) { rank = r; }
public void setValue(int v) { value …Run Code Online (Sandbox Code Playgroud) 目前我正在努力实现一个名为 Briscas 或 Briscola 的西班牙纸牌游戏,http://en.wikipedia.org/wiki/Briscola
简而言之,这是一个纸牌游戏,两队2人对战(他们看不到对方的手,甚至连队员都看不到),只在开始洗牌,然后将三张牌交给每个玩家. 以顺时针方式,每个人都扔一张牌,试图赢得那个回合。谁赢得了那个转折点。然后,仍然是顺时针方向,最后一轮获胜的玩家从牌堆顶拿一张牌,然后从他/她左边的玩家拿一张牌,依此类推。然后您将继续玩游戏,直到牌组为空。谁拥有更多积分的球队获胜。
细节:
甲板大小:40
玩家:4(2 组 2)
卡具有特定价值。(从 0 到 11)
我知道直接使用 MiniMax 会很贵。这类纸牌游戏通常使用哪些算法?此外,您可以指向的任何文献也将是有益的。
谢谢
问题在于在游戏的每个时刻遵循以下规则选择最佳选项:
您只能选择最左边或最右边的卡。
你的对手总是先选,并且总是从最左边或最右边的牌中选择最大的牌。如果是平局,它将选择最右边的。考虑到这并不总是最好的选择。
有时不可能获胜,但无论如何,您必须展示通过与该对手(或策略,比如说)比赛可以增加的最高金额。
例子:
Cards: 1 2 4 2 8 4 3
Opponent: 3 4 2 2 = 11
Me: 1 8 4 = 13
Run Code Online (Sandbox Code Playgroud)
在这里,我在第二回合选择了 1 而不是 4,因此我可以稍后选择 8。这就是为什么选择最高的牌并不总是最好的。
我一直在尝试使用递归来实现这个解决方案,但我不确定这是最好的选择。关于如何设计这个算法有什么想法吗?
[编辑] 感谢@PengOne 的慷慨帮助。这是我试图实现的代码,但不幸的是它给了我错误。我应该修复什么?随着我的进步,我正在编辑这个。
static int cardGameValue(List<int> D, int myScore, int opponentScore)
{
if (D.Count == 0) return myScore;
else
{
if (D[0] <= D[D.Count - 1])
{
opponentScore += D[D.Count - 1];
D.RemoveAt(D.Count - 1);
}
else
{
opponentScore += D[0];
D.RemoveAt(0);
}
int left = cardGameValue(
new …Run Code Online (Sandbox Code Playgroud) 在设计应用设计模式的以下类时,最好的方法是什么?
(MeldPile掌握了桌面上的所有融合.)
对于我来说,我觉得getTopCard和removeTopCard只是一个包装getCard和removeCard,因为它只是得到一个卡的顶部位置,然后将它传递给getCard或removeCard.
我应该使用作文吗?策略模式?或者只是创建另一个名为CardPile的类并将其用作上述类的基类?真的很感激,如果你能提供一个示例代码.
我有一个运行F#程序,运行Dominion,一款纸牌游戏.我想用遗传算法来确定最佳的游戏策略.但是,我对AI或遗传算法知之甚少.你能指点我一些好的文学入门吗?
比赛的策略包括对特定牌的反应.在每个回合中,机器人都会获得一手牌.它可以根据已经处理的内容选择玩动作卡或购买新卡.目标是尽可能多的胜利点卡结束游戏.
硬编码方法可能类似于:
def play(hand, totalDeck):
if hand contains Smithy then use Smithy
if hand contains enough coins for Province then buy Province
if more than 30% of the totalDeck is Smithy, then buy coins
Run Code Online (Sandbox Code Playgroud)
我正在考虑用每张卡的总牌组的目标部分向量来描述策略:
[Smithy, Province, Copper, ...]
[.3, .2, .1, ...]
Run Code Online (Sandbox Code Playgroud)
然后为了改变机器人,我可以改变那个向量,看看变异版本是否做得更好.健身功能将是玩Dominion对抗各种其他机器人的平均分数.(一个机器人的分数取决于它与谁对抗,但希望通过对许多机器人玩很多游戏,这甚至可以解决.)
这有意义吗?我走向正确的道路吗?