Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/64: Рейтинг темы: голосов - 64, средняя оценка - 4.67
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120

Карточная игра 21. Оптимизация и проверка

14.08.2016, 14:15. Показов 13540. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Изучаю java меньше месяца. Только закончил 4 главу Хортсманна. Надоело писать программки с процедурным подходом. Для понятия ООП, поставил себе задачу сделать карточную игру 21 (пока что вариант для 2 игроков). Правила в интернете не стал читать (лень ), а поставил свои: 1) Игра начинается с раздачи каждому 2 карт. 2) Туз - 1; 2 - 2 ... Король - 13. 3) Если у обоих сумма равна - ничья. Иначе выигрывает тот, у кого сумма 21 или, при отсутствие такого варианта, тот, у кого ближе к 21.
Класс Card:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Card {
    
    private int rank, suit;
    
    private static String[] suits = { "hearts", "spades", "diamonds", "clubs" };
    private static String[] ranks = { "Ace" , "2", "3", "4", "5", "6", "7",
                                        "8", "9", "10", "Jack", "Queen", "King" };
    
    Card (int suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }
    
    int getRank() {
        return rank;
    }
    
    int getSuit() {
        return suit;
    }
    
    String getNameOfCard() {
        return ranks[rank] + " of " + suits[suit];
    }
    
}

Класс Deck:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.Random;
 
public class Deck {
    
    private ArrayList<Card> cards;
    
    Deck() {
        cards = new ArrayList<Card>();
        for (int i = 0; i <= 3; i++) {
            for (int j = 0; j <= 12; j++) {
                cards.add(new Card(i, j));
            }
        }
    }
    
    Card drawFromDeck() {
        Random rndGenerator = new Random();
        int index = rndGenerator.nextInt(cards.size());
        Card drawedCard = cards.get(index);
        cards.remove(index);
        return drawedCard;
    }
    
    int getSizeOfDeck() {
        return cards.size();
    }
    
}

Класс Hand:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.util.ArrayList;
import java.util.Scanner;
 
public class Hand {
    
    private static int nextId = 1; // first player has index 1, not 0
    
    private int id;
    private ArrayList<Card> cards;
    private int value; //sum of values of cards in hand
    
    Hand(Deck deck) {
        this.setId(); // set ID to player (hand)
        cards = new ArrayList<Card>();
        // in the start hand has 2 cards
        for (int i = 0; i <= 1; i++) {
            cards.add(deck.drawFromDeck());
        }
    }
    
    void setId() {
        id = nextId;
        nextId++;
    }
    
    int getId() {
        return id;
    }
    
    void getAdditionalCards(Deck deck) {
        String userAnswer;
        Scanner scan = new Scanner(System.in);
        boolean takeCard = true;
        
        while (takeCard) {
            System.out.println("\nPlayer #" + this.getId()
                + ". Sum of your cards: " + this.getValueOfHand()
                + ". Do you want to take one more card? 'Y' or 'N'...");
            userAnswer = scan.next();
            switch (userAnswer.toUpperCase()) {
                case "Y": cards.add(deck.drawFromDeck());
                          this.showCardsInHand();
                          break;
                case "N": takeCard = false;
                          break;
                default:  System.out.print("Incorrect input. Try again.");
                          break;
                
            }
        }
 
    }
    
    void showCardsInHand() {
        System.out.print("\nCards of player #" + this.getId() + ": ");
        for (Card i : cards) {
            System.out.print(i.getNameOfCard() + "; ");
        }
    }
    
    int getValueOfHand() {
        value = 0; // reset value when player take additional card
        for (Card i : cards) {
            // e.g. index of Ace equals 0, but value of Ace equals 1
            value += i.getRank() + 1;
        }
        return value;
    }
    
    void printValueOfHand() {
        System.out.print("Sum of your cards: " + this.getValueOfHand());
    }
    
    void compareHands(Hand another) {
        if (this.getValueOfHand() == another.getValueOfHand()) {
            System.out.print("Draw!");
        } else if (this.getValueOfHand() == 21) {
            System.out.print("Player #" + this.getId() + " wins!");
        } else if (another.getValueOfHand() == 21) {
            System.out.print("Player #" + another.getId() + " wins!");
        } else if (this.getValueOfHand() > 21 && another.getValueOfHand() < 21) {
            System.out.print("Player #" + another.getId() + " wins!");
        } else if (this.getValueOfHand() < 21 && another.getValueOfHand() > 21) {
            System.out.print("Player #" + this.getId() + " wins!");
        } else if (this.getValueOfHand() < 21 && another.getValueOfHand() < 21) {
            if (this.getValueOfHand() > another.getValueOfHand()) {
                System.out.print("Player #" + this.getId() + " wins!");
            } else {
                System.out.print("Player #" + another.getId() + " wins!");
            }
        } else if (this.getValueOfHand() < another.getValueOfHand()) {
            System.out.print("Player #" + this.getId() + " wins!");
        } else {
            System.out.print("Player #" + another.getId() + " wins!");
        }
    }
    
}

Класс Game:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Game {
    
    public static void main(String[] args) {
        
        // create deck of cards
        Deck deck = new Deck();
        
        // create 2 players
        Hand hand1 = new Hand(deck);
        Hand hand2 = new Hand(deck);
        
        // show cards of each player
        hand1.showCardsInHand();
        hand2.showCardsInHand();
        
        // offer to players take one more card
        hand1.getAdditionalCards(deck);
        hand2.getAdditionalCards(deck);
        
        // Compare hands of players. Print the number of winner
        hand1.compareHands(hand2);
    }
    
}

К вам у меня есть несколько вопросов:
1) Стоит ли упрощать метод getAdditionalCards() в классе Hand? Я хотел создать сканер для класса и использовать его для вызова рекурсивного метода запроса ответа от игрока. Но меня "испугала" сама идея создания сканера вне метода.
2) Самый сильно-интересующий меня вопрос . В методе compareHands() я постоянно вызываю метод getValueOfHand(). Не перегружаю ли я процессор лишней "фигней"? Возможно стоит использовать поле value для каждого объекта Hand?
3) Есть ли какие-нибудь недочеты по инкапсуляции?
Кому-то вопросы покажутся глупыми, но я просто не хочу быть дилетантом в том, чему учусь.
Всем, кто обратит внимание и ответит, большое спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2016, 14:15
Ответы с готовыми решениями:

Карточная игра 50
Разложим на столе 24 раскрытые карты: все карты с номерами от 1 до 6 обычной колоды, где туз считается за 1. Масти карт несущественны,...

Карточная игра
Ребят, надо сделать карточную игру &quot;Дурак&quot; на C# Я код написала на C++, т.к. C# для меня - тёмные дебри... Как реализовать можно,...

Карточная игра на C#
Задание на курсовую работу , создать карточную игру(на выбор), язык : c#. Очень мало практики , нужна помощь. Если у кого-то есть примеры...

10
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
14.08.2016, 15:13
Для вещей которые ты сделал с помощью
Java
1
private static String[] suits = { "hearts", "spades", "diamonds", "clubs" };
есть enum-ы.
Переменные ты сделал private, а методы нет, делай их все private или public которые нужны.
По логике - getAdditionalCards не должен этого всего делать, метод должен просто доставать карту из колоды, а уже управлять этим процессом, спрашивать игрока и тп. уже другой метод/класс. Если ты например захочешь сделать режим игры игрока против компьютера, этот метод ты не сможешь использовать для обоих, придется писать еще один для npc.
this.getValueOfHand вызывать много раз нет смысла да, один раз вызываешь и сохраняешь в переменную и потом сравниваешь уже с ней. И писать this.methodName лишнее, methodName достаточно. this - это ссылка на текущий экземпляр объекта.

И правила почитай, они посложнее чем твои и больше возможностей в игре - будет сложней реализовывать
1
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
14.08.2016, 17:05  [ТС]
ninjacut, А чем плохо, что я использовал не enum'ы, а массив стрингов? Я что-то совсем забыл про перечисления, не пользовался ими ни разу.
Как я понимаю, методы у меня сейчас default. Я собираюсь потом все это в один пакет поместить и сделал так, чтобы они были доступны в том пакете. Или в данном виде они используются только своим классом и их можно делать private? Просто я "пришел" с Паскаля, поэтому еще каша в голове
Насчет метода добавления карты игроку. Я так понимаю, что мне лучше отдельно сделать метод, который будет запрашивать ответ от игрока и там уже будет вызывать метод добавления карты, если ответ был "Y". А метод добавления карты отдельно создать в пару строчек. И для NPC вызывать уже чисто его, без запроса?
А вот this это пока что моя "головная боль". Не могу полностью въехать в её смысл. Применять применяю, но не все знаю об этом. По идее метод у меня не статичный, то есть я должен применять его к объекту. Причем (в моем случае) к объекту, который его и вызвал. Поэтому я пишу this. Или конкретно в классе Hand, где определен этот метод, я могу обойтись без this?
Как доберусь до своего компа, буду пробовать. Спасибо за ответ.
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
14.08.2016, 18:33
striker24, Если допустим ты захочешь за туза давать одно очко если > 11, и 11 если меньше (как в блэкджке) то варианты сравнивать card.getRank().equals(ranks[0]) или card.getRank() == Ranks.ACE.
Делай все методы и переменные - либо private, либо public. Позднее, когда достаточно разберешься, будешь решать где можно делать default или protected доступ. Это совет, расписывать почему - долго.
Цитата Сообщение от striker24 Посмотреть сообщение
Насчет метода добавления карты игроку. Я так понимаю, что мне лучше отдельно сделать метод, который будет запрашивать ответ от игрока и там уже будет вызывать метод добавления карты, если ответ был "Y". А метод добавления карты отдельно создать в пару строчек. И для NPC вызывать уже чисто его, без запроса?
Да, как-то так

Про this, метод не статичный и значит он вызывается как раз в контексте экземпляра объекта, this писать - это лишнее.
1
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
14.08.2016, 20:28  [ТС]
ninjacut, буду пробовать тогда с enum'ами. Запрос карты переписал вот так:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    void getAdditionalCards(Deck deck) {
        cards.add(deck.drawFromDeck());
    }
    
    void askForAdditionalCard(Deck deck) {
        String userAnswer;
        Scanner scan = new Scanner(System.in);
        boolean takeCard = true;
        
        while (takeCard) {
            System.out.println("\nPlayer #" + getId()
                + ". Sum of your cards: " + getValueOfHand()
                + ". Do you want to take one more card? 'Y' or 'N'...");
            userAnswer = scan.next();
            switch (userAnswer.toUpperCase()) {
                case "Y": getAdditionalCards(deck);
                          showCardsInHand();
                          break;
                case "N": takeCard = false;
                          break;
                default:  System.out.print("Incorrect input. Try again.");
                          break;
                
            }
        }
    }


Не сказал бы, что прям конкретно что-то изменилось. Такой подход считается более логичным?
И по поводу this. Вы хотите сказать, что если я применяю метод класса Hand внутри другого метода ЭТОГО ЖЕ класса, то компилятор сам "понимает", что метод относится к объекту, который его вызвал? И соответственно this употреблять необязательно. Так ли это?
И насчет удобочитаемости. Этот кусок оставил так:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    void compareHands(Hand another) {
        if (this.value == another.value) {
            System.out.print("Draw!");
        } else if (this.value == 21) {
            System.out.print("Player #" + this.getId() + " wins!");
        } else if (another.value == 21) {
            System.out.print("Player #" + another.getId() + " wins!");
        } else if (this.value > 21 && another.value < 21) {
            System.out.print("Player #" + another.getId() + " wins!");
        } else if (this.value < 21 && another.value > 21) {
            System.out.print("Player #" + this.getId() + " wins!");
        } else if (this.value < 21 && another.value < 21) {
            if (this.value > another.value) {
                System.out.print("Player #" + this.getId() + " wins!");
            } else {
                System.out.print("Player #" + another.getId() + " wins!");
            }
        } else if (this.value < another.value) {
            System.out.print("Player #" + this.getId() + " wins!");
        } else {
            System.out.print("Player #" + another.getId() + " wins!");
        }   
    }

Мне кажется наличие this здесь делает код более удобочитаемым. Так как в качестве параметра выступает другой экземпляр этого же класса. Явно видно где нужно поле/метод вызвавшего объекта, а где - объекта, который передается в качестве параметра. Вы так не думаете?
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
14.08.2016, 21:05
striker24, По первому вопросу, я имел в виду что класс Hand по логике не должен заниматься тем чтобы спрашивать нужны ли карты игроку еще или нет. Этим уже бы занимался какой-нибудь GameManager, или Dealer. Вот он уже спрашивает нужны ли карты, и если да, то вызывает метод из Hand, или сам берет карту, и уже ее передает в Hand в метод например dealCard(Card card).

По второму, да, нестатичный метод по-другому нельзя же вызвать, только из объекта.
И this в этом случае, по-моему это просто в глаза бросается, никакой ясности не добавляет.
1
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
15.08.2016, 00:00  [ТС]
ninjacut, хмм... получается ваши слова можно интерпретировать как "методы в классе должны выполнять действия ОТ ИМЕНИ класса"? Ну то есть как бы Hand берет Card, Dealer спрашивает у Hand ответа и т.д. Получается по такой логике я должен метод drawFromDeck() перенести в класс Hand. Ведь рука "вытягивает" карту. И метод getRank() перенести в Hand, ведь узнает масть и значение карты рука (к примеру, мы можем не переворачивать карту рубашкой вниз и тем самым не узнать этих данных).
Я же создавал все методы по принципу "метод в классе должны выполнять действия НАД этим классом". То есть вытянуть карту из колоды, получить масть от карты, спросить игрока(руку) о взятии еще карты и т.д.
Вышел уже за пределы темы, но все-таки хочется знать истину. Возможно, надо перечитывать основы ООП.
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
15.08.2016, 20:58
striker24, Не все так догматично. Я лишь покажу свой ход мыслей - ситуация: нужно организовать сдачу карты из колоды в руку. Значит в руку приходит карта, ок, в классе Hand будет метод insertCard(Card card). Из колоды след. карту надо получить, ок, в классе Deck будет метод Card getNextCard(). Все. Использование этих методов уже не этих классов дело.
1
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
16.08.2016, 23:26  [ТС]
ninjacut, вроде понятно. Значит буду почаще читать чужой код и пытаться понять логику там. Думаю, что под это дело хорошо подойдет стандартная библиотека java.
0
2 / 2 / 1
Регистрация: 06.06.2013
Сообщений: 4
18.08.2016, 19:42
Тоже не так давно изучаю Java, решил написать свой вариант. Очень похож на вариант автора, но ближе к реальным правилам и сразу на множество игроков, которое вводиться с клавиатуры.
Класс Card:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
enum suits {Heart, Diamond, Club, Spade}//просто значения, которые никакой роли не играют
enum ranks {Ace (11), King (4), Queen (3), Jack (2), Ten (10), Nine (9), Eight (8), Seven (7), Six (6);
    private final int value;
    ranks(int newValue) {
        this.value = newValue;
    }
    public int getValue() {
        return value;
    }
}
public class Card {
    private suits suit;
    private ranks rank;
    public Card(int newSuit, int newRank) {
        switch (newSuit) {//возможно можно как-то красивее или продуктивнее сделать
            case 0 : suit = suits.Heart; break;
            case 1 : suit = suits.Diamond; break;
            case 2 : suit = suits.Club; break;
            case 3 : suit = suits.Spade; break;
            default : suit = null; System.out.println("There is no such suit here");
        }
        switch (newRank) {//тоже самое, значение переменной роли особо не играет, так как карты в колоду
            //добавляются последовательно, по каждой масти 9 карт, а выборка происходит через Random
            case 0 : rank = ranks.Ace; break;
            case 1 : rank = ranks.King; break;
            case 2 : rank = ranks.Queen; break;
            case 3 : rank = ranks.Jack; break;
            case 4 : rank = ranks.Six; break;
            case 5 : rank = ranks.Seven; break;
            case 6 : rank = ranks.Eight; break;
            case 7 : rank = ranks.Nine; break;
            case 8 : rank = ranks.Ten; break;
            default : rank = null; System.out.println("There is no such rank here");
        }
    }
    public String getNameOfCard() {
        return "suit: " + suit + " rank: " + rank + ";\n";
    }
    public int getValueOfCard() {
        return rank.getValue();
    }
}

Класс Deck:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Deck {
    private ArrayList <Card> cards = new ArrayList<Card>(36);
    Deck() {
        for(int i = 0; i <= 3; i++) {
            for(int j = 0; j <= 8; j++) {
                cards.add(new Card(i, j));
            }
        }
    }
    Card getCardFromDeck() {
        Random random = new Random();
        Card draw = cards.get(random.nextInt(cards.size()));
        cards.remove(draw);
        return draw;
    }
}

Класс Hand:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.ArrayList;
public class Hand {
    private static Deck deck = new Deck();
    private ArrayList <Card> cards = new ArrayList<Card>(4);
    private int id;//айди не статический, потому-что каждую игру нужно начинать с игрока №1
    Hand(int id) {
        this.id = id;
        getOneMoreCard();//каждому игроку выдаётся по 1 карте вначале
    }
    public boolean getOneMoreCard() {
        cards.add(deck.getCardFromDeck());
        if(getValueOfHand() == 21) {//если мгновенно обнаружился победитель
            System.out.println("The winner is " + this);
            System.out.println(showCards());
            return false;
        } else {
            return true;
        }
    }
    public @Override String toString() {
        return "Player #" + id;
    }
    public int getValueOfHand() {
        int value = 0;
        for(Card i : cards) {
            value += i.getValueOfCard();
        }
        return value;
    }
    public String showCards() {
        String result = "";
        int value = 0;
        for(Card i : cards) {
            result += i.getNameOfCard();
            value += i.getValueOfCard();
        }
        return result + "And value of those cards is:" + value;
    }
}

Класс Game:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import java.util.*;
public class Game {//фактический механизм всей игры
    private ArrayList <Hand> players = new ArrayList<Hand>();
    public Game() {
        while(players.isEmpty()) {
            System.out.println("How many players will play?");
            Scanner input = new Scanner(System.in);
            if(input.hasNextInt()) {
                for(int i = 1, n = input.nextInt(); i <= n; i++) {
                    players.add(new Hand(i));
                }
            } else {
                System.out.println("Wrong number, try again");
            }
        }
        System.out.println("Lets the game begins!");
        drawingCards();//можно было уместить к конструкторе, но отдельный метод
        //посчитал более предпочтительным
    }
    public void drawingCards() {
        winner://для мгновенного выхода из раздачи карт в случае набора 21 очка одним из игроков
        //не очень красиво, но главное работает
        {
            for(Hand i : players) {
                while(true) {
                    String answer;
                    System.out.println(i +", it's your turn.\n" +
                            "Cards in your hand are those:\n" +
                            i.showCards());
                    System.out.println("Do you want to draw another card? Write \'Y\' if you do, or anything else if you don't");
                    Scanner input = new Scanner(System.in);
                    answer = input.nextLine();
                    if(answer.toUpperCase().equals("Y")) {
                        if(!i.getOneMoreCard()) {
                            System.out.println("The game is ended!");
                            break winner;//выход из раздачи (у одного из игроков 21 очко)
                        }
                    } else {
                        break;
                    }
                    if(i.getValueOfHand() >= 22) {
                        System.out.println(i + " now is out of the game with " + i.getValueOfHand() + " points");
                        break;
                    }
                }
            }
            System.out.println("All players have drawn their cards");
            chooseWinner();//идём на выбор победителя, в том случае, если игра ещё продолжается
        }
    }
    public void chooseWinner() {
        Set <Integer> points = new HashSet <Integer> ();
        Map <String, Integer> map = new HashMap<String, Integer>();
        for(Hand i : players) {//здесь записываем в мапу всех игроков и их результат
            map.put(i.toString(), i.getValueOfHand());
            points.add(i.getValueOfHand());//запоминаем уникальные значения набранных очков
            //сделано с целью возможности дальнейшего нахождения 2, 3 и т.д. места
        }
        int [] results = new int [points.size()];
        Iterator <Integer> it = points.iterator();
        for(int i = 0, n = points.size(); i < n; i++) {
            results[i] = it.next();//скорее всего можно красивее, но не знаю как
        }
        Arrays.sort(results);
        int winners = 0;
        ArrayList <String> listOfWinners = new ArrayList<String>();
        int maxPoints = results[results.length - 1];
            for(Map.Entry<String, Integer> entry : map.entrySet()) {
                if(maxPoints == entry.getValue()) {
                    listOfWinners.add(entry.getKey());
                    winners++;//ищем общее число победителей, победители - те, которые набрали макс. кол-во очков
                }
            }
            if(winners == 1) {//в случае 1го победителя
                System.out.println("Congratulation to " + listOfWinners.get(0) + " he won with " + maxPoints + " points");
            } else {
                if(winners >= 2) {//если их несколько
                    System.out.println("Congratulation to our winners:\n");
                    for(String loopStr : listOfWinners) {
                        System.out.println(loopStr);
                }
                System.out.println("They have won with " + maxPoints + " points");
            } else {//в случае, если игроков с таким количество очков нет (что не возможно, если не произошел сбой памяти)
                System.out.println("Error, try to restart this program and try again");
                }
        }
    }
}

Класс Run (main):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Scanner;
public class Run {
    public static void main(String [] args) {
        System.out.println("This is called "21"");
        while(true) {
            Scanner input = new Scanner(System.in);
            System.out.println("Would you like to start a new game? Write \'Y\' to start");
            String answer = input.nextLine();
            if(answer.toUpperCase().equals("Y")) {
                Game game = new Game();
            } else {
                System.out.println("Good bye! We will see you later! I hope :'(");
                break;
            }
        }
    }
}


Буду очень рад увидеть обоснованную критику.
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
18.08.2016, 21:17
Mr_MaZa, написать всю игру в конструкторе класса это конечно тоже попадает под ваше определение "зато работает", но вопрос какая ваша цель. Если писать "лишь бы работало", тогда нет смысла выкладывать и спрашивать мнение. Если хотите сделать хорошо, то вы сами видите что что-то написано плохо. Зачем ждать пока вам это скажут другие (это я про лейбл).

В целом код как код. Все начинающие такой пишут, что тут критиковать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.08.2016, 21:17
Помогаю со студенческими работами здесь

Карточная игра
Здраствуйте :) Помощь для чайника, так что заранее извиняюсь если что не так :) Существует такая игра Марьяж, в колоде 32 карты....

Карточная игра
Здравствуйте! Есть карточная игра, нужно сделать программу для игры на компьютере и далее, чтобы можно было играть в интернете в нее...

Карточная игра 21 в Delphi
Правила игры: Срочно нужна помощь!! В 21 играют колодой, состоящей из 52 карт. Играют последовательно, сначала нужное...

Карточная игра Девятка
у кого нибудь есть рабочий код Карточной игры Девятка? или рабочий исходник?

Карточная игра Марьяж
в колоде 32 карты. Обозначаются они 7, 8, 9, X, J, Q, K,A. Масти различаются 4 цветами (1,2,3,4). 1 игроку раздается 12 карт, и двум...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru