печать счетчика переменной из другого класса - PullRequest
0 голосов
/ 06 августа 2020

Я создал RandomSumGame в Java и мне нужно подсчитать количество выигрышей и проигрышей. Я попытался добавить распечатку счета в методе, но он распечатал его после каждой игры вместо одного результата в конце. Я переместил печать в основной класс, но не могу заставить ее распечатать итоговую сумму из другого класса. Ниже представлена ​​моя программа

package Question4;

import java.util.Random;

public class RandomSumGame {

    boolean start;
    int d1;
    int d2;
    int sum = d1 + d2;
    int valuePoint;
    String status = "+";
        
    public void play (int d1, int d2) {
        sum = d1 + d2;
        int countW = 0;
        int countL = 0;
        for (;;) { //Part I. of question
            if (sum == 2 || sum == 3 || sum == 12) {
                start = false;
                System.out.println(" = " + sum + "\nCRAPS! You lose!");
                countL++;
                break;
            }
            else if (sum == 7 || sum == 11) { //Part II. of question
                start = true;
                System.out.println(" = " + sum + "\nNATURAL! You win!");
                countW++;
                break;
            }
            
            valuePoint = sum;
            
            if (valuePoint == 4 ||valuePoint == 5 || valuePoint == 6 || valuePoint == 8 
                    || valuePoint == 9 || valuePoint == 10) { //Part III. of question
                System.out.println(" = " + valuePoint + "\nA value point of " + valuePoint 
                                        + " has been established. Roll again.");
                break;
            }
        }
        
        for (;;) {
            if (sum == 7) { //exception to valuepoint is 7
                break;
            }
            else {
                Random rand = new Random();
                for (int i = 0; i < 1; i++) {
                    d1 = 1 + rand.nextInt(6);
                    int a1 = d1;
                    System.out.print("You rolled\n" + "\t" + d1);
                    
                    for (int x = 0; x < 1; x++) {
                        d2 = 1 + rand.nextInt(6);
                        int a2 = d2;
                        int sum = a1 + a2;
                        System.out.println(" " + status + " " + d2 + " = " + sum);  
                    }   
                }
                
                sum = d1 + d2;
                
                if (sum == valuePoint) { //if sum equals valuepoint established
                    start = true;
                    System.out.print("\t" + "You win!" + "\n");
                    countW++;
                    break;
                }
                
                else if (sum == 7) {
                    start = false;
                    System.out.print("\t" + "You lose! " + "\n");
                    countL++;
                    break;
                }
            }
        }
    }
    
    public void play () {
        for (int x = 0; x < 3; x++) {
        rolldice();
        play(d1, d2);
        System.out.print("\n");
        }  
    }

    public void rolldice() {
        Random rand = new Random();

        for (int i = 0; i < 1; i++) {
            d1 = 1 + rand.nextInt(6);
            System.out.print("You rolled " + d1 + " " + status);
        }
        for (int i = 0; i < 1; i++) {
            d2 = 1 + rand.nextInt(6);
            System.out.print(" " + d2 + " ");
        }   
    }
    
}//end of class

, а это моя основная

package Question4;

public class TestRandomSumGame {

    public static void main(String[] args) {
    
        
        System.out.println("Craps is a dice game where two dice are rolled."
                + " The dice are added together and; \nIf the sum is 7 or 11, you win!"
                + "\nIf the sum is 2, 3, or 12, you lose!"
                + "\nIf the sum is 4, 5, 6, 8, 9, or 10, a valuepoint is established which is"
                + "\nwhere you contine to roll the dice until you roll the same number"
                + " (you win)"
                + "\nor a 7 (you lose)."
                + "\nThe game will run for 3 plays.\n");
        
            RandomSumGame test = new RandomSumGame();
            
            test.play();
            
            
            System.out.println("Wins: " + countW + "\nLosses: " + countL);
            
    }
    
}//end of class

Я уверен, что мне не хватает чего-то простого, но я просто не могу решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

Прежде всего, вы назвали 2 функции «play». Но после этого вы можете просто определить эту функцию воспроизведения, которую вы используете в основной функции, как функцию возврата с типом массива int. Фиксированный код.

Main

public class TestRandomSumGame {

    public static void main(String[] args) {
    
        
        System.out.println("Craps is a dice game where two dice are rolled."
                + " The dice are added together and; \nIf the sum is 7 or 11, you win!"
                + "\nIf the sum is 2, 3, or 12, you lose!"
                + "\nIf the sum is 4, 5, 6, 8, 9, or 10, a valuepoint is established which is"
                + "\nwhere you contine to roll the dice until you roll the same number"
                + " (you win)"
                + "\nor a 7 (you lose)."
                + "\nThe game will run for 3 plays.\n");
        
            RandomSumGame test = new RandomSumGame();
            
            int[] outcome = test.play();
            
            
            System.out.println("Wins: " + outcome[0] + "\nLosses: " + outcome[1]);
            
    }

Ваш класс

package Question4;

import java.util.Random;

public class RandomSumGame {

    boolean start;
    int d1;
    int d2;
    int sum = d1 + d2;
    int valuePoint;
    String status = "+";
        
    public int[] start_game (int d1, int d2) {
        sum = d1 + d2;
        int countW = 0;
        int countL = 0;
        for (;;) { //Part I. of question
            if (sum == 2 || sum == 3 || sum == 12) {
                start = false;
                System.out.println(" = " + sum + "\nCRAPS! You lose!");
                countL++;
                break;
            }
            else if (sum == 7 || sum == 11) { //Part II. of question
                start = true;
                System.out.println(" = " + sum + "\nNATURAL! You win!");
                countW++;
                break;
            }
            
            valuePoint = sum;
            
            if (valuePoint == 4 ||valuePoint == 5 || valuePoint == 6 || valuePoint == 8 
                    || valuePoint == 9 || valuePoint == 10) { //Part III. of question
                System.out.println(" = " + valuePoint + "\nA value point of " + valuePoint 
                                        + " has been established. Roll again.");
                break;
            }
        }
        
        for (;;) {
            if (sum == 7) { //exception to valuepoint is 7
                break;
            }
            else {
                Random rand = new Random();
                for (int i = 0; i < 1; i++) {
                    d1 = 1 + rand.nextInt(6);
                    int a1 = d1;
                    System.out.print("You rolled\n" + "\t" + d1);
                    
                    for (int x = 0; x < 1; x++) {
                        d2 = 1 + rand.nextInt(6);
                        int a2 = d2;
                        int sum = a1 + a2;
                        System.out.println(" " + status + " " + d2 + " = " + sum);  
                    }   
                }
                
                sum = d1 + d2;
                
                if (sum == valuePoint) { //if sum equals valuepoint established
                    start = true;
                    System.out.print("\t" + "You win!" + "\n");
                    countW++;
                    break;
                }
                
                else if (sum == 7) {
                    start = false;
                    System.out.print("\t" + "You lose! " + "\n");
                    countL++;
                    break;
                }
            }
        }
       int[] outcome = {countW, countL}
       return outcome
    }
    
    public int[] play () {
        for (int x = 0; x < 3; x++) {
        rolldice();
        int[] outcome = start_game(d1, d2);
        System.out.print("\n");
        }
        return outcome
    }

    public void rolldice() {
        Random rand = new Random();

        for (int i = 0; i < 1; i++) {
            d1 = 1 + rand.nextInt(6);
            System.out.print("You rolled " + d1 + " " + status);
        }
        for (int i = 0; i < 1; i++) {
            d2 = 1 + rand.nextInt(6);
            System.out.print(" " + d2 + " ");
        }   
    }
    
}
0 голосов
/ 06 августа 2020

Я бы взял немного времени в этом проекте, чтобы почитать о том, как заниматься объектно-ориентированным программированием. Все, что написано Аланом Каем или Алленом Голубом, - хорошее начало, хотя есть и многие другие, столь же ясные. Пожалуйста, не обращайте внимания на советы о геттерах и сеттерах, имеющих какое-либо отношение к инкапсуляции. Они тоже пропускают внутренние детали. Верно, они немного лучше, чем поля publi c, но вы должны постараться не выдавать состояние полностью. По мере освоения объектно-ориентированного программирования вы обнаружите, что можете избегать геттеров и сеттеров (и не дай бог любые открытые поля) более чем в 90% случаев. В результате ваш код стал лучше, быстрее, более изолированным, более простым в обслуживании и т. Д. c. Для быстрой статьи прочтите это:

https://www.infoworld.com/article/2073723/why-getter-and-setter-methods-are-evil.html

Если у вас нет времени на статью, самое важное, что нужно знать об объектно-ориентированном программировании из эта статья в основном такова:

It's not about objects, it's about conversations, and in those converstations you don't ask an object for its state to do some work, you ask the object with the state to do the work for you.

Алан Кей сказал, что, по его мнению, он ошибся, назвав это объектно-ориентированным программированием. Было бы лучше, если бы это называлось программированием, ориентированным на сообщения. Я согласен.

Попутно Джеймса Гослинга спросили, что он считает своей самой большой ошибкой в ​​Java. Он сказал «классы». Мне потребовалось немного больше времени, чтобы разобраться в деталях этого заявления, но в конце концов я понял, что он был намеренно смешным и совершенно прав.

Джон

0 голосов
/ 06 августа 2020

определите countW и countL как глобальные переменные, поскольку вы используете их как локальные переменные, доступные только внутри метода play (). Поэтому вместо этого

public void play (int d1, int d2) {
    int countW = 0;
    int countL = 0;

используйте что-то вроде этого

int countW = 0;
int countL = 0;
public void play (int d1, int d2) {

и вызывайте эти переменные с помощью объекта

    System.out.println("Wins: " + test.countW + "\nLosses: " + test.countL);

Также я бы посоветовал вам использовать инкапсуляцию (геттеры и сеттеры) для вашего примера, вы определяете переменные как частные и пишете метод получения для доступа к нему, например,

private int countL = 0;
public void getCountL(){
    return this.countL;
}

и для его вызова используйте test.getCountL();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...