2014-10-27 11 views
0

Я занимаюсь обучением Java, и я пытаюсь создать приложение для перетасовки карт, используя разные вещи, которые я изучил до сих пор. Я знаю, что в одном классе есть более простой способ сделать это, но цель этого - реализовать столько вещей, которые я изучил до сих пор в одной программе. Проблема здесь, когда я совмещаю каждый костюм в объединенный массив, индексы объединенного массива читают «null». Я знаю, что проблема находится в классе Randomize.Java Card Shuffling App

createCards Класс:

public class createCards { 

decoyObject d = new decoyObject(); 

public void storeHearts(){ 
String[] heartRay = new String[13]; 
heartRay[0] = "AceH"; 
int L = heartRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String heartPlace = h.toString()+"H"; 
    heartRay[i+1] = heartPlace; 
} 
heartRay[10] = "JackH"; 
heartRay[11] = "QueenH"; 
heartRay[12] = "KingH"; 

d.setHearts(heartRay); 

} 


public void storeClubs(){ 
String[] clubRay = new String[13]; 
clubRay[0] = "AceC"; 
int L = clubRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String clubPlace = h.toString() + "C"; 
    clubRay[i+1] = clubPlace; 
} 
clubRay[10] = "JackC"; 
clubRay[11] = "QueenC"; 
clubRay[12] = "KingC"; 

d.setClubs(clubRay); 
} 

public void storeSpades(){ 
String[] spadeRay = new String[13]; 
spadeRay[0] = "AceS"; 
int L = spadeRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String spadePlace = h.toString() + "S"; 
    spadeRay[i+1] = spadePlace; 
} 
spadeRay[10] = "JackS"; 
spadeRay[11] = "QueenS"; 
spadeRay[12] = "KingS"; 

d.setSpades(spadeRay); 

} 

public void storeDiamonds(){ 
String[] diamondRay = new String[13]; 
diamondRay[0] = "AceD"; 
int L = diamondRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String diamondPlace = h.toString() + "D"; 
    diamondRay[i+1] = diamondPlace; 
} 
diamondRay[10] = "JackD"; 
diamondRay[11] = "QueenD"; 
diamondRay[12] = "KingD"; 

d.setDiamonds(diamondRay); 

} 

} 

decoyObject Класс

public class decoyObject { 

private String[] clubs; 
private String[] hearts; 
private String[] spades; 
private String[] diamonds; 
private String[] cards; 

public decoyObject(){ 
    this.clubs = new String[13]; 
    this.hearts = new String[13]; 
    this.spades = new String[13]; 
    this.diamonds = new String[13]; 
    this.cards = new String[52]; 
} 


public void setClubs(String[] clubs){ 
    this.clubs = clubs; 
} 


public String[] getClubs(){ 
    return clubs; 
} 


public void setHearts(String[] hearts){ 
    this.hearts = hearts; 
} 

public String[] getHearts(){ 
    return hearts; 
} 

public void setSpades(String[] spades){ 
    this.spades = spades; 
} 

public String[] getSpades(){ 
    return spades; 
} 

public void setDiamonds(String[] diamonds){ 
    this.diamonds = diamonds; 
} 

public String[] getDiamonds(){ 
    return diamonds; 
} 

public void setCards(String[] cards){ 
    this.cards = cards; 
} 

public String[] getCards(){ 
    return cards; 
} 

} 

Randomize Класс

Я считаю, что это класс, где проблема происходит

public class Randomize{ 

createCards c = new createCards(); 
decoyObject d = new decoyObject(); 



public void randomizeCards(){ 

    c.storeHearts(); 
    c.storeClubs(); 
    c.storeDiamonds(); 
    c.storeSpades(); 

    //I believe the issue happens in the code below 
    String[] randomHearts = d.getHearts(); 
    String[] randomClubs = d.getClubs(); 
    String[] randomDiamonds = d.getDiamonds(); 
    String[] randomSpades = d.getSpades(); 
    /***************************************/ 




    String[] combinedCards = new String[52]; 

    for (int i = 0; i <13; i++){ 
     combinedCards[i] = randomHearts[i]; 
    } 

    for (int i = 0; i <13; i++){ 
     combinedCards[i+13] = randomClubs[i]; 
    } 

    for (int i = 0; i <13; i++){ 
     combinedCards[i+26] = randomDiamonds[i]; 
    } 

    for (int i = 0; i <13; i++){ 
     combinedCards[i+39] = randomSpades[i]; 
    } 

//THE CODE BELOW PRINTS OUT NULL 52 TIMES 
for (String cards : combinedCards){ 
    System.out.println(cards); 
} 
/**********************************/ 

} 

} 

Funthings Класс

Это класс с основным методом.

public class Funthings { 


public static void main(String[] args) { 

    Randomize r = new Randomize(); 
    r.randomizeCards(); 


} 
} 
+0

Ваш объект приманкой никогда не инициализирует карты в костюмах, все они нуль. –

+0

Я думал, что инициализирую их в конструкторе класса decoyObject !? –

+0

Вы инициализируете их массивом с нулевыми строками. – CandiedOrange

ответ

1

Возврат одного и того же объекта decoy из createCards в Randomize должен решить проблему.

Изменения: Добавлен новый метод, называемый storeCards() в createCards класс, который будет возвращать decoyObject для вызова метода в randomizeCards().

createCards.java

public class createCards { 

decoyObject d = new decoyObject(); 

public decoyObject storeCards(){ 
    storeHearts(); 
    storeClubs(); 
    storeSpades(); 
    storeDiamonds(); 
    return d; 
} 

public void storeHearts(){ 
String[] heartRay = new String[13]; 
heartRay[0] = "AceH"; 
int L = heartRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String heartPlace = h.toString()+"H"; 
    heartRay[i+1] = heartPlace; 
} 
heartRay[10] = "JackH"; 
heartRay[11] = "QueenH"; 
heartRay[12] = "KingH"; 

d.setHearts(heartRay); 

} 


public void storeClubs(){ 
String[] clubRay = new String[13]; 
clubRay[0] = "AceC"; 
int L = clubRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String clubPlace = h.toString() + "C"; 
    clubRay[i+1] = clubPlace; 
} 
clubRay[10] = "JackC"; 
clubRay[11] = "QueenC"; 
clubRay[12] = "KingC"; 

d.setClubs(clubRay); 
} 

public void storeSpades(){ 
String[] spadeRay = new String[13]; 
spadeRay[0] = "AceS"; 
int L = spadeRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String spadePlace = h.toString() + "S"; 
    spadeRay[i+1] = spadePlace; 
} 
spadeRay[10] = "JackS"; 
spadeRay[11] = "QueenS"; 
spadeRay[12] = "KingS"; 

d.setSpades(spadeRay); 

} 

public void storeDiamonds(){ 
String[] diamondRay = new String[13]; 
diamondRay[0] = "AceD"; 
int L = diamondRay.length - 4; 
for(int i = 0; i <= L; i++){ 
    Integer h = i + 2; 
    String diamondPlace = h.toString() + "D"; 
    diamondRay[i+1] = diamondPlace; 
} 
diamondRay[10] = "JackD"; 
diamondRay[11] = "QueenD"; 
diamondRay[12] = "KingD"; 

d.setDiamonds(diamondRay); 

} 

} 

Randomize.java

public class Randomize{ 

createCards c = new createCards(); 

public void randomizeCards(){ 
    decoyObject d = null; 
    d = c.storeCards(); 

    //I believe the issue happens in the code below 
    String[] randomHearts = d.getHearts(); 
    String[] randomClubs = d.getClubs(); 
    String[] randomDiamonds = d.getDiamonds(); 
    String[] randomSpades = d.getSpades(); 
    /***************************************/ 




    String[] combinedCards = new String[52]; 

    for (int i = 0; i <13; i++){ 
     combinedCards[i] = randomHearts[i]; 
    } 

    for (int i = 0; i <13; i++){ 
     combinedCards[i+13] = randomClubs[i]; 
    } 

    for (int i = 0; i <13; i++){ 
     combinedCards[i+26] = randomDiamonds[i]; 
    } 

    for (int i = 0; i <13; i++){ 
     combinedCards[i+39] = randomSpades[i]; 
    } 

//THE CODE BELOW PRINTS OUT NULL 52 TIMES 
for (String cards : combinedCards){ 
    System.out.println(cards); 
} 
/**********************************/ 

} 

} 
+0

работал отлично. благодаря! –

+0

@ user3386635 Добро пожаловать! –

0

При вызове d.getHearts() в Randomize, d оказывает объект класса decoyObject, и вы будете иметь дело с getHearts() этого объекта, но вы присваиваете значения массивов в класс createCards для абсолютно нового объекта класса decoyObject.

Вы не используете один и тот же объект, и вы используете два разных объекта для присвоения значения в анализах и считывания значений из массивов. Вот почему вы получаете нулевые значения.

Удачи !!!

+0

. Думаю, я понял, что вы говорите. Поэтому, когда я использую c.storeHearts и даже если c.storeHearts использует метод «set» объекта decoyObject. decoyObject в классе Randomize будет null, потому что каждое создание создает уникальный класс. Это правильно? –

+0

Вы используете тот же класс, но вы создаете два разных объекта. Когда вы используете новое ключевое слово, создается новый объект внутри кучи памяти. Я думаю, что лучше помещать объект decoyObject в Randomize и передавать его как параметр конструктора createCards. то вы должны инициализировать значения массивов объекта decoyObject. Верните этот объект и сохраните его в ссылочной переменной, которая объявлена ​​в Randomize. Затем вы можете использовать этот объект для добавления значений в массив объединенных массивов в объекте Randomize. Попробуйте и дайте мне знать .... –