Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/56: Рейтинг темы: голосов - 56, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 08.07.2016
Сообщений: 40

Перекод кода игры Покер с С++ на C#

08.07.2016, 18:39. Показов 11808. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я разрабатываю (громко сказано) свою карточную игру покер. В интернете нашёл код этой игры на С++ для консоли. Помогите пожалуйста перевести его на C#. С уважением. Код поделён на два поста, так как слишком большой.

Часть 1.

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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
string suits[4];
string ranks[13];
 
class Card {
public:
    int suit;
    int rank;
};
 
int compareCards(const void *card1, const void *card2) {
    return (*(Card *)card1).rank - (*(Card *)card2).rank;
}
 
class Deck {
public:
    Deck() {
        for (int i = 0;i<4;i++) {
            for (int j = 0;j<13;j++) {
                cards[i * 13 + j].suit = i;
                cards[i * 13 + j].rank = j;
            }
        }
        suits[0] = "D";
        suits[1] = "S";
        suits[2] = "H";
        suits[3] = "C";
        ranks[0] = "2";
        ranks[1] = "3";
        ranks[2] = "4";
        ranks[3] = "5";
        ranks[4] = "6";
        ranks[5] = "7";
        ranks[6] = "8";
        ranks[7] = "9";
        ranks[8] = "T";
        ranks[9] = "J";
        ranks[10] = "Q";
        ranks[11] = "K";
        ranks[12] = "A";
    }
 
    void print() {
        cout << "Printing the deck..." << endl;
        for (int i = 0;i<52;i++)
            cout << ranks[cards[i].rank] << suits[cards[i].suit] << endl;
        cout << endl;
    }
 
    void shuffle() {
        top = 51;
        int x;
        Card tempCard;
        for (int i = 0;i<4;i++) {
            for (int j = 0;j<13;j++) {
                cards[i * 13 + j].suit = i;
                cards[i * 13 + j].rank = j;
            }
        }
        cout << "Shuffling the cards and dealing..." << endl << endl;
        for (int i = 0;i<52;i++) {
            x = rand() % 52;
            tempCard = cards[i];
            cards[i] = cards[x];
            cards[x] = tempCard;
        }
    }
 
    Card hitme() {
        top--;
        return cards[top + 1];
    }
 
private:
    int top;
    Card cards[52];
};
 
class Player {
public:
    string name;
    int money;
    Card cards[2];
    int playing;
    int round;
    int goodToGo;
};
 
class PokerGame {
public:
    void start(string name) {
        for (int i = 0;i < 6; i++) {
            players[i].money = 1000;
            players[i].playing = 1;
        }
        players[0].name = "Carlos";
        players[1].name = "Carla";
        players[2].name = "Nick";
        players[3].name = "Lisa";
        players[4].name = name;
        players[5].name = "Soarez";
        startGame();
    }
 
 
    void deal() {
        for (int i = 0;i<6;i++) {
            for (int j = 0;j<2;j++) {
                if (players[i].playing) {
                    players[i].cards[j] = deck1.hitme();
                }
            }
        }
        for (int i = 0;i<5;i++)
            tableCards[i].rank = -1;
    }
 
    void flop() {
        for (int i = 0;i<3;i++)
            tableCards[i] = deck1.hitme();
    }
 
    void turn() {
        tableCards[3] = deck1.hitme();
    }
 
    void river() {
        tableCards[4] = deck1.hitme();
    }
 
    void printTable() {
        cout << "  " << ((players[0].playing) ? (players[0].name) : "      ") << "         " << ((players[1].playing) ? (players[1].name) : "     ") << "           "
            << ((players[2].playing) ? (players[2].name) : "    ") << endl;
        cout << "   $" << setw(4) << ((players[0].playing) ? (players[0].money) : 0) << "         $" << setw(4) << ((players[1].playing) ? (players[1].money) : 0)
            << "           $" << setw(4) << ((players[2].playing) ? (players[2].money) : 0) << endl;
        cout << "     _____________________________" << endl;
        cout << "    / " << ((bind == 0) ? "@" : " ") << "            " << ((bind == 1) ? "@" : " ") << "            " << ((bind == 2) ? "@" : " ") << " " << endl;
        cout << "   /  ___   ___   ___   ___   ___  " << endl;
        cout << "   | | " << ((tableCards[0].rank) >= 0 ? ranks[tableCards[0].rank] : " ") << " | | " << ((tableCards[1].rank) >= 0 ? ranks[tableCards[1].rank] : " ") << " | | " << ((tableCards[2].rank) >= 0 ? ranks[tableCards[2].rank] : " ") << " | | "
            << ((tableCards[3].rank) >= 0 ? ranks[tableCards[3].rank] : " ") << " | | " << ((tableCards[4].rank) >= 0 ? ranks[tableCards[4].rank] : " ") << " | |" << endl;
        cout << "   | | " << ((tableCards[0].rank) >= 0 ? suits[tableCards[0].suit] : " ") << " | | " << ((tableCards[1].rank) >= 0 ? suits[tableCards[1].suit] : " ") << " | | " << ((tableCards[2].rank) >= 0 ? suits[tableCards[2].suit] : " ") << " | | "
            << ((tableCards[3].rank) >= 0 ? suits[tableCards[3].suit] : " ") << " | | " << ((tableCards[4].rank) >= 0 ? suits[tableCards[4].suit] : " ") << " | |" << endl;
        cout << "   | |___| |___| |___| |___| |___| |" << endl;
        cout << "   |                               |" << endl;
        cout << "   |          Pot = $" << setw(4) << pot << "         |" << endl;
        cout << "   \\                               /" << endl;
        cout << "    \\_" << ((bind == 5) ? "@" : "_") << "_____________" << ((bind == 4) ? "@" : "_") << "___________" << ((bind == 3) ? "@" : "_") << "_/" << endl;
        cout << endl;
        cout << "  " << ((players[5].playing) ? (players[5].name) : "      ") << "          " << ((players[4].playing) ? (players[4].name) : "      ") << "         "
            << ((players[3].playing) ? (players[3].name) : "    ") << endl;
        cout << "   $" << setw(4) << ((players[5].playing) ? (players[5].money) : 0) << "          $" << setw(4) << ((players[4].playing) ? (players[4].money) : 0)
            << "         $" << setw(4) << ((players[3].playing) ? (players[3].money) : 0) << endl;
        cout << endl;
        if (players[4].round) {
            cout << "   Your hand:" << endl;
            cout << "    ___    ___" << endl;
            cout << "   | " << ranks[players[4].cards[0].rank] << " |  | " << ranks[players[4].cards[1].rank] << " |" << endl;
            cout << "   | " << suits[players[4].cards[0].suit] << " |  | " << suits[players[4].cards[1].suit] << " |" << endl;
            cout << "   |___|  |___|" << endl << endl;
        }
    }
 
private:
    Player players[6];
    Deck deck1;
    int bind;
    Card tableCards[5];
    int pot, action, bet, rational, betOn, winner, maxPoints, roundWinner;
    int handPoints[6];
    int bestHand[6][3];
 
    int playersLeft() {
        int count = 0;
        for (int i = 0; i < 6; i++)
            if (players[i].money>0)
                count++;
        return count;
    }
 
    int computerAction(int playerNum) {
        if (players[playerNum].cards[0].rank < 8 && players[playerNum].cards[1].rank < 8) {
            if (players[playerNum].cards[0].rank != players[playerNum].cards[1].rank)
                return 0;
            else
                return 1;
        }
 
        else if (players[playerNum].cards[0].rank < 10 && players[playerNum].cards[1].rank < 10) {
            if (players[playerNum].cards[0].rank != players[playerNum].cards[1].rank)
                return 1;
            else
                return 2;
        }
        else {
            return 2;
        }
    }
 
    /*checks if someone still got bet/call*/
    int playersToBet() {
        for (int i = 0;i<6;i++)
            if (players[i].round == 1 && players[i].goodToGo == 0)
                return 1;
 
        return 0;
    }
 
    void takeBets() {
        betOn = 0;
        for (int k = 0;k<6;k++)
            players[k].goodToGo = 0;
 
        for (int k = bind + 1;k<bind + 7;k++) {
            /* human player actions */
            if (k % 6 == 4 && players[4].round) {
                if (betOn) {
                    cout << "Your action: (1) FLOP (3) BET/CALL ";
                    cin >> action;
                    while (action != 1 && action != 3) {
                        cout << "Invalid number pressed." << endl;
                        cout << "Your action: (1) FLOP (3) BET/CALL ";
                        cin >> action;
                    }
                }
                else {
                    cout << "Your action: (1) FLOP (2) CHECK (3) BET/CALL ";
                    cin >> action;
                    while (action<1 || action>3) {
                        cout << "Invalid number pressed." << endl;
                        cout << "Your action: (1) FLOP (2) CHECK (3) BET/CALL ";
                        cin >> action;
                    }
                }
                cout << endl;
                if (action == 1)
                    players[4].round = 0;
                else if (action == 2)
                    continue;
                else {
                    if (betOn) {
                        pot += betOn;
                        players[4].money -= betOn;
                        players[4].goodToGo = 1;
                    }
                    else {
                        cout << "How much do you want to bet: ";
                        cin >> bet;
                        while (bet>players[4].money || bet<1) {
                            cout << "Invalid number to bet." << endl;
                            cout << "How much do you want to bet: ";
                            cin >> bet;
                            cout << endl << endl;
                        }
                        pot += bet;
                        players[4].money -= bet;
                        betOn = bet;
                        players[4].goodToGo = 1;
                    }
                }
            }
 
// РАЗДЕЛЕНИЕ
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.07.2016, 18:39
Ответы с готовыми решениями:

Моделирование игры в покер
Недавно начал изучать С++,использую книгу Харви М. Детела Как программировать на С++.В конце одной из глав есть упражнение,в котором нужно...

Реализация покер игры
Всем привет! Хочу сделать консольную мини-игру &quot;покер&quot;. Начало игры (тасовка колоды, раздача карт игрокам) примерно знаю как сделать,...

ИИ для игры в покер
Здравствуйте. Подскажите, насколько реально и сложно написать ИИ бота для игры в покер, имеется в ввиду простейшее приложение где человек...

47
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
23.07.2016, 20:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Native15 Посмотреть сообщение
Deck.cs
Поправьте цикл.
Первый цикл до 4, второй до 13.

Цитата Сообщение от Native15 Посмотреть сообщение
Так я знаю сколько итераций будет. Зачем мне их считать?
Если знаете, то посчитайте: если переменная a = 12, b = 3. Какой будет номер элемента массива cards[a * 13 + b]?
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
23.07.2016, 20:31
Цитата Сообщение от irises Посмотреть сообщение
Если знаете, то посчитайте что будет если переменная a = 12, b = 3: cards[a * 13 + b]. Чему равен элемент массива cards?
А, ну да это я ошибся.
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
23.07.2016, 20:32
Цитата Сообщение от Native15 Посмотреть сообщение
А, ну да это я ошибся.
Вот и здесь появляется ошибка.
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
23.07.2016, 20:39
Только теперь я вообще запутался. У меня не класс Deck вообще не работает. Или работает, только я не знаю, как это проверить. Как вывести все значения на консоль?

Добавлено через 2 минуты
Я не понимаю, как вы присваиваете значения в цикле класса Deck, если в конце просто указываете new Card;. Когда у автора там стоят значения переменных цикла i и j.

Добавлено через 3 минуты
У меня вот это так выглядит пока. Ошибок нет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    class Deck
    {
        public Card[] cards;
 
        public Deck()
        {
            cards = new Card[52];
 
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = a;
                    cards[b * 13 + a].Suit = b;
                }
            }
        }
    }
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
23.07.2016, 20:45
Цитата Сообщение от Native15 Посмотреть сообщение
Я не понимаю, как вы присваиваете значения в цикле класса Deck, если в конце просто указываете new Card
Вы создали класс Deck. Этот клас содержит в себе массив из Card. Чтоб правильно выделять память нужно сначала выделить память под массив.
C#
1
public Card[] cards = new Card[52];
Потом когда Вы начинаете добавлять данные, нужно выделять память под отдельный обьект массива и лишь потом записывать ети данные.
C#
1
cards[a * 13 + b] = new Card();
Цитата Сообщение от Native15 Посмотреть сообщение
у автора там стоят значения переменных цикла i и j.
У автора переменные i и j, а у Вас a и b.

Добавлено через 1 минуту
Цитата Сообщение от Native15 Посмотреть сообщение
Только теперь я вообще запутался. У меня не класс Deck вообще не работает. Или работает, только я не знаю, как это проверить. Как вывести все значения на консоль?
Клас работает, просто поле cards - приватное, поетому Вы не можете доступится до него.

Чтоб вывести на екран создайте метод, который выводит данные и вызовите его в Main.
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
23.07.2016, 21:00
В общем у меня ничего не получилось. Пойду учиться дальше.
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
23.07.2016, 21:04
Цитата Сообщение от Native15 Посмотреть сообщение
В общем у меня ничего не получилось.
Вы уже близко. Попробуйте вот так:
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
class Deck
    {
        private Card[] cards;
        public Deck()
        {
            cards = new Card[52];
            for (int a = 0; a < 4; a++)
            {
                for (int b = 0; b < 13; b++)
                {
                    cards[a * 13 + b] = new Card();
                    cards[a * 13 + b].Rank = a;
                    cards[a * 13 + b].Suit = b;
                }
            }
        }
 
        public void PrintCards()
        {
            for (int i = 0; i < 52; i++)
            {
                Console.WriteLine(cards[i].Rank + "  " + cards[i].Suit);
            }
        }
    }
Я добавила метод PrintCards(), который выведет все карты.

В Main:
C#
1
2
Deck d = new Deck();
d.PrintCards();
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
23.07.2016, 21:06
Спасибо конечно, но у меня проблемы на базовом уровне. Я банально не знаю, как сделать метод. Я лучше пойду почитаю ещё
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
23.07.2016, 21:07
Deck - это большая коробка с картами.
Card - это отдельная карта.
У каждой карты есть поля Rank и Suit.
Когда мы проходимся по массиве карт в конструкторе - мы сначала говорим что в этом месте у меня будет карта (выделяем память), а потом что то в нее записываем.
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
23.07.2016, 21:10
irises, да я уже попробовал Ваш код. Он сработал. Дальше по плану перемешивание колоды и задать значение цифрам Suit и Rank буквы, где это необходимо, но, думаю, я с этим справлюсь.
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
23.07.2016, 21:11
Цитата Сообщение от Native15 Посмотреть сообщение
как сделать метод
Внутри класса описываем "функцию". Почему в кавичках? Метод эта та же функция, которая описывается внутри класса, но работает только вместе в классом (обьектом).
Тоесть нужно создать обьект класса:
C#
1
Deck d = new Deck();
и чтоб вызвать метод PrintCards, нужно указать имя обьекта:
C#
1
d.PrintCards();
Вам нужно почитать о ООП.
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
24.07.2016, 17:52
В общем я сейчас ухожу по делам своим. Оставлю тут всё, что я смог сделать. Может быть, кто-нибудь, да поможет

Класс Program
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Program
    {
        static void Main()
        {
 
 
            Console.ReadKey();
        }
    }
}


Класс Card
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    public class Card
    {
        public int Rank;
        public int Suit;
    }
}


Класс Deck
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Deck
    {
        string[] ranks = new string[13];
        string[] suits = new string[4];
 
        public Card[] cards = new Card[52];
 
        public Deck()
        {
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = a;
                    cards[b * 13 + a].Suit = b;
                }
            }
            ranks[0] = "2";
            ranks[1] = "3";
            ranks[2] = "4";
            ranks[3] = "5";
            ranks[4] = "6";
            ranks[5] = "7";
            ranks[6] = "8";
            ranks[7] = "9";
            ranks[8] = "10";
            ranks[9] = "J";
            ranks[10] = "Q";
            ranks[11] = "K";
            ranks[12] = "A";
            suits[0] = "c";
            suits[1] = "h";
            suits[2] = "s";
            suits[3] = "d";
        }
 
        public void ShuffleDeck()
        {
            top = 51;
            int x;
            Card tempcard;
 
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = a;
                    cards[b * 13 + a].Suit = b;
                }
            }
 
            for (int a = 0; a < 52; a++)
            {
                Random rand = new Random();
                x = rand.Next(1, 100) % 52;
                tempcard = cards[a];
                cards[a] = cards[x];
                cards[x] = tempcard;
            }
        }
 
        public Card hitme()
        {
            top--;
            return cards[top + 1];
        }
 
        private int top;
    }
}


Класс Player
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Player
    {
        public Card[] cards = new Card[2];
        public string name;
        public int money;
        public int playing;
        public int round;
        public int goodToGo;
    }
}


Класс PokerGame
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class PokerGame
    {
        Player[] players = new Player[6];
        Card[] tableCards = new Card[5];
        Deck deck1;
 
        int bind;
        int pot, action, bet, rational, betOn, winner, maxPoints, roundWinner;
        int[] handPoints = new int[6];
        int[][] bestHand = new int[6][];
 
        int playersLeft()
        {
            int count = 0;
            for (int a = 0; a < 6; a++)
                if ([a].money > 0) count++;
            return count;
        }
 
        void deal()
        {
            for (int a = 0; a < 6; a++)
            {
                for (int b = 0; b < 2; b++)
                {
                    if (players[a].playing) //Не удаётся неявно преобразовать int в bool
                    {
                        players[a].cards[b] = deck1.hitme();
                    }
                }
            }
            for (int i = 0; i < 5; i++)
                tableCards[i].rank = -1; //Card не содержит определения для rank
        }
 
        public void Start(string name)
        {
            for (int a = 0; a < 6; a++)
            {
                players[a].money = 1000;
                players[a].playing = 1;
            }
            players[0].name = "Carlos";
            players[1].name = "Carla";
            players[2].name = "Nick";
            players[3].name = "Lisa";
            players[4].name = name;
            players[5].name = "Soarez";
            startGame(); // Нужно для чего-то в дальнейшем.
        }
    }
}


Добавлено через 5 часов 24 минуты
Так значит. Общими усилиями я сделал колоду карт и смог её всю вывести на консоль. Как мне теперь её перемешать и также вывести на консоль?

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Deck
    {
        string[] ranks = new string[13];
        string[] suits = new string[4];
 
        public Card[] cards = new Card[52];
 
        public Deck()
        {
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = a;
                    cards[b * 13 + a].Suit = b;
                }
            }
            ranks[0] = "2";
            ranks[1] = "3";
            ranks[2] = "4";
            ranks[3] = "5";
            ranks[4] = "6";
            ranks[5] = "7";
            ranks[6] = "8";
            ranks[7] = "9";
            ranks[8] = "10";
            ranks[9] = "J";
            ranks[10] = "Q";
            ranks[11] = "K";
            ranks[12] = "A";
            suits[0] = "c";
            suits[1] = "h";
            suits[2] = "s";
            suits[3] = "d";
        }
 
        public void ShuffleDeck() // Тут должно быть перемешивание колоды, только оно не работает.
        {
            int x;
            Card tempcard;
 
            for (int a = 0; a < 52; a++)
            {
                Random rand = new Random();
                x = rand.Next(1, 100) % 52;
                tempcard = cards[a];
                cards[a] = cards[x];
                cards[x] = tempcard;
             }
        }
 
        public void PrintCards()
        {
            for (int a = 0; a < 52; a++)
            {
                Console.Write(ranks[cards[a].Rank] + suits[cards[a].Suit] + " ");
            }
        }
    }
}
Добавлено через 39 секунд
В main добавляем:

C#
1
2
3
4
5
6
7
        static void Main()
        {
            Deck d = new Deck();
            d.PrintCards();
 
            Console.ReadKey();
        }
Добавлено через 2 часа 29 минут
Вроде бы мне кажется всё нормально, но не могу вывести на консоль перемешанный массив. Я запутался.

Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Deck
    {
        string[] ranks = new string[13];
        string[] suits = new string[4];
 
        public Card[] cards = new Card[52];
 
        public Deck()
        {
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = a;
                    cards[b * 13 + a].Suit = b;
                }
            }
            ranks[0] = "2";
            ranks[1] = "3";
            ranks[2] = "4";
            ranks[3] = "5";
            ranks[4] = "6";
            ranks[5] = "7";
            ranks[6] = "8";
            ranks[7] = "9";
            ranks[8] = "10";
            ranks[9] = "J";
            ranks[10] = "Q";
            ranks[11] = "K";
            ranks[12] = "A";
            suits[0] = "c";
            suits[1] = "h";
            suits[2] = "s";
            suits[3] = "d";
        }
 
        public void ShuffleDeck() // Тут должно быть перемешивание колоды, только оно не работает.
        {
            int x;
            Card tempcard;
            Random rand = new Random();
 
            for (int a = 0; a < 1000; a++)
            {
                for (int b = 0; b < 52; b++)
                {
                    x = rand.Next(13);
                    tempcard = cards[a];
                    cards[a] = cards[x];
                    cards[x] = tempcard;
                }
            }
 
        }
 
        public void PrintCards()
        {
            for (int a = 0; a < 52; a++)
            {
                Console.Write(ranks[cards[a].Rank] + suits[cards[a].Suit] + " ");
            }
        }
    }
}


Добавлено через 11 минут
Да, я уже читаю Игра "Покер": как сгенерировать неповторяющиеся случайные числа

Добавлено через 3 минуты
Но, если честно, то мне нужно больше для самообучения, чем для прогресса создания игры. Поэтому жду ваших отзывов о том, что у меня в коде не так.

Добавлено через 13 минут
https://blogs.msdn.microsoft.c... 05/08/o-x/
А как установить XNA на VS2015?

Добавлено через 14 минут
Нашёл на GitHub пару готовых покер проектов. Отличное подспорье для обучения
https://github.com/NikolayIT/TexasHoldemGameEngine
https://github.com/ccqi/TexasHoldem
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
24.07.2016, 23:32
Цитата Сообщение от Native15 Посмотреть сообщение
Как мне теперь её перемешать и также вывести на консоль?
Перенесите
C#
1
Random rand = new Random();
поставьте перед циклом (и уберите цикл до 1000, он совсем не нужен)
Единственное чтоб поменяла - это генерирование числа, мне кажется лучше сразу генерировать число с определенного промежутка:
C#
1
x = rand.Next(0, 52);
Добавлено через 6 минут
Вместо етого:
Цитата Сообщение от Native15 Посмотреть сообщение
string[] ranks = new string[13];
string[] suits = new string[4];
и вместо етого
Цитата Сообщение от Native15 Посмотреть сообщение
ranks[0] = "2";
ranks[1] = "3";
ranks[2] = "4";
ranks[3] = "5";
ranks[4] = "6";
ranks[5] = "7";
ranks[6] = "8";
ranks[7] = "9";
ranks[8] = "10";
ranks[9] = "J";
ranks[10] = "Q";
ranks[11] = "K";
ranks[12] = "A";
suits[0] = "c";
suits[1] = "h";
suits[2] = "s";
suits[3] = "d";
можно записать так:
C#
1
2
string[] ranks = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
string[] suits = {"c", "h", "s", "d"};
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
25.07.2016, 10:41
Ура! Заработало! Я смог сделать чтобы колода перемешивалась! Спасибо irises!

В мейн:
C#
1
2
3
4
5
6
7
8
        static void Main()
        {
            Deck d = new Deck();
            d.ShuffleDeck();
            d.PrintCards();
 
            Console.ReadKey();
        }
В Deck:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Deck
    {
        string[] ranks = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
        string[] suits = { "c", "h", "s", "d" };
        public Card[] cards = new Card[52];
 
        public Deck()
        {
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = a;
                    cards[b * 13 + a].Suit = b;
                }
            }
        }
 
        public void ShuffleDeck() // Тут должно быть перемешивание колоды, только оно не работает.
        {
            int b;
            Card tempcard;
            Random rand = new Random();
            {
                for (int a = 0; a < 52; a++)
                {
                    b = rand.Next(13);
                    tempcard = cards[a];
                    cards[a] = cards[b];
                    cards[b] = tempcard;
                }
            }
        }
 
        public void PrintCards()
        {
            for (int a = 0; a < 52; a++)
            {
                Console.Write(ranks[cards[a].Rank] + suits[cards[a].Suit] + " ");
            }
        }
    }
}


Добавлено через 2 минуты
В оригинале на С++ в самом начале стоит вот это:
C++
1
2
int compareCards(const void *card1, const void *card2){
    return (*(Card *)card1).rank - (*(Card *)card2).rank;
Скажите пожалуйста, что это? Ну, и как это записать в C#, если можно.

Добавлено через 4 минуты
И ещё. Перед циклом перемешивания я создал переменную int b. Если я её удалю и создам непосредственно в цикле, то это как-нибудь хуже или лучше? Что изменилось?

Добавлено через 28 минут
И я не понимаю, как переменные ranks и suits заменяют значения Rank и Suit. То есть буквы цифрами.

Добавлено через 43 минуты
Как я понял, то один и тот же индекс в cards - это число от 0 до 51? А ranks и suits для выявления ранка и масти?

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
        public void PrintCards()
        {
            ShuffleDeck();
 
            Console.WriteLine("Борд: "
                + ranks[cards[46].Rank] + suits[cards[46].Suit] + " "
                + ranks[cards[47].Rank] + suits[cards[47].Suit] + " "
                + ranks[cards[48].Rank] + suits[cards[48].Suit] + " "
                + ranks[cards[49].Rank] + suits[cards[49].Suit] + " "
                + ranks[cards[50].Rank] + suits[cards[50].Suit] + " "
                );
 
            Console.WriteLine("Игрок 1: "
                + ranks[cards[0].Rank] + suits[cards[0].Suit] + " "
                + ranks[cards[1].Rank] + suits[cards[1].Suit] + " "
                );
 
            Console.WriteLine("Игрок 2: "
                + ranks[cards[2].Rank] + suits[cards[2].Suit] + " "
                + ranks[cards[3].Rank] + suits[cards[3].Suit] + " "
                );
 
            //for (int a = 0; a < 52; a++)
            //{
            //    Console.Write(ranks[cards[a].Rank] + suits[cards[a].Suit] + " ");
            //}
        }
Добавлено через 1 минуту
Можно ли как-нибудь сделать так, чтобы, например cards[0], обозначал и ранк и масть сразу, только при указании одного индекса, а не так как у меня сейчас?

Добавлено через 27 минут
Чувствую, что где-то ошибка в перемешивании колоды, но не знаю где.

Добавлено через 2 минуты
В общем такая закономерность наблюдается, что первые 5-7 чисел идут с буквой d, а букв c, практически никогда не бывает.

Добавлено через 7 минут
Попробовал вот так. Вроде бы нормально стало.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public void ShuffleDeck()
        {
            Random random = new Random();
            Card TempCard;
            int b;
            {
                for (int a = 0; a < 52; a++)
                {
                    b = random.Next(0, 52);
                    TempCard = cards[a];
                    cards[a] = cards[b];
                    cards[b] = TempCard;
                }
            }
        }
Добавлено через 1 час 44 минуты
Я пошёл дальше и создал класс CompareHands
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class CompareHands
    {
        public void RoyalFlush()
        {
 
        }
 
        public void StraightFlush()
        {
 
        }
 
        public void FourOfAKind()
        {
 
        }
 
        public void FullHouse()
        {
 
        }
 
        public void Flush()
        {
 
        }
 
        public void Straight()
        {
 
        }
 
        public void ThreeOfAKind()
        {
 
        }
 
        public void TwoPair()
        {
 
        }
 
        public void OnePair()
        {
 
        }
 
        public void HighCard()
        {
 
        }
    }
}

Теперь нужно заполнить все методы. Я даже не знаю с чего начать. Единственное, что могу сказать, что они все расположены по силе. От старшего к младшему. Начну с самого старшего RoyalFlush. Это значит, когда на БОРДЕ и у ИГРОКА есть комбинация из пяти карт одной масти по убыванию Ac,Kc,Qc,Jc,10c. И только в таком порядке. По сути это тот же самый StraightFlush, но я его специально выделил, так как RoyalFlush сильнее. Ещё момент, что нужна комбинация из пяти карт, когда в момент вскрытия будет семь карт. Нужно как-то вычислить пять подходящих, для RoyalFlush, карт. Если нет, то переходим к комбинации слабее и так далее до самой младшей. А сравнить силу руки между игроками можно сложив вместе пять, уже готовых карты, которые показывают общую руку для тот или иного игрока, значений ранков, и сравнить результаты между игроками. У кого число больше, тот и выиграл. Например у обоих игроков два флеша, но у одного игрока сумма ранков больше, чем у другого, значит он победил.

Добавлено через 2 минуты
Честно говоря, я не совсем понял структуру кода сравнений рук в оригинальном коде. Поэтому спрашиваю тут, как это всё можно организовать.

Добавлено через 9 минут
Ещё я создал класс Player. Мне нужно как-то добавить в PlayerHand значения из колоды карт [0] и [1].
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Player
    {
        public Card PlayerHand;
    }
}
Добавлено через 2 минуты
В общем вот весь код, чтобы было представление.

Program:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
 
    class Program
    {
        static void Main()
        {
 
            int a = 0;
 
            while(true)
            {
                Console.Clear();
                Deck d = new Deck();
                d.PrintCards();
 
                a++;
 
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Количество раздач: " + a);
 
                Console.ReadKey();
            }
        }
    }
}


Card:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    public class Card
    {
        public int Rank;
        public int Suit;
    }
}


Player:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Player
    {
        public Card PlayerHand;
    }
}


Deck:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class Deck
    {
        string[] ranks = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
        string[] suits = { "c", "h", "s", "d" };
 
        public Card[] cards = new Card[52];
 
        public Deck()
        {
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = a;
                    cards[b * 13 + a].Suit = b;
                }
            }
        }
 
        public void ShuffleDeck()
        {
            Random random = new Random();
            Card TempCard;
            int b;
            {
                for (int a = 0; a < 52; a++)
                {
                    b = random.Next(52);
                    TempCard = cards[a];
                    cards[a] = cards[b];
                    cards[b] = TempCard;
                }
            }
        }
 
        public void PrintCards()
        {
            ShuffleDeck();
 
            Console.WriteLine("Борд: "
                + ranks[cards[46].Rank] + suits[cards[46].Suit] + " "
                + ranks[cards[47].Rank] + suits[cards[47].Suit] + " "
                + ranks[cards[48].Rank] + suits[cards[48].Suit] + " "
                + ranks[cards[49].Rank] + suits[cards[49].Suit] + " "
                + ranks[cards[50].Rank] + suits[cards[50].Suit] + " "
                );
            
 
            Console.WriteLine("Игрок 1: "
                + ranks[cards[0].Rank] + suits[cards[0].Suit] + " "
                + ranks[cards[1].Rank] + suits[cards[1].Suit] + " "
                );
 
            Console.WriteLine("Игрок 2: "
                + ranks[cards[2].Rank] + suits[cards[2].Suit] + " "
                + ranks[cards[3].Rank] + suits[cards[3].Suit] + " "
                );
 
            Console.WriteLine();
 
            for (int a = 0; a < 52; a++)
            {
                Console.Write(ranks[cards[a].Rank] + suits[cards[a].Suit] + " ");
            }
 
            Player player1 = new Player();
        }
    }
}


CompareHands:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Poker
{
    class CompareHands
    {
 
        public void RoyalFlush()
        {
 
        }
 
        public void StraightFlush()
        {
 
        }
 
        public void FourOfAKind()
        {
 
        }
 
        public void FullHouse()
        {
 
        }
 
        public void Flush()
        {
 
        }
 
        public void Straight()
        {
 
        }
 
        public void ThreeOfAKind()
        {
 
        }
 
        public void TwoPair()
        {
 
        }
 
        public void OnePair()
        {
 
        }
 
        public void HighCard()
        {
 
        }
    }
}
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
25.07.2016, 12:00
Цитата Сообщение от Native15 Посмотреть сообщение
Перед циклом перемешивания я создал переменную int b. Если я её удалю и создам непосредственно в цикле, то это как-нибудь хуже или лучше?
Можно создавать непосредственно в цикле, ведь больше нигде она Вам не нужна.

Цитата Сообщение от Native15 Посмотреть сообщение
ranks и suits для выявления ранка и масти?
Верно, что чтоб у карты сразу была масть, нужно немного по другому: в классе Card вместо полей int сделайте поля string, и когда заполняйте массив карт сразу указывайте масть, тогда Вам не нужно еще два массива:
C#
1
2
string[] ranks = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
string[] suits = { "c", "h", "s", "d" };
Чтоб еще доработать этот класс, когда создать еще поле int, которое будет указывать на старшинство карты (от 1 до 13 включительно) (например у карты "2" старшинство 1, а у карты "А" старшинство 13 - значит карта "А" сильнее). Таким образом можна очень просто сравнивать карты.

C#
1
2
3
int compareCards(const void *card1, const void *card2) {
    return (*(Card *)card1).rank - (*(Card *)card2).rank;
}
Это метод который позволяет сортировать карты в руках. На руках в игрока есть массив карт. Нужно их отсортировать. Но как? У класса Card есть 2 поля. По какому полю сортировать? И вот в игру вступает этот метод. Он указывает, что нужно сортировать по полю rank.
Чтоб это сделать в C# нужно класс Card унаследовать от интерфейса IComparable и переопределить метод CompareTo.
Тогда чтоб отсортировать массив карт на руках можно воспользоватся статическим методом Array.Sort(cardsOnTheHands), где cardsOnTheHands - массив карт на руках.
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
25.07.2016, 14:53
irises, спасибо. Я не совсем понял, как сделать лучше создание колоды, она, как по мне, и так хороша. Я попробую сделать самостоятельно выявление старшей карты у обоих игроков. Когда сделаю покажу сюда.

Добавлено через 15 минут
У меня возникли небольшие трудности. Попробую описать алгоритм на словах.

1. Создаём переменные Player1Hand и Player2Hand, в которые входят значения массива с индексами, для игрока 1 индексы 0, 1, 46, 47, 48, 49, 50, а для игрока 2 - 2, 3, 46, 47, 48, 49, 50.
2. Теперь сортируем массивы по старшинству (Rank) для каждого из игроков.
3. Выбираем пять первых индексов, в которых содержатся пять первых старших чисел из семи, и складываем их.
4. Суммы для каждого из игроков сравниваем между собой. У кого сумма больше, тот победил. А если равны, то ничья. Результаты записываем в переменные и выводим на консоль. Игрок 1 (Победы): , Игрок 1 (Поражения): , Игрок 1 (Ничьи):

Добавлено через 11 минут
Вот что у меня не так?
C#
1
2
3
4
5
6
7
8
9
            string[] Player1Hand;
            Player1Hand = { ranks[cards[0].Rank] + suits[cards[0].Suit],
                            ranks[cards[1].Rank] + suits[cards[1].Suit],
                            ranks[cards[46].Rank] + suits[cards[46].Suit],
                            ranks[cards[47].Rank] + suits[cards[47].Suit],
                            ranks[cards[48].Rank] + suits[cards[48].Suit],
                            ranks[cards[49].Rank] + suits[cards[49].Suit],
                            ranks[cards[50].Rank] + suits[cards[50].Suit]
                          };
Добавлено через 2 минуты
Мне нужно сделать массив из уже готовых значений.

Добавлено через 2 минуты
Так тоже не работает
C#
1
2
3
4
5
6
7
8
9
            int[,] Player1Hand;
            Player1Hand = { { ranks[cards[0].Rank] + suits[cards[0].Suit]},
                            { ranks[cards[1].Rank] + suits[cards[1].Suit]},
                            { ranks[cards[46].Rank] + suits[cards[46].Suit]},
                            { ranks[cards[47].Rank] + suits[cards[47].Suit]},
                            { ranks[cards[48].Rank] + suits[cards[48].Suit]},
                            { ranks[cards[49].Rank] + suits[cards[49].Suit]},
                            { ranks[cards[50].Rank] + suits[cards[50].Suit]}
                          };
Добавлено через 4 минуты
Вот, вроде, получилось:
C#
1
2
3
4
5
6
7
8
            string[] Player1Hand = new string[] { ranks[cards[0].Rank] + suits[cards[0].Suit],
                                                  ranks[cards[1].Rank] + suits[cards[1].Suit],
                                                  ranks[cards[46].Rank] + suits[cards[46].Suit],
                                                  ranks[cards[47].Rank] + suits[cards[47].Suit],
                                                  ranks[cards[48].Rank] + suits[cards[48].Suit],
                                                  ranks[cards[49].Rank] + suits[cards[49].Suit],
                                                  ranks[cards[50].Rank] + suits[cards[50].Suit]
                                                };
Добавлено через 1 минуту
Но при WriteLine не выводит значения массива, а пишет, что это String.

Добавлено через 14 минут
Есть тут кто-нибудь кроме irises, а то я начну создавать новые темы с моими вопросами и их будет очень много Просто хочу уложиться в рамки этой темы. Тут всё равно про покер всё. А я как раз пытаюсь перекодировать и учиться одновременно.

Добавлено через 52 минуты
Кажется разобрался
C#
1
int Player1Hand = cards[0].Rank + cards[1].Rank + cards[46].Rank + cards[47].Rank + cards[48].Rank + cards[49].Rank + cards[50].Rank;
Добавлено через 21 минуту
Я захотел сделать счётчик побед и поражений, но у меня он не идёт, а сбрасывается каждый раз. Не понимаю почему.

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
        public void PrintCards()
        {
            ShuffleDeck();
 
            int Player1Hand = cards[0].Rank
                + cards[1].Rank
                + cards[46].Rank
                + cards[47].Rank
                + cards[48].Rank
                + cards[49].Rank
                + cards[50].Rank;
 
            int Player2Hand = cards[2].Rank
                + cards[3].Rank
                + cards[46].Rank
                + cards[47].Rank
                + cards[48].Rank
                + cards[49].Rank
                + cards[50].Rank;
 
            Console.WriteLine("Борд: "
                + ranks[cards[46].Rank] + suits[cards[46].Suit] + " "
                + ranks[cards[47].Rank] + suits[cards[47].Suit] + " "
                + ranks[cards[48].Rank] + suits[cards[48].Suit] + " "
                + ranks[cards[49].Rank] + suits[cards[49].Suit] + " "
                + ranks[cards[50].Rank] + suits[cards[50].Suit] + " "
                );
 
 
            Console.WriteLine("Игрок 1: "
                + ranks[cards[0].Rank] + suits[cards[0].Suit] + " "
                + ranks[cards[1].Rank] + suits[cards[1].Suit] + " "
                );
 
            Console.WriteLine("Игрок 2: "
                + ranks[cards[2].Rank] + suits[cards[2].Suit] + " "
                + ranks[cards[3].Rank] + suits[cards[3].Suit] + " "
                );
 
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine(Player1Hand);
            Console.WriteLine();
            Console.WriteLine(Player2Hand);
            Console.WriteLine();
            Console.WriteLine();
 
            int P1Win = 0;
            int P1Draw = 0;
            int P1Lose = 0;
 
            int P2Win = 0;
            int P2Draw = 0;
            int P2Lose = 0;
 
 
            if (Player1Hand > Player2Hand)
            {
                P1Win++;
                P2Lose++;
 
                Console.WriteLine("Игрок 1 (Победы): " + P1Win);
                Console.WriteLine("Игрок 1 (Ничьи): " + P1Draw);
                Console.WriteLine("Игрок 1 (Поражения): " + P1Lose);
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Игрок 2 (Победы): " + P2Win);
                Console.WriteLine("Игрок 2 (Ничьи): " + P2Draw);
                Console.WriteLine("Игрок 2 (Поражения): " + P2Lose);
 
            }
            else if (Player1Hand < Player2Hand)
            {
                P2Win++;
                P1Lose++;
 
                Console.WriteLine("Игрок 1 (Победы): " + P1Win);
                Console.WriteLine("Игрок 1 (Ничьи): " + P1Draw);
                Console.WriteLine("Игрок 1 (Поражения): " + P1Lose);
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Игрок 2 (Победы): " + P2Win);
                Console.WriteLine("Игрок 2 (Ничьи): " + P2Draw);
                Console.WriteLine("Игрок 2 (Поражения): " + P2Lose);
            }
            else if (Player1Hand == Player2Hand)
            {
 
                P1Draw++;
                P2Draw++;
 
                Console.WriteLine("Игрок 1 (Победы): " + P1Win);
                Console.WriteLine("Игрок 1 (Ничьи): " + P1Draw);
                Console.WriteLine("Игрок 1 (Поражения): " + P1Lose);
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Игрок 2 (Победы): " + P2Win);
                Console.WriteLine("Игрок 2 (Ничьи): " + P2Draw);
                Console.WriteLine("Игрок 2 (Поражения): " + P2Lose);
 
            }
 
            Console.WriteLine();
            Console.WriteLine();
           /* for (int a = 0; a < 52; a++)
            {
                Console.Write(ranks[cards[a].Rank] + suits[cards[a].Suit] + " ");
            }
           */
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        static void Main()
        {
            int a = 0;
 
            while(true)
            {
                Console.Clear();
                Deck d = new Deck();
                d.PrintCards();
 
                a++;
 
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Количество раздач: " + a);
 
                Console.ReadKey();
            }
        }
Добавлено через 11 минут
В главном методе не получается так сделать, так как все переменные находятся в другом классе и могут использоваться только там. Просто счётчик раздач работает, потому что я переменную а вынес за пределы цикла. А тут сдаюсь.
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
25.07.2016, 18:14
Цитата Сообщение от Native15 Посмотреть сообщение
Я не совсем понял, как сделать лучше создание колоды, она, как по мне, и так хороша
Цитата Сообщение от Native15 Посмотреть сообщение
Чувствую, что где-то ошибка в перемешивании колоды, но не знаю где.
Вы сами чувствуете что то не так.
Вы создаете массив карт и потом делаете равнозначные массивы ranks и suits (Вы предполагаете что у первая карта точно будет "2с"), но потом Вы перемешиваете карты, а массиви ranks и suits так и стоят на месте, их Вы не трогаете.

Чтоб это решить можно:
1. когда мешаете карты сразу и мешать массиви ranks и suits
2. доработать класс Card

Почему плохой первый способ - нужно все время сделать одновременно за тремя массивами: cards, ranks, suits

Почему второй способ лучше:
+ все данные о карте всегда будут с ней
+ намного проще работать лишь за одним массивом
+ сделает код более понятным.

Добавлено через 4 минуты
Цитата Сообщение от Native15 Посмотреть сообщение
string[] Player1Hand
Не правильно, Вы передаете в массив только значение, а нужно передать карты - это разные данные. Вам нужно работать с одними и теми же картами.
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
25.07.2016, 18:50
Я запутался и так Я даже не знаю, если вы за меня всё сделаете, пойму ли я?
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
25.07.2016, 21:28
Цитата Сообщение от Native15 Посмотреть сообщение
Я запутался и так
Это как пазл - просто нужно сложить.

Нужно создать класс Card, который будет выглядеть вот так:
C#
1
2
3
4
5
6
public class Card
    {
        public string Rank;
        public string Suit;
        public int Point; //старшинство карты
    }
Теперь класс Desk:
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
public class Deck
    {
        public Card[] cards = new Card[52];
 
        public Deck()
        {
            string[] ranks = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
            string[] suits = { "c", "h", "s", "d" };
            for (int a = 0; a < 13; a++)
            {
                for (int b = 0; b < 4; b++)
                {
                    cards[b * 13 + a] = new Card();
                    cards[b * 13 + a].Rank = ranks[a];
                    cards[b * 13 + a].Suit = suits[b];
                    cards[b * 13 + a].Point = a+1;
                }
            }
 
        }
 
        public void ShuffleDeck()
        {
            Card tempcard;
            Random rand = new Random();
            for (int a = 0; a < 52; a++)
            {
                int x = rand.Next(0, 52);
                tempcard = cards[a];
                cards[a] = cards[x];
                cards[x] = tempcard;
            }
        }
 
 
        public void PrintCards()
        {
            for (int i = 0; i < 52; i++)
            {
                Console.WriteLine(cards[i].Rank + " " + cards[i].Suit + " " + cards[i].Point);
            }
        }
    }
Попробуйте вот так. Теперь класс для карты модифицирован.
Если перемешиваем карты, то сразу вся информация о карте держится в ней. Это очень удобно. Даже супер удобно (как хорошо что придумали ООП).
1
0 / 0 / 2
Регистрация: 17.07.2016
Сообщений: 28
26.07.2016, 08:08
C#
1
2
                    cards[b * 13 + a].Rank = ranks[a];
                    cards[b * 13 + a].Suit = suits[b];
Не удаётся неявно преобразоваться строку в целочисленную.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2016, 08:08

Обсуждение карточной игры покер
Народ, у меня такой вопрос, а на этом сайте кто нибудь умееи играть в покер?

Программа для игры в покер
Никак не могу понять суть ооп. До прихода в с++ програмировал на С микроконтроллеры. Там всё просто. Есть начало программы, и пишеш...

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

Программа-бот для игры в покер.
Здравствуйте. Сам я будующий программист, учусь на 2 курсе, потихоньку осваиваю С++. У меня вопрос к уже сложившимся и опытным...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru