Java 从卡组底部更换卡
我是java的初学者,创建了一个2类的程序“VideoPoker”,它基本上模仿了一个人5张牌的游戏。在这个游戏中,一副牌被洗牌,最上面的5张牌(现在洗牌的牌)被用来进行5次平局。用户可以在发牌时移除他/她收到的5张牌中的部分、全部或任何一张。如果用户移除一张卡,它将被移除并替换为下一张顶级卡。我被卡在用户决定移除卡的位置。在我的程序中,当有人移除所有卡片时,有时甚至只移除部分卡片时,卡片2(索引1)和卡片4(索引3)始终保留在下一手(5张)打印中。我的尝试在下面的代码图中: Deck.java:Java 从卡组底部更换卡,java,arrays,for-loop,arraylist,collections,Java,Arrays,For Loop,Arraylist,Collections,我是java的初学者,创建了一个2类的程序“VideoPoker”,它基本上模仿了一个人5张牌的游戏。在这个游戏中,一副牌被洗牌,最上面的5张牌(现在洗牌的牌)被用来进行5次平局。用户可以在发牌时移除他/她收到的5张牌中的部分、全部或任何一张。如果用户移除一张卡,它将被移除并替换为下一张顶级卡。我被卡在用户决定移除卡的位置。在我的程序中,当有人移除所有卡片时,有时甚至只移除部分卡片时,卡片2(索引1)和卡片4(索引3)始终保留在下一手(5张)打印中。我的尝试在下面的代码图中: Deck.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;
public class Deck {
// Constructing a deck from two arrays
String[] suit = { "C", "D", "H", "S" };
String[] rank = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
ArrayList<String> deck = new ArrayList<String>(suit.length * rank.length);
int currentCard = 0;
// Storing public variables
int suits = suit.length;
int ranks = rank.length;
int deckSize = deck.size();
// Constructs a deck with 52 cards
public Deck(){
for(int i = 0; i < suits; i ++){
for(int j = 0; j < ranks; j++){
String temp = rank[j] + suit[i];
deck.add(temp);
}
}
}
public String toString(){
return Arrays.deepToString(deck.toArray());
}
// Fisher-Yates Shuffle
public ArrayList<String> shuffle(){
Collections.shuffle(deck);
return deck;
}
public String deal(){
return deck.get(currentCard++);
}
public String remove(int i){
return deck.remove(i);
}
public String get(int i){
return deck.get(i);
}
public ArrayList<String> getList(){
return deck;
}
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.Collections;
导入java.util.Random;
公务舱甲板{
//从两个数组构造一个数据组
字符串[]suit={“C”、“D”、“H”、“S”};
字符串[]秩={“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“J”、“Q”、“K”};
ArrayList甲板=新ArrayList(suit.length*rank.length);
int currentCard=0;
//存储公共变量
int suits=suit.length;
int ranks=rank.length;
int deckSize=deck.size();
//用52张牌构建一个牌组
公共甲板(){
for(int i=0;i
Dealer.java(测试程序):
import java.util.ArrayList;
导入java.util.array;
导入java.util.Scanner;
公共类交易商{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
甲板测试甲板=新甲板();
系统输出打印LN(测试平台);
testDeck.shuffle();
系统输出打印LN(测试平台);
对于(int i=0;i<5;i++){
System.out.print(testDeck.deal()+);
}
字符串选择;
对于(int i=0;i<5;i++){
System.out.print(“\n是否要删除卡”+(i+1)+“?”);
choice=in.next();
if(选择等于(“Y”)){
测试台。移除(i);
}
}
对于(int i=0;i<5;i++){
System.out.print(testDeck.get(i)+“”);
}
}
}
输出:
您的问题在于:
for (int i = 0; i < 5; i++){
System.out.print("\nWould you like to remove card " + (i + 1) + "? ");
choice = in.next();
if (choice.equals("Y")){
testDeck.remove(i); // <-- removing the 'i'th element is the problem
}
}
for(int i=0;i<5;i++){
System.out.print(“\n是否要删除卡”+(i+1)+“?”);
choice=in.next();
if(选择等于(“Y”)){
testDeck.remove(i);//问题归根结底在于实现卡片组逻辑的方式。与其使用ArrayList存储卡片,然后通过它进行索引,不如使用ArrayQue(发音为“ArrayDeck”)来处理存储和移除逻辑
你应该独立于牌组跟踪玩家手部的内容;主要问题是牌组和玩家手部的耦合方式。通过使你的程序更通用,你可以消除很多复杂性
在使程序更通用的同一个过程中,你也应该使用一个单独的类来处理卡。虽然不需要想象:只有两个公共最终字段、一个构造函数和一个ToStand方法。
作为一个美学注释,你可以考虑用<代码> t>代码>替换<代码> 10代码>代码,这样所有的行列都是一个字符。杰曼斯菲尔德:谢谢你,可以。试着把第一张牌移走几次,或者在每张牌移走后展示手牌。这会让你对发生的事情有一个大致的了解。我同意你的第一个解释,但要解决:
如果他把所有的牌都移走了怎么办?看看打印屏幕。他已经移走了所有的牌,但仍然得到了相同的牌。你准备好了ht,我要解决的问题不正确-正在编辑他正在从他的牌组中移除一张不在玩家牌上的牌。希望这将有助于改进您的回答:)他应该将牌组和玩家手牌分开。尝试使用地图。映射玩家及其当前手牌的列表。map然后使用/创建另一个玩家手牌或另一个av的ArrayList可供查阅的收藏。
for (int i = 0; i < 5; i++){
System.out.print("\nWould you like to remove card " + (i + 1) + "? ");
choice = in.next();
if (choice.equals("Y")){
testDeck.remove(i); // <-- removing the 'i'th element is the problem
}
}
// a list used to store the index of cards to be removed
ArrayList<Integer> indexesToRemove = new ArrayList();
for (int i = 0; i < 5; i++) {
System.out.print("\nWould you like to remove card " + (i + 1) + "? ");
choice = in.next();
if (choice.equals("Y")) {
indexesToRemove.add(i); // record index of card to be removed
}
}
// here we remove the cards all at once
for(int i = 0; i < indexesToRemove.size(); i++) {
// each iteration is a guaranteed removal so
// we subtract by i to counteract for each subsequent removal
testDeck.remove(indexesToRemove.get(i) - i);
}