"Сделка или нет"-стиль игры в Java


Эта игра пояснили здесь.

Может этот код более эффективным?

Игра Класс

import java.util.List;
import java.util.Arrays;
import java.util.Collections;

public class Game {

    private Case[] cases = new Case[26];
    private Player player = new Player();
    private Banker banker = new Banker();
    private int myAmount = 0;
    private int turn = 1;
    private int briefCases = 26;
    private int casesToRemove = 6;
    private int offer = 0;
    private boolean gameContinue = true;

    public void caseSetup() {

        List<Integer> values = Arrays.asList(1, 5, 10, 100, 500, 750, 1000, 20000, 50000, 75000, 95000,
                100000, 150000, 250000, 350000, 400000, 450000, 500000, 600000, 700000, 25, 900000, 1000000, 1500000, 300, 900000);

        Collections.shuffle(values);

        for (int i = 0; i < cases.length; i++) {
            int amount = values.get(i);
            cases[i] = new Case(amount, i + 1);
        }
    }
    public void showCase(){
    for (int j = 0; j < cases.length; j++) {
            System.out.print("\t[" + cases[j].getFace() + "] ");
            if (j % 5 == 4) {
                System.out.println();
            }
        }
    }

    public void game(){
        caseSetup();
        showCase();

        myAmount = player.userCase(cases);
        briefCases--;

        while(gameContinue==true){

                if(briefCases == 25||briefCases == 19 ||briefCases == 14 || briefCases == 10 ||briefCases == 7){
                for(int counter = casesToRemove;counter>0;counter--){
                    player.removeCase(counter,cases);
                    briefCases--;
                    showCase();
                }
                offer = banker.getOffer(turn,cases,myAmount);
                gameContinue = player.dnd();
                casesToRemove--;
                turn++;
                }else if(briefCases == 1){
                    player.removeCase(1,cases); 
                    offer = banker.getOffer(turn,cases,myAmount);
                    gameContinue = player.dnd();
                    casesToRemove--;
                    briefCases--;
                    turn++;
                }
                else{
                    player.removeCase(1,cases); 
                    offer = banker.getOffer(turn,cases,myAmount);
                    gameContinue = player.dnd();
                    casesToRemove--;
                    briefCases--;
                    turn++;
                }
        }
        finishGame();
    }
        public void finishGame(){
        if(briefCases == 0){
        System.out.println("You've rejected the Offer of banker");
        System.out.println("You've won "+myAmount+"And your Case is Larger Than Bankers Offer: "+offer);
        }else{
        System.out.println("Your Accept the offer of banker");
        System.out.println("You've won "+myAmount+" and the Bankers offer is :"+offer);
        }
    }

}

Класс Банкир

public class Banker{

    private int total = 0;
    private int numOfSamples = 0;
    private int average = 0;
    private int offer = 0;

    public void setOffer(int turn,Case[] cases,int myAmount){
        for(int i = 0 ;  i < cases.length;i++){
            if(!cases[i].Removed()){
             total = myAmount+cases[i].getValue();
             numOfSamples++;
            }
        }
        average = myAmount+total/numOfSamples;
        offer = average*turn/10;
    }

    public int getOffer(int turn,Case[] cases,int myAmount){
     setOffer(turn,cases,myAmount);
     System.out.print("The Bankers Offer Is: "+offer);
     return offer;
    }
}

Класс Портфель

public class Case{

    private int value = 0;
    private String face;
    private boolean removed = false;

    public Case(int nValue,int nFace){
        this.value = nValue;
        this.face = Integer.toString(nFace);
    }

    public int getValue(){
        return value;
    }

    public String getFace(){
        return face;
    }

    public boolean Removed()
    {
        return removed;
    }

    public void remove(){
        removed = true;
        face = "X";
    }
}

Основной класс

public class GameTest{

    public static void main(String[] args){

        Game DND = new Game();
        DND.game();
    }
}


6744
6
задан 13 сентября 2011 в 05:09 Источник Поделиться
Комментарии
2 ответа

Несколько замечаний:


  • Старайтесь держать область как можно меньше переменных. Не бойтесь локальных переменных.

  • Последовательно соблюдать соглашения об именах. Иногда ваши имена методов в UpperCamelCase. Что должно быть зарезервировано для класса и только имена интерфейсов. Также имена методов должны быть глаголы или глагольные словосочетания. (Правка: это используется, чтобы сказать, имена переменных должны быть глаголами. Это совершенно неправильно, и это была невыспавшейся ошибкой с моей стороны, чтобы включить это. Имена переменных должны быть lowerCamelCase описательные существительные.)

  • Сложнее, если заявление может почти всегда быть перенесены подальше. Иногда им нужно двигаться для их собственного класса, но большую часть времени вы можете избавиться от них вовсе. Посмотреть стратегия шаблон, заменить код типа подклассами, абстрактная Фабрика шаблон

  • Пробел-твой друг. Это делает код красивее и легче читать.
    средняя = myAmount+итого/numOfSamples должны быть
    средняя = myAmount + итого / numOfSamples

  • Магическое число сосать. Твердо отказаться от них.

  • Комментарии вашего друга. Многие вещи у вас был запутанным первую пару идти трос из-за отсутствия комментариев. Они могут помочь вам придумать лучше имена переменных и функций, сделать лучше разложение, и больше внимания уделять рефакторингу (все по низкой, низкой цене в $0.00!)

    Для каждой строки кода в вашей программе:


    • Придумать комментарий, который объясняет, что вы делаете и почему вы делаете это. Вы должны только добавлять комментарии о том, почему вы делаете что-то в ваш фактический код, но думать о том, что вы делаете помогает при рефакторинге.

    • Если это комментарий на поле или константу и это не уже избыточной, рефакторинг имя переменной, так что комментарий будет излишним. Если еще есть, почему необходимы разъяснения, а затем добавить комментарий, в противном случае ваш код должен в основном быть самодокументируемыми.

    • Замечания перед началом функции следует рассматривать необходимое , прежде чем ваша функция завершена. Всегда есть зачем для каждой функции. Однако, думая о то, что может помочь вам изменить имена ваших функций. Также если вы не можете думать о хорошем краткое имя вашей функции, это может быть признаком того, что он делает слишком много. Разлагаться.

    • Комментарии перед занятиями очень похожи на комментарии до функции; они являются обязательными, они могут помочь вам изменить имена ваших классов, и они помогают избавиться от Бога-классы.

    • Комментарии внутри функций, которые не кажутся избыточными, наверное, показатель дополнительные декомпозиции, если вы делаете сложный алгоритм. Разлагаться.


  • Этот код умоляет, чтобы быть расширяемой. На основе текста-это хорошо, чтобы начать с, но иногда есть такое ощущение, что вы должны изменить его на Гуй (или изменить текст в интерфейсе или ж/д). Дизайн с учетом. Ваш код настолько тесно связаны небольшие изменения в пользовательский интерфейс позволит сделать вам придется пройти через все это. Вы, наверное, хотите больше классов, чтобы выделить различные функциональные возможности. Рассмотрим в MVC.

7
ответ дан 7 июля 2012 в 09:07 Источник Поделиться

gameContinue==правда может быть просто gameContinue

Похоже, вы могли бы просто избавиться от:

else if(briefCases == 1){
player.removeCase(1,cases);
offer = banker.getOffer(turn,cases,myAmount);
gameContinue = player.dnd();
casesToRemove--;
briefCases--;
turn++;
}

Эти линии могут быть перемещены из if и else блоков:

offer = banker.getOffer(turn,cases,myAmount);
gameContinue = player.dnd();
casesToRemove--;
turn++;

Я бы либо переименовать способ setOffer или избавиться от него полностью. Название обманчиво, и не похоже, чтобы использоваться за пределами класса. Кроме того, он требует дополнительной переменной состояния. (Это постоянно растущий numOfSamples ошибка?).

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

Строго говоря, похоже, что дело должно быть единственный класс, который имеет какие-либо переменные состояния (вам не дадут код для плеера)- если у вас есть время, вы можете выполнить рефакторинг это так, как это сделает жизнь так гораздо лучше.

3
ответ дан 14 сентября 2011 в 12:09 Источник Поделиться