您好,我目前正在尝试编写扑克游戏来训练我的Java技能。
要确定游戏中最好的一手牌是什么(以便机器人可以做出正确的决定),我会为每只可能的手分配一个整数列表,该整数列表取决于他们手上拥有哪些牌以及场上有哪些牌 例如,某位拥有与发牌同花顺牌6的同花顺的牌手将具有列表[8,6,0]。
其中8代表Straith同花顺,6代表同花顺(最后一个数字仅用于双对或满屋子)。 一对10的玩家将具有列表[1,10,0,0,12,0]。
,其中前三个数字代表该对(最后一个数字代表对,第10个数字代表该对值),后三个数字代表玩家手上的最高牌(最高牌为0,第12张为12)为女王)。
对于Straith刷新而言,不需要Higest卡,因此列表仅包含3个整数。
现在,问题是我对它们进行排序的方法可以正常工作,但有时会给我错误(这是我经常使用的一种方法,所以它可能只在10000中不起作用),并且程序使用了很多随机数,因此该程序永远不会执行两次相同的操作,并且当它不起作用时,同一方法也会出现两种错误(有时是一种错误,有时是另一种错误):
“ java.util.ConcurrentModificationException”和“ java.lang.IndexOutOfBoundsException”,但是我的Java技能不足以告诉我如何处理它。
我尝试使用print对其进行调试,但没有发现不自然的现象。 系统告诉我错误是由这种方法引起的,但我不确定
这是有问题的代码
public List<Score> meilleurScore(List<Score> scores) {
int x = 0;
int y = 0;
Joueur joueurGagnant;
List<Score> scoresGagnants = new ArrayList<>();
List<Score> toutLesScores = new ArrayList<>();
List<Score> scoresPasEncoreFait = new ArrayList<>();
List<Score> scoresEnCourse = new ArrayList<>();
List<Integer> meilleureListe = new ArrayList<>();
List<Score> scoresAEliminer = new ArrayList<>();
scoresPasEncoreFait.addAll(scores);
scoresEnCourse = equilibrerLesScores(scoresEnCourse);
while (toutLesScores.size() < scores.size()) {
// System.out.println(meilleureListe);
meilleureListe.clear();
// System.out.println(toutLesScores.size());
// System.out.println(scoresPasEncoreFait.size());
scoresEnCourse.clear();
// scoresAEliminer.addAll(scoresEnCourse);
scoresEnCourse.addAll(scoresPasEncoreFait);
for (int j = 0; j < scoresEnCourse.get(0).integers.size(); j++) {
meilleureListe.add(0);
meilleureListe.add(0);
meilleureListe.add(0);
}
if (scoresEnCourse.get(0).integers.size() > 0) {
for (int i = 0; i < scoresEnCourse.get(0).integers.size(); i++) {
scoresEnCourse.removeAll(scoresAEliminer);
// System.out.println("3"+ scoresEnCourse);
scoresAEliminer.clear();
for (Score score : scoresEnCourse) {
// System.out.println(score.integers.get(i));
// System.out.println(meilleureListe.get(i));
// System.out.println("meilleur "+meilleureListe);
if (score.integers.get(i) < meilleureListe.get(i)) {
scoresAEliminer.add(score);
}
if ((score.integers.get(i) == meilleureListe.get(i)) && (!scoresGagnants.contains(score))) {
scoresGagnants.add(score);
}
if (score.integers.get(i) > meilleureListe.get(i)) {
for (Score score2 : scoresEnCourse) {
{
if (score == score2) {
break;
}
if ((score.integers.get(i) > score2.integers.get(i))
&& (!scoresAEliminer.contains(score2))) {
scoresAEliminer.add(score2);
}
}
}
scoresGagnants.clear();
scoresGagnants.add(score);
meilleureListe = score.integers;
}
if (scoresEnCourse.size() == 1) {
/* System.out.println("size==1 "+scoresEnCourse); */
toutLesScores.addAll(scoresEnCourse);
scoresPasEncoreFait.removeAll(scoresEnCourse);
scoresAEliminer.addAll(scoresEnCourse);
}
}
}
/* System.out.println("else "+scoresGagnants); */
toutLesScores.addAll(scoresGagnants);
scoresPasEncoreFait.removeAll(scoresGagnants);
scoresAEliminer.addAll(scoresEnCourse);
}
}
return toutLesScores;
}
此方法使用“ equilibrerLesScores”,即:
public List<Score> equilibrerLesScores(List<Score> scores){
int x=0;
for (Score score : scores){
if (score.integers.size()>x){
x=score.integers.size();
}
}
for (Score score : scores){
while (score.integers.size()<x){
score.integers.add(0);
}
}
return scores;
}
在我的代码中,分数定义为:
public Score(Carte carte1, Carte carte2, List<Integer> integers){
this.carte1=carte1;
this.carte2=carte2;
this.integers=integers;
}
(点菜是卡)
这是2个错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at Table.meilleurScore(Table.java:596)
at Table.trouverLeRangDeCetteMain(Table.java:656)
at Table.chanceDeGagnerPlusTard(Table.java:1025)
at Table.caractereDevin(Table.java:806)
at Table.faireLesMises(Table.java:688)
at Main.main(Main.java:60)
和
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Table.meilleurScore(Table.java:582)
at Table.trouverLeRangDeCetteMain(Table.java:656)
at Table.chanceDeGagnerPlusTard(Table.java:997)
at Table.caractereDevin(Table.java:806)
at Table.faireLesMises(Table.java:688)
at Main.main(Main.java:53)
(索引和大小并不总是为0) 596行是:
for (Score score : scoresEnCourse){
,第582行是:
for (int i=0;i<scoresEnCourse.get(0).integers.size();i++){
如果需要,我可以显示代码的其他部分。
感谢您阅读我的问题,对不起我的英语。
答案 0 :(得分:0)
您应该在“手牌”上考虑比较器功能,然后您就拥有手牌(玩家数),并使用“手牌”之间的Comparable接口对“手牌”进行排序。最后或第一个将是赢家,具体取决于您如何使用排序功能的可比性(比较)。如果我了解您计划的目标是确定赢家和输家。
“手”是纸牌的集合...每手有5张纸牌来检查玩家手上的物品。(从成对,成对,满员,序列,同花顺开始)。
一只手必须与另一只手具有可比性。就是这样。
西亚。