- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近开始学习java,并且大部分进展顺利。为了帮助理解我正在学习的内容,我决定编写一个纸牌游戏引擎。我已经使用我认为正确的抽象和封装方法构建了卡片和牌组类。然而,在构建经销商类时,我遇到了一个问题,我不知道如何从经销商类中访问卡类数据。从套牌类中,我可以访问卡牌类所需的所有权限,但是一旦到达发牌者类,我只是不确定如何访问封装在 2 个类深处的数据。
这是我到目前为止所拥有的,虽然解决问题的代码值得赞赏,但如果有人可以为我指出文档或书籍的方向以帮助更好地理解我所经历的事情,将不胜感激。
只是为了清楚起见。我希望能够访问与牌组数组中的各个卡牌相关的数据,例如发牌者类的实例变量值。我知道,如果我从 println 语句引用卡片,它会调用卡片字符串方法。但我正在寻找的是卡片的实际数据。
最后一个类只是我用来测试我编写的方法的。
import java.util.*;
public class Card {
public Card() {
suit = 0;
value = 0;
setName(value);
}
public Card(int cSuit, int cValue) {
suit = cSuit;
value = cValue;
setName(cValue);
}
public String getNewCard() {
suit = rgen.nextInt(4)+1;
value = rgen.nextInt(13)+1;
setName(value);
return name +" of " +getSuitAsString();
}
public int getValue() {
return value;
}
public int getSuit() {
return suit;
}
public String getName() {
setName(value);
return name;
}
public String getName(int val) {
setName(val);
return name;
}
public String getSuitAsString() {
switch(suit) {
case 1: return "Diamonds";
case 2: return "Hearts";
case 3: return "Spades";
case 4: return "Clubs";
default: return null;
}
}
public String getSuitAsString(int cSuit) {
switch (cSuit) {
case 1: return "Diamonds";
case 2: return "Hearts";
case 3: return "Spades";
case 4: return "Clubs";
default:return null;
}
}
public String toString() {
return name +" of "+ getSuitAsString();
}
private void setName(int value) {
switch (value) {
case 0 : name = "null";
break;
case 1 : name = "Ace";
break;
case 2 : name = "Two";
break;
case 3 : name = "Three";
break;
case 4 : name = "Four";
break;
case 5 : name = "Five";
break;
case 6 : name = "Six";
break;
case 7 : name = "Seven";
break;
case 8 : name = "Eight";
break;
case 9 : name = "Nine";
break;
case 10 : name = "Ten";
break;
case 11: name = "Jack";
break;
case 12 : name = "Queen";
break;
case 13 : name = "King";
break;
}
}
private int suit;
private String name;
private int value;
private Random rgen = new Random();
}
import java.util.Random;
public class Deck {
//Constructor assembles an initial deck of 52 cards in order by suit.
//Array element [0] is never used.
public Deck(){
int cards = 1;
int cardsPerSuit = 13;
int suits = 4;
while(cards < DECK_ARRAY_SIZE){
for(int i = 1; i <= suits ; i++){
for(int j = 1; j <= cardsPerSuit; j++){
deck[cards++] = new Card(i , j);
}
}
}
}
// Constructor creates and empty deck of 53 indexes set to null.
// Array element [0] is never used.
public Deck(int deckArraySize){
for(int i = 1; i < deckArraySize ; i++){
deck[i] = new Card();
}
}
public Deck(int suitCount , int cardsPerSuit , int deckArraySize){
// Constructor for special deck configuration.
}
public void shuffle(){
int SHUFFLE_COUNT = 100000;
int arrayPos1 = 0;
int arrayPos2 = 0;
int count = 0;
while(count < SHUFFLE_COUNT){
Card card1 = deck[rgen.nextInt(DECK_ARRAY_SIZE)];
if(card1 == deck[0]) card1 = deck[1];//This prevents the NullPointerException error.broke the always use braces rule.
Card card2 = deck[rgen.nextInt(DECK_ARRAY_SIZE)];
if(card2 == deck[0]) card2 = deck[52];//This prevents the NullPointerException error.broke the always use braces rule.
for(int i = 1; i < DECK_ARRAY_SIZE; i++){
for (int j = 1; j < DECK_ARRAY_SIZE; j++){
if (deck[i].equals(card1)){
arrayPos1 = i;
if (deck[j].equals(card2)){
arrayPos2 = j;
}
}
}
Card temp = deck[arrayPos1];
deck[arrayPos1] = deck[arrayPos2];
deck[arrayPos2] = temp;
count++;
}
}
}
// Gets the top card of the deck.
public Card getTopCard(){
Card topCard = deck[1];
return topCard;
}
// Gets a card at specified index.
public Card getCardAt(int cardAtPos){
Card cardAt = deck[cardAtPos];
return cardAt;
}
//This method makes an implicit call to the Card classes toString method when string manipulation is performed .
//This is done by the compiler automatically.
public void getDeckInfo(){
for(int i = 1; i < DECK_ARRAY_SIZE ; i++){
System.out.print(i +" ");
System.out.println(deck[i]);
}
}
public String toString(){
// getDeckInfo();
return "Nothing to see here, move along.";
}
private Random rgen = new Random();
public static final int DECK_ARRAY_SIZE = 53;
private Card[] deck = new Card[DECK_ARRAY_SIZE];
}
public class Dealer {
public Dealer(){
playDeck = new Deck();
discardStack = new Deck(Deck.DECK_ARRAY_SIZE);
}
public int getDeckCardCount(){
// this count should go down anytime a card is dealt to a player
return deckCardCount;
}
public int getDiscardCount(){
// this count should go up anytime a card is removed from the deck or from play.
return discardCount;
}
public void dealCards(){
// should be self explanatory.
}
public void shuffle(){
// need to make sure that shuffle compensates for cards removed
// from deck and move cards to the front of the array before the shuffle.
// make sure that the empty indexes at the end of the array are not included in the shuffle.
// also need a shuffle method for shuffles at the end of the game. or just
// throw out he deck and get a new deck....
// maybe pass the remaining cards in the deck to the shuffle method .
}
public String toString(){
return "Nothing to see here , move along.";
}
public Deck playDeck;
public Deck discardStack;
private int deckCardCount;
private int discardCount;
}
public class CardTest {
public static void main(String[] args){
Card singleCard = new Card();
Deck deck = new Deck();
Deck playDeck = new Deck();
Deck discardStack = new Deck(53);
Dealer dealer = new Dealer();
System.out.println("value: "+singleCard.getValue());
System.out.println("Name: "+singleCard.getName());
System.out.println("Suit: "+singleCard.getSuitAsString());
System.out.println("Card to string: "+singleCard.toString());
System.out.println("New card: " +singleCard.getNewCard());
System.out.println("New card: " +singleCard.getNewCard());
System.out.println("New card: " +singleCard.getNewCard());
System.out.println("Pass a 4 to the getSuitAsString() method: "+singleCard.getSuitAsString(4));
System.out.println("Pass a 12 to the getName() method: "+singleCard.getName(12));
deck.getDeckInfo();
System.out.println("Top card is: "+deck.getTopCard());
System.out.println("Shuffling...");
int count =0;
while(count < 500){
dealer.playDeck.shuffle();
discardStack.shuffle();
count++;
}
deck.getDeckInfo();
System.out.println("Top card is: "+deck.getTopCard());
System.out.println("Card at position ??: "+deck.getCardAt(5));
playDeck.getDeckInfo();
discardStack.getDeckInfo();
playDeck.shuffle();
playDeck.getDeckInfo();
discardStack.shuffle();
discardStack.getDeckInfo();
dealer.playDeck.getDeckInfo();
dealer.playDeck.shuffle();
System.out.println("Shuffling...");
dealer.playDeck.getDeckInfo();
System.out.println(dealer.playDeck.getCardAt(5));
System.out.println(dealer.discardStack.getCardAt(5));
}
}
最佳答案
这个模型还不错,问题出在 Deck 的第二个和第三个构造函数上。第一个构造函数确保了一个合法的牌组,而另外两个则创建了一个让您在下面的示例代码中摸不着头脑的牌组。
问问自己为什么需要“特殊结构”,如果需要的话..为什么不能从第一个套牌构造函数创建的正确的 52 张牌开始,然后从那里开始工作..即..删除不需要的牌。
最后,OO 哲学规定您的实例在构建后永远不应该处于无效状态。拥有一个构造函数 Card() 根本不够好,因为您需要知道您想要最终得到什么牌。 6 颗红心 Card.new(6, "hearts") 是一个有效的构造函数
关于java从另一个对象中访问一个对象的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14618405/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!