Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21

Карточная игра "Буркозел"

13.02.2025, 11:46. Показов 6549. Ответов 39

Студворк — интернет-сервис помощи студентам
Здравствуйте всем!
Лет 30 назад были попытки изучать BASIC на советском ПК ZX Spectrum, далее взрослая жизнь которая совсем далека от программирования. Пару лет назад тряхнул стариной, изучил основы и написал код на С++ для своего хобби: Плата ардуино управляет краном отбора по пару.
Сейчас появилось время и желание изучить более современный JAVA. Почитал литературу. Порешал задачки. Основа более менее ясна. Решил написать карточную игру "Буркозел".
Просьба к форумчанам обсуждать код, предлагать свои решения и указывать на ошибки. На данном этапе я не совсем понимаю правильная ли у меня структура кода, я не использую пакеты, методы у меня вверху кода, а ход игры будет в главном методе main. Правильно ли это, и почему если нет.

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
public class Main {
 
    // Метод считает сколько карт не хватает игроку
    public static int verifyHand(String[] cardHand) {
        int qtyCard = 0;
        for (int i = 0; i < 4; i++) {
            if ((cardHand[i]) == null) {
                qtyCard++;
            }
        }
        return qtyCard;
    }
 
        // Метод тасует колоду
        public static String[] shuffleCard (String[]mainDeck){
            String[] shuffle = new String[36];
            System.arraycopy(mainDeck, 0, shuffle, 0, 36);
            for (int i = 0; i < 36; i++) {
                int r = i + (int) (Math.random() * (36 - i)); // случайная карта в колоде
                String temp = shuffle[r];
                shuffle[r] = shuffle[i];
                shuffle[i] = temp;
            }
            return shuffle;
        }
 
        // метод раздает карты
        public static String[] getCardHand (String[]currentHand,int nextCard, int getCard, String[] newDeck){
            String[] setCard = new String[4];
            System.arraycopy(currentHand, 0, setCard, 0, 4);
            for (int i = (4 - getCard); i < 4; i++) {
                setCard[i] = newDeck[nextCard - 1];
                nextCard--;
            }
            return setCard;
        }
 
 
 
        public static void main (String[]args){
 
            // Создаем имена игральных карт
            String[] rank = {"6", "7", "8", "9", "Валет", "Дама", "Король", "10", "Туз"};
            String[] suit = {"Пики", "Крести", "Буби", "Черви"};
            // Переменные
            String[] handOneCard = new String[4];
            String[] handTwoCard = new String[4];
            int shuffleDeckStack = 36;
            int qtyDrawCard;
 
            // Создаем колоду из 36 карт
            String[] deck = new String[36];
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 9; j++) {
                    deck[9 * i + j] = suit[i] + " " + rank[j];
                }
            }
 
            // Тасуем колоду
            String[] shuffleDeck = shuffleCard(deck);
 
            // проверка в консоль
            for (int i = 0; i < 36; i++) {
                System.out.println("Тасованная колода карта № " + (i + 1) + " " + (shuffleDeck[i]));
            }
 
            // Проверка в консоль
            System.out.println("На руках у первого игрока нет " + verifyHand(handOneCard) + " карт");
            System.out.println("На руках у второго игрока нет " + verifyHand(handTwoCard) + " карт");
            System.out.println("В колоде " + (shuffleDeckStack) + " карт");
 
            // считаем сколько карт нужно раздать игрокам
            qtyDrawCard = verifyHand(handOneCard) + verifyHand(handTwoCard);
            if (qtyDrawCard > shuffleDeckStack) {
                qtyDrawCard = shuffleDeckStack;
            } // если в колоде меньше карт чем нужно игрокам
            System.out.println("Всего нужно раздать " + (qtyDrawCard) + " карт");
 
            // раздаем карты первому игроку
            handOneCard = getCardHand(handOneCard, shuffleDeckStack, qtyDrawCard / 2, shuffleDeck);
            shuffleDeckStack = shuffleDeckStack - (qtyDrawCard / 2);
 
            // проверка в консоль
            for (int i = 0; i < 4; i++) {
                System.out.println("Карта первого игрока: " + (i + 1) + " " + (handOneCard[i]));
            }
 
            // раздаем карты второму игроку
            handTwoCard = getCardHand(handTwoCard, shuffleDeckStack, qtyDrawCard / 2, shuffleDeck);
            shuffleDeckStack = shuffleDeckStack - (qtyDrawCard / 2);
 
            // проверка в консоль
            for (int i = 0; i < 4; i++) {
                System.out.println("Карта второго игрока: " + (i + 1) + " " + (handTwoCard[i]));
            }
        }
    }
Здесь буду писать как продвигается написание кода.
12 февраля
Колода перетасована, розданы первые карты игрокам. Пока игроков двое, планируется на выбор от двух до четверых.
13 февраля
Сейчас в разработке ИИ для выбора с каких карт ходить игроку которым будут управлять компьютер. Думаю за пару дней сделаю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2025, 11:46
Ответы с готовыми решениями:

Карточная игра 21. Оптимизация и проверка
Всем привет. Изучаю java меньше месяца. Только закончил 4 главу Хортсманна. Надоело писать программки с процедурным подходом. Для понятия...

Продам готовый движок J2ME для создания современных мобильных игр
Всем привет! Продам готовый движок для создания современных мобильных игр на платформе J2ME. -Движок состоит из графической...

Софт для создания мобильных игр
Какой нужен софт для создания приложений на телефон с расширением *.jar , и где его скачать.

39
47 / 39 / 10
Регистрация: 25.02.2025
Сообщений: 84
01.03.2025, 12:48
Студворк — интернет-сервис помощи студентам
-------
ArrayList - это массив, чью длину можно менять динамически. В принципе, это хороший тип-контейнер для данных, но есть ещё Deque (ArrayDeque, LinkedList), Queue, множества (HashSet), чтобы сказать какая структура лучше подходит для представления колоды карт надо знать правила игры. Я не совсем понимаю правила, может расскажете кратко?

Добавлено через 3 минуты
---------
this надо писать если работаете с членами этого класса (которому принадлежит метод в котором пишете текст).
Если не писать this, то человек который смотрит текст, может подумать что это вызываете импортированный ресурс.

Добавлено через 2 минуты
-------
объект - это какое-то абстрактное понятие, даже не связанное с программированием. А экземпляр класса (instance) - это понятие из программирования. Это структура данных, которая реализует объект в компьютере.

Добавлено через 6 минут
-------
конструктор public Deck() - это нормально, передавать какие-то параметры не обязательно.
0
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
01.03.2025, 13:01  [ТС]
Цитата Сообщение от NotAbug Посмотреть сообщение
Я не совсем понимаю правила, может расскажете кратко?
Если в двух словах: На руки раздается по 4 карты. За один кон игры, для победы, играющие забирают себе взятки, желательно с "дорогими" картами, тузы или десятки например. Стоимость карт не меняется, у меня это поле CardRank(int strengthCard).
за один ход, игрок заходит с одной или несколько карт одной масти, и далее по очереди можно побить или скинуть такое же количество карт, до 4 человек может играть. Чьи карты старше тот забирает взятку и заходит первым. Старшинство карт не меняется, но для каждого кона новый козырь
0
47 / 39 / 10
Регистрация: 25.02.2025
Сообщений: 84
01.03.2025, 16:18
насчёт структур данных для представления колоды карт. Колода, которая лежит на столе, она ведь упорядоченная, то есть стопка. Значит можно ArrayDeque. Если из колоды нужно брать не только сверху, а пропустить несколько карт или произвольный доступ по индексу, то LinkedList.
А карты на руках игроков это другое. У них не колода, не упорядоченная структура, а просто куча. То есть множество. Тут надо HashSet.
0
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
09.03.2025, 19:09  [ТС]
Требуется код, для получения из списка карт на руке, кол-ва одинаковых мастей. У меня получается слишком большой и как мне кажется неправильный для JAVA код. Просьба помочь с более коротким вариантом.
Первый вариант:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
   public ArrayList<Card> attackComp(ArrayList<Card> someCard) {
        int qtySpade = 0, qtyDiamond = 0, qtyClub = 0, qtyHeart = 0; // Поля кол-во мастей
        for (Card card : someCard) {
            if (card.getSuit() == CardSuit.SPADE) {qtySpade++;}
            if (card.getSuit() == CardSuit.DIAMOND) {qtyDiamond++;}
            if (card.getSuit() == CardSuit.CLUB) {qtyClub++;}
            if (card.getSuit() == CardSuit.HEART) {qtyHeart++;} // Количество карт одной масти
        }

Второй вариант:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
   Public void qtySuit (ArrayList<Card> someCard){
        ArrayList<CardSuit> onlySuit = new ArrayList<>();
        int[] qtySuit = new int[4]; 
        for (Card card : someCard) {
            onlySuit.add(card.getSuit());
        }
        qtySuit[0] = Collections.frequency(onlySuit, CardSuit.SPADE);
        qtySuit[1] = Collections.frequency(onlySuit, CardSuit.DIAMOND);
        qtySuit[2] = Collections.frequency(onlySuit, CardSuit.CLUB);
        qtySuit[3] = Collections.frequency(onlySuit, CardSuit.HEART);
   }
0
47 / 39 / 10
Регистрация: 25.02.2025
Сообщений: 84
10.03.2025, 10:44
>У меня получается слишком большой (код)

Не то чтоб большой, просто не совсем оптимальный. Сейчас коллекции данных рекомендуется обрабатывать в аппликативном стиле, считается что это повышает надёжность. Здесь можно почитать https://struchkov.dev/blog/ru/java-stream-api/

То есть в данном случае, если cardset - это набор карт, то получится что-то вроде

Java
1
2
3
4
5
6
7
8
9
10
11
12
int qtySpade = 0, qtyDiamond = 0, qtyClub = 0, qtyHeart = 0;
cardset.stream().forEach(
    el -> {
        switch (el.getSuit() )
        {
             case CardSuit.SPADE    -> {qtySpade++;}
             case CardSuit.DIAMOND -> {qtyDiamond++;}
             case CardSuit.CLUB      -> {qtyClub++;}
             case CardSuit.HEART    -> {qtyHeart++;}
         }
    }
);
0
wound up as Aussie
516 / 139 / 22
Регистрация: 15.05.2019
Сообщений: 593
11.03.2025, 09:36
А мне уже удалось (за неделю правда, часов по 5 в день) написать код. Там с выбором количества участников и компьютеров. Но пока не получается сбрасывать две и более карты одной масти. Подключил GPT4, но пока глухо....
Миниатюры
Карточная игра "Буркозел"   Карточная игра "Буркозел"  
0
47 / 39 / 10
Регистрация: 25.02.2025
Сообщений: 84
11.03.2025, 13:31
Python_Val, в чём трудность?
0
wound up as Aussie
516 / 139 / 22
Регистрация: 15.05.2019
Сообщений: 593
11.03.2025, 19:03
NotAbug, трудность в мониторе.
Я не вижу на мониторе большого куска программы, а там уже около 500 строк. (память уже не та что раньше. ).

Добавлено через 1 час 15 минут
А вообще, конечно, надо это через swing написать.
0
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
11.03.2025, 22:16  [ТС]
Так сделал ответ на свой вопрос от 09.03
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
ArrayList<CardSuit> onlySuit = new ArrayList<>(); // Список "только масть"
int[] qtySuit = new int[4]; // Массив ко-во мастей в руке 1-Пики 2-Крести 3-Буби 4-Черви
    for (Card card : someCard) {
        onlySuit.add(card.getSuit()); // Заполняем список "только масть"
    }
    for (int i = 0; i < someCard.size(); i++) {
        qtySuit[i] = (Collections.frequency(onlySuit, CardSuit.values()[i])); // Количество карт одной масти в массив
    for (Card card : someCard) {
         if (((card.getSuit().ordinal() == i) && qtySuit[i] >= 2)) {
              card.setRateMove(card.getRateMove() + (qtySuit[i] * 500)); // Добавляем условную стоимость за масть если одинаковых больше двух
         }
     }
 }
0
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
11.03.2025, 22:34  [ТС]
Так сделал ответ на свой вопрос от 09.03
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
ArrayList<CardSuit> onlySuit = new ArrayList<>(); // Список "только масть"
int[] qtySuit = new int[4]; // Массив ко-во мастей в руке 1-Пики 2-Крести 3-Буби 4-Черви
    for (Card card : someCard) {
        onlySuit.add(card.getSuit()); // Заполняем список "только масть"
    }
    for (int i = 0; i < someCard.size(); i++) {
        qtySuit[i] = (Collections.frequency(onlySuit, CardSuit.values()[i])); // Количество карт одной масти в массив
    for (Card card : someCard) {
         if (((card.getSuit().ordinal() == i) && qtySuit[i] >= 2)) {
              card.setRateMove(card.getRateMove() + (qtySuit[i] * 500)); // Добавляем условную стоимость за масть если одинаковых больше двух
         }
     }
 }

На данный момент меня устраивает тест на ход компьютера:
0
wound up as Aussie
516 / 139 / 22
Регистрация: 15.05.2019
Сообщений: 593
12.03.2025, 11:32
Цитата Сообщение от NotAbug Посмотреть сообщение
Python_Val, в чём трудность?
Основная трудность решения (хотя я ещё к решению толком не приступал, только проверил) - правильная игра со всей колодой, когда выкидывает две карты. Там надо ещё один динамический массив правильно сделать, для карт которые скидывают одной масти, но чтобы было согласованно с уже имеющейся программой.
Цитата Сообщение от welder2025 Посмотреть сообщение
На данный момент меня устраивает тест на ход компьютера:
Тут у Вас один игрок только (Игрок 1), а компьютер себя что-то никак не обозначает. Т.е. игры что-то нет, просто выкидывает две или одну карты, и раздаёт по новой. Кто взял взятку и т.п. ничего же пока нет. .. . Или так пока и надо?
Ну понятно, что пока тест.

Добавлено через 2 часа 24 минуты
Цитата Сообщение от NotAbug Посмотреть сообщение
Лично мне было бы неудобно постоянно переключать язык ввода при написании текста программы, поэтому я называю идентификаторы только латинскими буквами, то есть я бы сделал и добавил метод toString()
Вообще, настоящий кодер должен знать слепой десятипальцевый метод, причём латиницу и кириллицу. У меня автоматом переключает на то что я печатаю.
Помню, в Гонконге в 2006, помоему, году, стояли компы с шестью языками (знако-буквами) - там латиница, китайский, японский, хинди, корейский и ещё один язык, который мне был неизвестен (они на боку, стороне, каждой клавиши нарисованы были, но помему это был минъянмар - там 4 знака с санскрита ) - всё кроме кириллицы. Я установил ru язык, и напечатал письмо домой. В процессе печатания (а там у них кабеля от мониторов и клавиатуры с мышкой просто уходили в стену) подошёл чел какой-то и смотрел как я печатаю - просто стоял как придурок слева от левого плеча за спиной и смотрел.... (200 знаков в минуту не то чтобы много, но и не мало).
Мне странно, что современные кодеры не обладают этим...

Добавлено через 3 минуты
Цитата Сообщение от welder2025 Посмотреть сообщение
Если в двух словах:
Если в двух словах о правилах, то они такие:
Вот словесное описание.
Словесное описание игры Буркозёл:
1) колода из 36 карт. Старшинство карт такое: 6, 7, 8, 9, Валет, Дама, Король, 10, Туз.
Очки: карты 6, 7, 8 и 9 - не дают никаких очков (т.е. 0).
Валет это 2 очка, Дама - 3 очка, Король - 4 очка, карта 10 - это 10 очков, Туз - это 11 очков.
У карт 4 масти: бубны, пики, трефы, черви.
2) Может быть 4 или 3 или 2 игрока играют до 12 очков, причём один из игроков должен быть компьютер (надо написать логику компьютера для этой игры). Тот кто набирает 12 очков первым вылетает и остаются другие игроки. Тот кто остался последним, тот и победитель.
3) Игра:
Тусуется колода (random). Кто будет раздавать определяется жребием (random). Раздаётся колода по одной каждому по кругу, всего 4 карты каждому игроку. Из оставшейся колоды вытаскивается одна карта и открывается - это козырь, козырная масть может перебивать остальные карты, т.е. козырная 6 может перебить любую некозырной масти карту. Оставшиеся карты ложатся закрытыми сверху.
4) Ходит тот кто сдавал карты. Ходить можно с одной любой карты из четырёх что на руках у каждого. Ходит тот кто сдавал карты. Ходить можно или одной любой картой, или двумя, тремя или четырьмя картами если они одной масти.
Если есть масть с которой зашли, то надо играть этой мастью карты.
Остальные игроки смотрят в свои карты, если у них есть большая по номиналу карта (или карты, смотря сколько карт пошёл первый игрок) то можно или кинуть большой номинал - чтобы побить карты соперника (карты ложатся сверху) или если бить нечем, то скидываются столько же карт меньшего номинала сколько кинул соперник, но карты не открываются, а кидаются закрытыми.
И так отбиваются все оставшиеся игроки - каждый кидает столько карт сколько кинул первый игрок в начале. Тот у кого самые старшие по номиналу карты тот забирает все брошенные карты себе - это называется взятка. Смысл игры - набрать как можно больше взяток, чтобы было как можно больше очков при подсчёте в конце игры.
Дальше каждый берёт из колоды на столе столько карт, чтобы у каждого снова было 4 карты. И начинает играть следующий по кругу игрок.
5) Очки считаются подсчитыванием карт со взяток в конце игры. Подсчитываются все карты со взяток у каждого по отдельности игрока.Как считаются очки:
- если 4 игрока:
а) Если набрали меньше 16 очков, то этому игроку назначают 4 штрафных очка;
б) Если набрали меньше 31 очка, то этому игроку назначают 2 штрафных очка;
в) Если набрали 0 очков (то есть нет ни одной взятки), то игроку назначают 6 штрафных очков.

Далее тусуется колода, и снова раздаются карты как описано выше и начинают играть снова. У каждого очки суммируются за эту и все предыдущие игры. у кого 12 штрафных очков - тот выбывает из игры.
- если 3 игрока:
а) Если набрали меньше 21 очка, то этому игроку назначают 4 штафных очка;
б) Если набрали меньше 41 очка, то этому игроку назначают 2 штрафных очка;
в) Если набрали 0 очков (то есть нет ни одной взятки), то игроку назначают 6 штрафных очков.
Далее тусуется колода, и снова раздаются карты как описано выше и начинают играть снова. У каждого очки суммируются за эту и все предыдущие игры. у кого 12 штрафных очков - тот выбывает из игры.
- если 2 игрока:
а) Если два игрока набрали меньше 31 очка, то этому игроку назначают 4 штрафных очка;
б) Если набрали меньше 61 очка, то этому игроку назначают 2 штрафных очка;
в) Если набрали 0 очков (то есть нет ни одной взятки), то игроку назначают 6 штрафных очков.
Далее тусуется колода, и снова раздаются карты как описано выше и начинают играть снова. У каждого очки суммируются за эту и все предыдущие игры. у кого 12 штрафных очков - тот выбывает из игры.
Оставшийся игрок победитель.

В игре должно быть 4 счётчика очков. Игра должна ждать пока походят все игроки, и считать очки. Игра должна считать кто забирает взятку (и всё это надо писать на экране). Убывающий игрок (у кого 12 и больше штрафных очков) выводится из игры (тоже пишется на экране) и продолжают играть оставшиеся игроки. И так игра должна продолжаться пока не останется один игрок - победитель. Игра останавливается.
1
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
12.03.2025, 13:15  [ТС]
Цитата Сообщение от Python_Val Посмотреть сообщение
Т.е. игры что-то нет, просто выкидывает две или одну карты, и раздаёт по новой. Кто взял взятку и т.п. ничего же пока нет. .. . Или так пока и надо?
Спасибо за активное участие. Да, пока игры нет. Решил сперва нужны "мозги". Сделал метод который оценивает карты на руке заходящего игрока под управлением компьютера, согласно логики игры выбирает с каких карт зайти.
Изначально в конструктор карты заложил поле: int rateMoveHand - рейтинг карты заходящего
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
public Card(int numberCard, CardSuit suitCard, CardRank typeCard, int rateMoveHand) {
 
        this.numCard = numberCard;
        this.suit = suitCard;
        this.rank = typeCard;
        this.rateMove = rateMoveHand;
    }

И у карт изначально есть условная стоимость для поиска нужной для хода карты
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
CardSuit(String suitCard, char signCard, int rateSuit){
    this.suit = suitCard;
    this.sign = signCard;
    this.rateSuit = rateSuit;
    }
 
CardRank(String rankCard, int pointCard, int strengthCard, int rateRate) {
        this.rank = rankCard;
        this.point = pointCard;
        this.strength = strengthCard;
        this.rateRate = rateRate;
    }

Заодно у карт есть сила и очки, в общем enum такой:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public enum CardRank {
    N6("6",0, 1, 2560),
    N7("7",0, 2, 2550),
    N8("8",0, 3, 2540),
    N9("9",0, 4, 2530),
    JACK("Валет",2, 5,2520),
    QUEEN("Дама",3, 6, 2510),
    KING("Король",4, 7, 2500),
    N10("10",10, 8, 110),
    ACE("Туз",11, 9, 100);
 
public enum CardSuit {
    SPADE("Пики",'♠',1),
    DIAMOND("Крести",'♣',2),
    CLUB("Буби",'♦',3),
    HEART("Черви",'♥',4);


Цитата Сообщение от Python_Val Посмотреть сообщение
Но пока не получается сбрасывать две и более карты одной масти.
В тестовом прогоне 5000 циклов, работает норм, ходит от одной до четырех карт

Вот сам метод:
Кликните здесь для просмотра всего текста
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
// Метод анализа карт для захода компьютера
    public ArrayList<Card> attackComp(ArrayList<Card> someCard) {
        ArrayList<CardSuit> onlySuit = new ArrayList<>(); // Список "только масть"
        int[] qtySuit = new int[4]; // Массив ко-во мастей в руке 1-Пики 2-Крести 3-Буби 4-Черви
        for (Card card : someCard) {
            card.setRateMove(card.getRank().getRateRate() + card.getSuit().getRateSuit()); // Добавляем стоимость за ранг и масть
            if (card.getSuit() == deck.getTrump()) { // Штраф за козырь
                card.setRateMove(card.getRateMove() - 2100); // Штраф за козырь
            }
        onlySuit.add(card.getSuit()); // Заполняем список "только масть"
        }
 
        for (int i = 0; i < someCard.size(); i++) {
            qtySuit[i] = (Collections.frequency(onlySuit, CardSuit.values()[i])); // Количество карт одной масти в массив
            for (Card card : someCard) {
                if (((card.getSuit().ordinal() == i) && qtySuit[i] >= 2)) {
                    card.setRateMove(card.getRateMove() + (qtySuit[i] * 500)); // Добавляем стоимость за масть
                }
            }
        }
 
        sortStrength(someCard); // Сортируем карты в руке по условной стоимости
 
        ArrayList<Card> organizeHand = new ArrayList<>();
        for (Card card : someCard) {
            System.out.println("проверка: " + card + " " + card.getRateMove());
            if (someCard.get(0).getSuit().equals(card.getSuit())) {
                organizeHand.add(card);
            } // Кладем в заход лучшую карту и одинаковые масти
        }
 
// потом еще код и return organizeHand с нужными картами
 
static void sortStrength(ArrayList<Card> someCard) {
        someCard.sort(Comparator.comparing(Card::getRateMove).reversed());
    }


Про еще код: он совсем страшный , не буду показывать, он убирает 10ки и тузы из organizeHand если заход меньше чем четыре карты.

Про GPT интересно, было бы круто что бы комп ходил не по шаблону а своими мыслями.
1
47 / 39 / 10
Регистрация: 25.02.2025
Сообщений: 84
12.03.2025, 13:55
Python_Val, " У меня автоматом переключает на то что я печатаю." - язык ввода в компьютере переключается или в голове?

"современные кодеры не обладают этим" - не знаю как современные, я программистов вживую давно уже не видел (а есть ли они ещё в природе?), но раньше - да, видел как настоящий программист быстро-быстро набирал текст.

Слепой набор не каждый человек может, это не зависит от профессии.
0
wound up as Aussie
516 / 139 / 22
Регистрация: 15.05.2019
Сообщений: 593
12.03.2025, 20:21
Цитата Сообщение от NotAbug Посмотреть сообщение
язык ввода в компьютере переключается или в голове?
Ну, сначала в голове, потом в компьютере.
(я использую puntoSwitcher с самого начала его появления - не помню уже когда он появился - почти никогда не отключаю).

Добавлено через 3 минуты
Цитата Сообщение от welder2025 Посмотреть сообщение
Про GPT интересно, было бы круто что бы комп ходил не по шаблону а своими мыслями.
Я наверное неточно написал.
К игре GPT не подключен. Я просто у него спрашивал на счёт выброса двух карт - оно всё получается, но колоду пока неправильно перебирает, и находит победителя когда ещё пол колоды на столе.
(но я пока не искал ошибку у себя в коде, если честно. Просто написал что есть и чего нет).

KING("Король",4, 7, 2500) - а что это за 2500 ? для чего? (4 - это очки, 7 это нумерация, наверное).
(а..., это Вы так компьютеру очки для оценки хода что ли подаёте? я понял - это у Вас "условная стоимость" ? )


И ещё мне не понятно вот что:
- Вы пишете код (говорите, что вот написал код) который далеко совсем не для начинающих, но в каком-то другом посте пишете, что "надо разобраться как это всё работает".
Так Вы его пишете или переписываете откуда-то ? (многие, и я в том числе, используют уже готовые решения, если они есть. Т.е. это не укор, это просто вопрос). Я к тому, что если Вы пишете сами, но не всё полностью понимаете, то Вы гений какой-то.
0
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
13.03.2025, 20:58  [ТС]
Цитата Сообщение от Python_Val Посмотреть сообщение
KING("Король",4, 7, 2500) - а что это за 2500 ? для чего? (4 - это очки, 7 это нумерация, наверное).
(а..., это Вы так компьютеру очки для оценки хода что ли подаёте? я понял - это у Вас "условная стоимость" ? )
Да, 2500 это условная стоимость для определения лучшей карты для захода. 7 это сила карты, пригодится для расчетов какая карта старше, к козырям буду добавлять 10.
Цитата Сообщение от Python_Val Посмотреть сообщение
многие, и я в том числе, используют уже готовые решения, если они есть
Конечно, если что то нахожу использую. Например раздачу колоды карт здесь подсказали. И разделение на классы. Я почти новичок, есть небольшой опыт на С++, в старте топика написал. Java действительно не совсем понятна, но постепенно вникаю, спасибо интернету и местным форумчанам.

Добавлено через 1 час 51 минуту
Просьба подсказать как правильно вернуть из метода новый список только козырей
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
public ArrayList<Card> testStream (ArrayList<Card> someCard){
        someCard.stream()
                .filter(CardSuit -> CardSuit.getSuit() == deck.getTrump())
                .forEach(????????????????????????????????);
        return ???????????????????????????????????
 
 }
0
wound up as Aussie
516 / 139 / 22
Регистрация: 15.05.2019
Сообщений: 593
13.03.2025, 23:02
Цитата Сообщение от welder2025 Посмотреть сообщение
новый список только козырей
Что значит "новый список козырей" ? Козырь же один, и эту карту я просто кладу в самый низ колоды, чтобы забирался последним.
Вот класс 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Deck {
 
    private final List<Card> cards = new ArrayList<>();
    private short currentIndex = 0;
    private int trumpCardIndex = 0; // потом перемещаем козырь в конец колоды
    private Card trumpCard;
 
    public Deck() {
        // Создаём  новую колоду
        for (Card.Suit suit : Card.Suit.values()) {
            for (Card.Rank rank : Card.Rank.values()) {
                cards.add(new Card(suit, rank));
            }
        }
 
        Collections.shuffle(cards); // тусуем карты
        // перемещаем козырь в конец колоды ArrayList-a
        trumpCard = getTrumpCard();
        trumpCardIndex = cards.indexOf(trumpCard);
    //    System.out.println("Индекс козыря = " + trumpCardIndex);
        // выводим номер каждой карты в перечне cards которая в ArrayListe
        int index = 0;
        for (Object eachCard : cards.toArray()) {
            System.out.println(String.valueOf(index++) + ": " + eachCard);
        }
    }
 
    public final Card getTrumpCard() {
        trumpCardIndex = cards.size() - 1; // Последняя карта становится козырем
        return cards.get(trumpCardIndex); // Просто смотрим, но не увеличиваем currentIndex
// козырь оказывался девятым в колоде...
 
    }
 
    public Card drawCard() {
        return currentIndex < cards.size() ? cards.get(currentIndex++) : null;
    }
 
    public boolean hasCards() {
        //   System.out.println("current Index " + currentIndex);
        //    System.out.println("cards Size " + cards.size());
        // System.out.println("current Index формула " + cards.get(currentIndex++));
        System.out.println("Осталось карт в колоде " + remainingCards());
        return currentIndex < cards.size();
 
    }
 
    public int remainingCards() {
        return cards.size() - currentIndex;
    }
}
ps: кстати фамилия действующего президента Америки переводится как Козырь.



А, это Вы в процессе игры проверяете козырь? И вам нужно где-то хранить список?
Я не уверен, но возможно так:
Java
1
2
3
4
5
6
7
public ArrayList<Card> testStream (ArrayList<Card> someCard){
        ArrayList<Card> trumpCards = ArrayList<>(); // здесь будут храниться
        someCard.stream()
                .filter(CardSuit -> CardSuit.getSuit() == deck.getTrump())
                .forEach(trumpCards :: add); // а здесь добавляются. 
        return trumpCards;
 }
1
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
14.03.2025, 06:54  [ТС]
Цитата Сообщение от Python_Val Посмотреть сообщение
А, это Вы в процессе игры проверяете козырь? И вам нужно где-то хранить список?
Спасибо за помощь с Stream!!!
Нужна была фильтрация карт на руке отбивающего игрока, циклами и условными операторами неудобно и страшно выглядит.
Работаю над "мозгами" отвечающего игрока:



Козырь меняется каждый кон, здесь в каждой тестовой проверке. Не стал делать козырь видимой картой внизу колоды, просто масть, хоть это и не совсем по реальным правилам.

В тесте 153 вообще бить нечем
В тесте 154 нужно выбрать карту для ответа

Тесты "мозгов" заходящего, в этих проверках, правильно работают, не ходят с тузов и 10ок
0
47 / 39 / 10
Регистрация: 25.02.2025
Сообщений: 84
14.03.2025, 10:27
welder2025, forEach ничего не возвращает. Если надо собрать данные из потока в коллекцию, то применяют метод collect(). По той ссылке можно посмотреть в конце https://struchkov.dev/blog/ru/java-stream-api/

Java
1
2
3
4
5
public ArrayList<Card> testStream (ArrayList<Card> someCard){
        return someCard.stream()
                        .filter( crd -> crd.getSuit() == deck.getTrump() )
                        .collect( Collectors.toList() );
 }
1
2 / 2 / 0
Регистрация: 12.02.2025
Сообщений: 21
14.03.2025, 16:33  [ТС]
Цитата Сообщение от NotAbug Посмотреть сообщение
forEach ничего не возвращает. Если надо собрать данные из потока в коллекцию, то применяют метод collect(). По той ссылке можно посмотреть
Спасибо!
Это действительно лучшая статья на русском про Stream. Но мне сложно понять тонкости без примеров.
Можно ли заменить данную условную конструкцию:
Java
1
2
3
4
5
6
7
for (Card card : someCardPlayer) {
if (card.getSuit() == deck.getTrump()) {   // можно ли здесь написать .filter вместо if                                    
card.setStrength(card.getStrength() + 10); // а здесь .map и установить новое значение поля
 
.map(Сard -> Сard.setStrength(Сard.getStrength()+10))
// То что я пробую, выдает:
// no instance(s) of type variable(s) R exist so that void conforms to R
0
47 / 39 / 10
Регистрация: 25.02.2025
Сообщений: 84
14.03.2025, 17:15
Попрбуйте так:

Java
1
2
3
4
someCardPlayer.stream()
     .filter( crd -> crd.getSuit() == deck.getTrump() )
     .map( crd -> { crd.setStrength( crd.getStrength()+10 ); return crd; } )
     .collect( Collectors.toList() );
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2025, 17:15

Создание двухмерных игр на телефонах
есть ли у когонибудь инфа по созданию двух мерных игр на телефонах(сони -эриксон), работа с беспроводными протоколами связи ИК и зуб???????

Редактирование и взлом JAVA игр
Помогите пожалуста добрые люди, у меня такая проблема: Есть две одинаковые игры, разных версий. Старая версия очень нравиться но там нету...

Рисование графики для игр
Подскажите пожалуйста каим инструментом рисуеться графика в ждава играх, и как ним пользоваться, можно ли изменить графику в игре -...

Обучение программированию для написания игр
Я переиграл кучи любительских игр и профессиональных, и мне очень захотелось создать свою собственную Java игру. Я готов к тому что...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru