Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 21.10.2018
Сообщений: 39

Отрисовка карт в игре "Пьяница"

18.11.2019, 14:54. Показов 5008. Ответов 23

Студворк — интернет-сервис помощи студентам
Здравствуйте, есть код для игры "Пьяница" в консольном виде, нужно сделать из него WPF-приложение, а конкретно отображать карты. Каким образом можно показывать карты на WPF в рамках этого кода или может нужно что-то поменять. Уже есть папка с картинками карт, помещённая в ресурсы, возможно можно как-то назначить каждому элементу списка свою картинку. Если у кого-то есть идеи буду благодарен за помощь.


Вот сам код:

C#
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Пьяница
{
    enum Mast
    {
        Piki, Treph, Bubni, Chervi
    }
    enum number
    {
        Six, Seven, Eight, Nine, Ten, Valet, Dama, King, Tus
    }
    class Card
    {
        #region библиотеки
        static Dictionary <Mast, string> mastdictionary = new Dictionary <Mast, string> ()
        {
        { Mast.Piki, "Пики"},
        { Mast.Treph,"Трефы"}, 
        { Mast.Bubni,"Бубни"},
        { Mast.Chervi, "Черви"}
        };
        static Dictionary < number, string > numberdictionary = new Dictionary < number, string > ()
        {
        {number.Six, "6-ка "},
        {number.Seven, "7-ка "},
        {number.Eight, "8-ка "},
        {number.Nine, "9-ка"},
        {number.Ten, "10-ка "},
        {number.Valet, "Валет "},
        {number.Dama, "Дама "},
        {number.King, "Король "},
        {number.Tus,"Туз "}
        };
        #endregion
        private Mast Mast;
        private number number;
 
        public Mast MAst
        {
            get { return Mast; }
        }
 
        public number Number
        {
            get { return number; }
        }
 
        public Card(Mast Mast, number number)
        {
            this.Mast = Mast;
            this.number = number;
        }
 
        public string realwhide()
        {
            return numberdictionary[number] + mastdictionary[Mast];
        }
    }
 
    class Deck
    {
        static Random n = new Random();
        private Card[] kalod = new Card[36];
        public Deck()
        {
            for (Mast mast = Mast.Piki; mast <= Mast.Chervi; mast++)
            {
                for (number number = number.Six; number <= number.Tus; number++)
                {
                    kalod[((int)mast) * 9 + (int)number] = new Card(mast, number);
                }
            }
        }
        public void shuffle() //перемешиваем колоду
        {
 
            for (int i = 0; i < 1000; i++)
            {
                int k = n.Next(0, 35);
                int k1 = n.Next(0, 35);
                Card d;
                d = kalod[k];
                kalod[k] = kalod[k1];
                kalod[k1] = d;
            }
        }
        public Card[] F //Получаем карты после перемешивание
        {
            get { return kalod; }
        }
    }
 
    class Game
    {
        Deck k = new Deck();
        List<Card> kl1 = new List<Card>();
        List<Card> kl2 = new List<Card>();
        public void getcards() //Разделяем колоду на 2 части
        {
            k.shuffle();
            for (int i = 0; i < 18; i++)
            {
                kl1.Add(k.F[i]);
                kl2.Add(k.F[35 - i]);
            }
        }
 
        public void game()
        {
            int w = 0; // кто забирает
            int n = 0; // карта для хода
            int steps = 0; // сколько ходов сделано
 
            Console.Clear();
            while (true)
            {
                Console.WriteLine(kl1.Count + " " + kl2.Count); // кол-во карт у обоих игрококв
                Console.WriteLine("----------------------------------------");
 
                // есть ли карты у первого
                if (kl1.Count <= n)
                {
                    Console.WriteLine("Первый проиграл - у него нет больше карт");
                    Console.WriteLine("Всего ходов" + steps);
                    break;
                }
                // есть ли карты у второго
                if (kl2.Count <= n)
                {
                    Console.WriteLine("Второй проиграл - у него нет больше карт");
                    Console.WriteLine("Всего ходов" + steps);
                    break;
                }
                
                
                // если есть у обоих
                Console.WriteLine(kl1[n].realwhide() + " vs " + kl2[n].realwhide());
                
                
                // первый забирает
                if (kl1[n].Number > kl2[n].Number)
                {
                    Console.WriteLine("первый забирает");
                    w = 1;
                    steps++;
                    n++;
                }
                else
                {
                    // второй забирает
                    if (kl1[n].Number < kl2[n].Number)
                    {
                        Console.WriteLine("второй забирает");
                        w = 2;
                        steps++;
                        n++;
                    }
                    else
                    {
                        // война !!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        Console.WriteLine("Война!");
                        Console.WriteLine("По одной карте рубашкой вверх от игрока");
                        w = 0;
                        n += 2;
                    }
                }
                if (w == 1) // Удаляем карты у второго и добавляем первому
                {
                    for (int i = 0; i < n; i++)
                    {
                        kl1.Add(kl1[0]);
                        kl1.Add(kl2[0]);
                        kl1.RemoveAt(0);
                        kl2.RemoveAt(0);
                    }
                    n = 0;
                }
                else if (w == 2) // Удаляем карты у первого и добавляем второму
                {
                    for (int i = 0; i < n; i++)
                    {
                        kl2.Add(kl1[0]);
                        kl2.Add(kl2[0]);
                        kl1.RemoveAt(0);
                        kl2.RemoveAt(0);
                    }
                    n = 0;
                }
                Console.WriteLine("Нажмите любую клавишу для продолжения");
                Console.ReadKey();
            }
            // чтобы не терялся ответ
            Console.ReadKey();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Game a = new Game();
            a.getcards();
            a.game();
 
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2019, 14:54
Ответы с готовыми решениями:

C# OSM rendering (отрисовка карт OpenStreetMap)
Доброго времени суток. Прошу отозватся тех, кто сталкивался с отрисовкой карт OpenStreetMap. Интересует любая информация, а так же: ...

Отрисовка карт в реализации игры покер
Ребят, программированием занимаюсь недавно, начал делать упрощенный покер, составляю карты с помощью перечислителя и возник вопрос как...

Программа подсчёта суммы карт в игре «21»
Программа приветствует пользователя и спрашивает, сколько у него на руках карт. Пользователь вводит целое число. Преобразуем это число...

23
WPF Разработчик
 Аватар для sttrox
463 / 167 / 42
Регистрация: 20.02.2018
Сообщений: 285
20.11.2019, 07:35
Студворк — интернет-сервис помощи студентам
Элд Хасп, Вы немного не правильно меня поняли.
DP облегчены, в том смысле, что их инициализация происходит один раз для всех одинаковых контролов в статическом конструкторе. При регистрации мы задаём значение и "забываем".
Теперь представим картину, нам на View надо вывести 10 000 кнопок, простая сетка 100x100.
Если бы кнопка имела простое свойство, то пришлось бы инициализировать его 100 000 раз одним и тем же значением. У кнопки их чуть больше 100 и тогда нам надо присвоить по умолчанию 10 000 000 свойств. Это не мало. А поскольку у нас DP являются "облегченными", то мы в место 10миллионов, инициализирует только 100, и то, некоторые уже будут проинициализированы в других контролах, за счёт наследования и интциализи́рованы будут новые dp и переопределёнгые, которые находятся в статическом конструкторе.
Мы ведь зачастую не используем свойство Tag, по этому его не надо заполнять постоянно пустотой, это произойдёт один раз, при первом вызове.
Мы выйграл в памяти и немного во времени, за счёт "общего" хранилища данных о свойствах для каждого контрола. Но потеряли производительность. Но это однозначно победа, поскольку одна кнопка может состоять из 10 компонентов, и иные контролы могут содержать по 10 компонентов для их отображения. На форме из может быть и 100 и больше, в конечном итоге выходит, что надо проинициализировать от 100 миллионов значений. Если брать за размер одного значения свойства 4 Байт, то размер V, будет около 400 МБайт. А так нам надо проинициализировать только уникальные свойства. Которых может наберётся 10 000, может меньше. Это ~ 40КБайт
Вот по этому они "облегченные".
Могу показать на коде для большей наглядности
1
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,110
Записей в блоге: 243
20.11.2019, 12:03
Цитата Сообщение от Элд Хасп Посмотреть сообщение
на мой взгляд, в данном случае это избыточно.
Если есть готовые изображения, то вполне достаточно Image.
А если нет готовых изображений, то OpenGL? Я тоже нашёл готовые изображения. Я нарисовать два прямоугольника, используя два треугольника, и натянул на них текстуру изображения найденных карт. Надо делать так, кому как удобнее. Мне удобнее на OpenGL, потому что я с ним хорошо освоился и ищу возможности, как его можно применять, чтобы ещё больше потренироваться. Можно сконструировать 3D стол в Blender и импортировать в программу через .dae, поставить светильник на стол и сделать анимации и эффекты на шейдерах.
1
WPF Разработчик
 Аватар для sttrox
463 / 167 / 42
Регистрация: 20.02.2018
Сообщений: 285
20.11.2019, 12:26
8Observer8, Как понимаю OpenGL это серьёзная библиотека для отрисовки графики? Попробуйте реализовать простенький графический фреймворк. По типу LiveChart. Он довольно медленный по этому хотелось бы как-то ускорить.
В реализации помогу
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,110
Записей в блоге: 243
20.11.2019, 13:29
Цитата Сообщение от sttrox Посмотреть сообщение
Как понимаю OpenGL это серьёзная библиотека для отрисовки графики?
OpenGL - это спецификация (или API) для взаимодействия с графической картой. На графической карте есть процессор (GPU - Graphics Processor Unit), а так же на графической карте есть оперативная память. Суть в том, что можно один раз загрузить данные (координаты вершин треугольников, текстуры и т.д.) в оперативную память графической карты, а графический процессор имеет максимально быстрое время доступа к этой памяти. Для программирования графики используется специальный упрощённый язык GLSL (OpenGL Shader Language), который оптимизирован для работы с тригонометрией и линейной алгеброй. Можете подробнее почитать, что такое шейдерный OpenGL здесь: https://opentk.net/learn/chapter1/0-opengl.html

Цитата Сообщение от sttrox Посмотреть сообщение
Попробуйте реализовать простенький графический фреймворк. По типу LiveChart.
Я фреймворкой никогда не писал, на исключением игровых движков в 2D и 3D с мультиплеером, которые я в данный момент изучаю как писать. Сейчас я разбираюсь, как делать KeyFrame анимациии и скелетные анимации в Blender 2.8 и как их импортировать в OpenGL. OpenGL - это очень простой API, который не требует написания библиотек и фреймворков. Его можно использовать напрямую. Но можно обернуть в классы для удобства. Да, получится, что-то типа маленькой библиотеки. Математические графики я только начал рисовать. Разобрался, как текст выводить, для подписей. Нужно же числа, писать, обозначит, что по X, что по Y, подписать оси графика, написать название графика, ещё какую-то дополнительную информацию написать, например выводить координаты рядом с курсором при наведении на какую-то точку графика. Можно в 3D выводить поверхности с координатными осями. Я вывожу текст разных шрифтов следующим образом. Есть бесплатная программа BMFont. Она умеет преобразовывать любой .ttf (TrueType) шрифт в два файла: текстура с буквами и файл XML с текстурными координатами и другими данными необходимыми для корректного расставленния букв в предложении (расстояние между буквами, высота/ширина, позиция буквы по высоте и т.д.) Очень рекомендую для этот пример, он на Java/OpenGL, но легко переводится на C#/OpenGL: OpenGL 3D Game Tutorial 32: Font Rendering

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.11.2019, 13:29

Раздача карт при игре в дурака
Всем привет, помогите написать программу раздачи карт при игре в дурака (количество игроков задается с клавиатуры)

Вероятность получения игроками карт при игре в бридж
Привет всем! Помогите, пожалуйста, решить задачу по теории вероятности... СПАСИБО БОЛЬШОЕ!!!!!!)))) При игре в бридж между...

Раздача карт при игре в дурака, количество игроков задается с клавиатуры
Здравствуйте помогите чайнику написать программу: раздачи карт при игре в дурака, количество игроков задается с клавиатуры.Заранее спасибо!

Программа раздачи карт при игре в дурака (количество игроков задается с клавиатуры)
помогите написать программу раздачи карт при игре в дурака (количество игроков задается с клавиатуры)

Сколькими способами можно из колоды игральных карт (36 карт) раздать двум игрокам по шесть карт?
Задача на комбинаторику с подвохом Сколькими способами можно из колоды игральных карт (36 карт) раздать двум игрокам по шесть карт...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru