Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/58: Рейтинг темы: голосов - 58, средняя оценка - 4.57
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
1

Программа для игры в покер

28.02.2013, 13:15. Показов 10628. Ответов 46
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Никак не могу понять суть ооп.
До прихода в с++ програмировал на С микроконтроллеры.
Там всё просто. Есть начало программы, и пишеш инструкции последовательно чтоб устройство работало так, как задумано. Используя регистры, прерывания и тп.

Сейчас же выучив немного С++ пытаюсь написать консольное приложение для игры в покер сам с собой.
Написал функцию сравнения рук в покере. Даже написал обьект "Автомат игры" для безлимитного холдема
для 2-10 чел. (переписывал много много раз)
Последняя редакция подкупает своей лаконичностью. В этом обьекте нет "представления" типа ников игроков, аватарок и тп. Нет функции рисования игры в консоле и ввода от пользователя ходов.

Вопрос как мне организовать программу чтоб было красиво (понятно) и расширяемо и тп. Вобщем как это делают нормальные програмисты?

Вот у меня есть main(). Это точка входа. (в визуал С++ я так её и не нашол когда пытался )
Далее по логике я создаю экземпляры классов какие мне надо в программе.

Что дальше? Бесконечный цикл ожидания когда пользователь нажмёт кнопку? И вызов соответствующих функций какихто классов?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2013, 13:15
Ответы с готовыми решениями:

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

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

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

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

46
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
28.02.2013, 13:31 2
Цитата Сообщение от nefton Посмотреть сообщение
Там всё просто. Есть начало программы, и пишеш инструкции последовательно чтоб устройство работало так, как задумано
тут тоже
Цитата Сообщение от nefton Посмотреть сообщение
Используя регистры, прерывания и тп.
только goto не используй как в своём асме. И к регистрам и прерываниям никто тебе доступа не даст, когда параллельно с тобой запущено ещё несполько приложений и сама операционка Windows.

Цитата Сообщение от nefton Посмотреть сообщение
Что дальше? Бесконечный цикл ожидания когда пользователь нажмёт кнопку? И вызов соответствующих функций какихто классов?
Ну в принципе да, а что? Методы классов - те же функциии. Вообще всё зависит, например, оконное у тебя приложение или консольное.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
28.02.2013, 13:48  [ТС] 3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
только goto не используй как в своём асме.
Я дорос до програмирования на С там goto нету (практически)

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

Или я захочу изменить логику игры (скажем турнир сделать или игру на деньги просто или игру ботов между собой)
И чтоб при этом надо было менять минимум кода, и чтоб всё было последовательно и "лаконично"

Пытаясь решить проблему "в лоб" постоянно сталкиваюсь с одной и той же проблемой. Код растёт, читаемость (даже для автора) падает и настаёт момент когда уже ничё не понятно вообще что происходит и что должно происходить.
Уверен есть какието стандартные концепции програмирования.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
28.02.2013, 21:28 4
Цитата Сообщение от nefton Посмотреть сообщение
Но я хотел бы писать так, чтоб код был читаемым.
Я тоже. В принципе одной из задач использования ООП является в том числе избавление от таких вот жалоб, но у меня, например, это не всегда выходит. Иногда, наоборот, злоупотребление ООП и попытка построить свою собственную супергибкую архитектуру только ухудшают читаемость, если руки кривые.

Цитата Сообщение от nefton Посмотреть сообщение
Уверен есть какието стандартные концепции програмирования.
Читай про паттерны.

А вообще, даже из программирования контроллеров на чистом Си, ты должен был усвоить, что код нужно разбивать на функции, а функции и их прототипы распихивать в отдельные *.с и *.h файлы. Иногда даже этого достаточно, чтоб упростить большую программу.
Ты когда программировал контроллеры пользовался этим???
0
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
28.02.2013, 21:43 5
ринципе одной из задач использования ООП является в том числе избавление от таких вот жалоб,
хорошая шутка...
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
28.02.2013, 22:05 6
я лично Дейтела время от времени смотрю(при прочтении первых же глав, вы не будете совершать самые идиотские ошибки в архитектуре). Помоему суть ООП в том, чтобы описывать устройство реального мира в коде. Чтобы понять как должна работать программа, нужно понять как ведут себя объекты в реальном мире.

У Дейтела есть задачка

"Написать программку на C++ которая выводит звездочками это
Bash
1
2
3
4
5
6
7
8
9
*********      ***          *           *       
*       *    *     *       * *         ***      
*       *   *       *     *   *       *****     
*       *   *       *    *     *        *       
*       *   *       *   *       *       *       
*       *   *       *    *     *        *       
*       *   *       *     *   *         *       
*       *    *     *       * *          *       
*********      ***          *           *
как бы вы её решили?

Не по теме:

тоже начинал с микроконтроллеров.

0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
28.02.2013, 22:23 7
Цитата Сообщение от XRuZzz Посмотреть сообщение
Помоему суть ООП в том, чтобы описывать устройство реального мира в коде.
Я тоже раньше так думал. Потом посмотрел, что пишут Явисты(хоть сам на Яве и не пишу). С реальными устройствами там мало что общего. Интерфейсы ради интерфейсов...
В С++ это ощущается в меньшей степени, но тоже. Особенно с распространением паттернов.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
28.02.2013, 22:44 8
Цитата Сообщение от nefton Посмотреть сообщение
Никак не могу понять суть ооп
И я не сразу понял. Да и понял ли? Для меня ООП- возможность конструировать собственные типы данных с операциями, которые к этим типам применяются.

Я бы так сказал: колея это только моя, выбирайтесь своей колеёй. Читай Дейтела там. Ещё кого. Брайана Оверленда прочти обязательно. Если в Си шаришь начинай там сразу со второй части, где он и объясняет ООП

Цитата Сообщение от nefton Посмотреть сообщение
Но я хотел бы писать так, чтоб код был читаемым. И к примеру если завтра я захочу написать это же приложение не консольно - то чтоб мне надо было переделать только 1 маленький фрагмент, а не весь код.
Про ввод данных могу научить.
Здесь как раз всё просто для меня по крайней мере. Пишу весь функционал на C++ с допустимостью ввода данных через файл. Ну например твой программа принимает значения: количество игроков и прочую муть. Ты сделай так, чтобы эти данный программа могла считывать с какого-нибудь файла. Например так:

C++
1
2
3
4
5
6
7
int kol_vo_igrokov= 5;
int прочая_муть= 10;
 
//ifstream if ("data.txt");
 
//if>> kol_vo_igrokov;
//if>> прочая_муть;
вот я специально закомментил эти строки, показать, что в процессе работы ты можешь вводить данные с клавиатуры или константой они пусть будут как душе угодно. Теперь я хочу прицепить к программе оконный интерфейс. Ну это совсем другая история. Я предпочитаю лепить его на C#. Но дело в том, что мне на C# в этом случае и надо-то всего навсего слепить файл с данными вот такой:

5 10
после чего запустить (сообразишь к тому времени сам, как это сделать) программу- функционал, предварительно написанный на C++ и всё. Она спокойно считает эти данные и отработает. Вот тебе и минимум переделок. Это что касается ввода данных.

Если в дальнейшем захочешь графику лепить- ну посложнее придётся.

А вообще действительно раз о Дейтеле так отзываются, может стоить прочесть? Я вот например берусь за проект- вроде понятна архитектура, а потом по 10 раз переделываю. Надо тоже прочесть как-то.
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
28.02.2013, 22:49 9
Интересно программировать микроконтроллеры на C++

например сделать какого нибудь робота, и описывать класс Hands например.

Добавлено через 3 минуты
и вживую наблюдать как класс работает, а не в памяти
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
01.03.2013, 17:07  [ТС] 10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А вообще, даже из программирования контроллеров на чистом Си, ты должен был усвоить, что код нужно разбивать на функции, а функции и их прототипы распихивать в отдельные *.с и *.h файлы. Иногда даже этого достаточно, чтоб упростить большую программу.
Ты когда программировал контроллеры пользовался этим???
Разумеется. Всё по отдельным файлам (но файлов уже 10шт и скоро вырастит это дело в разы) Надо будет их группировать по папкам (если такое возможно)
Функции и данные максимально сгрупированы по классам. И нет повторяющегося кода нигде.
Если б мой Visual C++ не позволял сворачивать функции - то я б пол дня только искал чтото.
Незнаю как посчитать кол-во строк кода, Но его много И взял себе за правило очень хорошо и русским языком коментировать свои мысли при написании кода (по крайней мере того что пишу основательно). При этом кстати вылазит много ошибок логических, да и понимание того что пишу усваивается лутше.

Для себя уяснил 2 вещи.
1. Моя конечная задача - это не работающая программа (как я думал раньше). Ведь та программа которую счас пишу мне вообще не надо. Я ведь её и пишу то для отладки "кирпичиков". А потом я буду писать другую/е программы из тех кирпичиков что отлажу. Так вот моя конечная цель - облегчить себе жизнь в будующем, чтоб у меня было достаточно простых, понятных, отлаженых кирпичиков для написания легко и быстро будующих программ по покеру (чтоб я там ни придумал)

2. Нельзя смешивать по возможности (в одном классе/файле/функции) те части которые предполагается когдато менять и те части которые отлажены, работают и их менять при апгрейдах программы или написании подобных программ не предполагается.
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
01.03.2013, 18:18 11
При разработке архитектуры приложения, нужно учитывать не только программирование.
Кроме паттернов, которые здесь упоминали нужно учиться анализировать предметную область(для этого существует системный анализ и требования к ПО), методологии программирования(RUP, XP и др), структуру БД, многопоточность и т д. Сейчас в мире для графического представления архитектуры используют UML (так как у русских нету альтернативы на этот счет).

Ну и поскольку вы не ответили на вопрос по задаче на всякий случай расскажу вам свою идею.

На картинке 4 объекта, а вовсе не 9 строчек, как может показаться. То есть как минимум у нас будет 4 класса для каждого типа фигур и как следствие один класс который обобщает все 4 фигуры - класс Figures. Это пример ситуации когда может пригодиться наследование.

В общем для гибкости приложения у меня получилось 17 классов.

Конечно сразу написать хорошую архитектуру не получится, для любого(долгоживущего) приложения требуется периодический рефакторинг(побочный процесс для ООП)
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
01.03.2013, 19:30  [ТС] 12
Цитата Сообщение от XRuZzz Посмотреть сообщение
Ну и поскольку вы не ответили на вопрос по задаче
Ок, в украине счас 16-24. пошол рисовать оте картинки классами. чуть позже выложу что получилось.

Добавлено через 53 минуты
17-17

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
// figures.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "c_Figure.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    //Создаём наши фигурки (4 шт)
    c_Figure fig1(9,9);
    c_Figure fig2(9,9);
    c_Figure fig3(9,9);
    c_Figure fig4(5,9);
/* 
*********      ***          *           *       
*       *    *     *       * *         ***      
*       *   *       *     *   *       *****     
*       *   *       *    *     *        *       
*       *   *       *   *       *       *       
*       *   *       *    *     *        *       
*       *   *       *     *   *         *       
*       *    *     *       * *          *       
*********      ***          *           *  
*/
 
    //Заполняем
    fig1.Fill("*********",0);
    fig1.Fill("*       *",1);
    fig1.Fill("*       *",2);
    fig1.Fill("*       *",3);
    fig1.Fill("*       *",4);
    fig1.Fill("*       *",5);
    fig1.Fill("*       *",6);
    fig1.Fill("*       *",7);
    fig1.Fill("*********",8);
    
    fig2.Fill("  *****  ",0);
    fig2.Fill(" *     * ",1);
    fig2.Fill("*       *",2);
    fig2.Fill("*       *",3);
    fig2.Fill("*       *",4);
    fig2.Fill("*       *",5);
    fig2.Fill("*       *",6);
    fig2.Fill(" *     * ",7);
    fig2.Fill("  *****  ",8);
    
    fig3.Fill("    *    ",0);
    fig3.Fill("   * *   ",1);
    fig3.Fill("  *   *  ",2);
    fig3.Fill(" *     * ",3);
    fig3.Fill("*       *",4);
    fig3.Fill(" *     * ",5);
    fig3.Fill("  *   *  ",6);
    fig3.Fill("   * *   ",7);
    fig3.Fill("    *    ",8);
 
    fig4.Fill("  *  ",0);
    fig4.Fill(" *** ",1);
    fig4.Fill("*****",2);
    fig4.Fill("  *  ",3);
    fig4.Fill("  *  ",4);
    fig4.Fill("  *  ",5);
    fig4.Fill("  *  ",6);
    fig4.Fill("  *  ",7);
    fig4.Fill("  *  ",8);
 
    //Рисуем
    for (int i=0; i<9; i++){
        printf("%s  %s  %s  %s\n",fig1.GetRow(i), fig2.GetRow(i), fig3.GetRow(i), fig4.GetRow(i));
    }
 
 
 
    int t=0;
    scanf("\nend%d",t);
    return 0;
}
Файл заголовков (по совместительству с функциями)

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
#include "stdafx.h"
 
class c_Figure
{
public:
    c_Figure(unsigned char lenght, unsigned char height);
    void Fill(char* source, unsigned char row);
    void Clear();
    char* GetRow(unsigned char row);
private:
    unsigned char lenght;
    unsigned char height;
    char data[20][20]; //C динамическими массивами неумею, надо учится
};
 
c_Figure::c_Figure(unsigned char p_lenght, unsigned char p_height){
    lenght=p_lenght;
    height=p_height;
    Clear();
}
 
void c_Figure::Clear(){
    for (int i=0;i<20; i++) for (int j=0; j<20; j++) data[j][i]=0;
    return;
}
 
void c_Figure::Fill(char* source, unsigned char row){
    for (int i=0; i<lenght; i++) data[row][i]=source[i];
    return;
}
 
char* c_Figure::GetRow(unsigned char row){
    return &data[row][0];
}
Добавлено через 12 минут
Цитата Сообщение от XRuZzz Посмотреть сообщение
В общем для гибкости приложения у меня получилось 17 классов.
17 классов... имхо это явно перебор.
Всё думаю зависит от целей зачем мы пишем. О! тоесть получается невозможно ответить на вопрос
"какой подход к написанию оптимален в данной ситуации" без подробного описания ситуации.
И не просто приложения, а всей жизни приложения начиная от нашей задумки и заканчивая нашей смертью приложения когда о нём все забудут.
И при выборе того КАК мы будем програмировать мы учитываем только чтоб нам (или другому) было максимально просто и быстро сделать свою работу (не только сдачу проекта, но и последующего сопровождения, апгрейда).
Вот например с этими картинками.
если задача нарисовать - то однозначно 9 строчек
если потом предвидится както работать с этими или подобными фигурками - то надо усложнять

Вобщем я понял ответ на свой вопрос в первом сообщении. Мне надо нарисовать на бумажке не приложение, его части, классы и тп. А то, что я или кто другой потом захочет с этим сделать. Варианты развития событий. И уже отсюда отталкиваться.
0
24 / 24 / 5
Регистрация: 21.11.2012
Сообщений: 106
01.03.2013, 19:50 13
freemind - хорошая программка, годная для проектирования, ну это чтоб вам бумагу не изводить)
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
01.03.2013, 22:43 14
ну, а теперь представьте ситуацию, что прибежал начальник и сказал, что вместо звездочек должны быть "$", а вместо пробелов ".". Вместо фигур должны быть изображены масти карт, и все они могут отображаться в произвольном порядке по 4-6 шт.. И ещё надо чтоб все фигуры могли быть разного масштаба, например такой ромбик(бубни)
C++
1
2
3
 *
* *
 *
и такой
C++
1
2
3
4
5
  *
 * *
*   *
 * *
  *
Цитата Сообщение от nefton Посмотреть сообщение
Ок, в украине счас 16-24. пошол рисовать оте картинки классами. чуть позже выложу что получилось.
...
Вобщем я понял ответ на свой вопрос в первом сообщении. Мне надо нарисовать на бумажке не приложение, его части, классы и тп. А то, что я или кто другой потом захочет с этим сделать. Варианты развития событий. И уже отсюда отталкиваться.
Ну да, вроде моя мысль до вас дошла. Тока я не понимаю как человек, который писал для микроконтроллеров, может писать код, который не будет работать на микроконтроллерах.

То есть сам код хороший, кроссплатформерный, просто хотел пожелать не увлекаться особо нестандартными библиотеками студии.
смущает строчка
C++
1
#include "stdafx.h"
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
01.03.2013, 22:47 15
Цитата Сообщение от XRuZzz Посмотреть сообщение
Тока я не понимаю как человек, который писал для микроконтроллеров, может писать код, который не будет работать на микроконтроллерах.
Что-то я вообще не понял, о каком коде идёт речь?
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
01.03.2013, 23:13 16
вы не сможите скомпилировать класс с_Figure на компиляторе для микроконтроллера пока не уберете строчку
C++
1
#include "stdafx.h"
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
01.03.2013, 23:17 17
Цитата Сообщение от XRuZzz Посмотреть сообщение
вы не сможите скомпилировать класс с_Figure на компиляторе для микроконтроллера
он и не пытается это для микроконтроллера компилировать
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
01.03.2013, 23:20 18
ну STL вы же сможете скомпилировать где угодно.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
01.03.2013, 23:28 19
Цитата Сообщение от XRuZzz Посмотреть сообщение
ну STL вы же сможете скомпилировать где угодно.
я не понимаю при чём тут STL и при чём тут микроконтроллеры. Может ты ошибся разделом форума? Тут где-то обсуждали МК в другой ветке.
0
XRuZzz
01.03.2013, 23:30     Программа для игры в покер
  #20

Не по теме:

ну надеюсь ТС меня поймёт :scratch:

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2013, 23:30

Определение ранга комбинации рук для игры Покер
Здравствуйте. Нужен модуль, который бы определял ранг комбинации набора из 5 карт в игре покер....

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

Массив карт для игры в покер используя Struct
добрый дент, подскажите пожалуйста, как создать массив(карты 52 шт), , используя Struct ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru