Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.68
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 189
#1

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

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

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

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

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

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

Что дальше? Бесконечный цикл ожидания когда пользователь нажмёт кнопку? И вызов соответствующих функций какихто классов?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2013, 13:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа для игры в покер (C++):

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

Мне очень нужна программа для игры gta samp 0.3c для взлома базы данных - C++
Мне очень нужна программа для игры gta samp 0.3c для взлома базы данных

Исходники игры "Покер" - C++
Срочно нужны исходники "Покера" или "21-Очко". Буду очень благодарен за помощь.

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

Теория игр на примере С3 из ЕГЭ по информатике. Программа, которая выдает стратегии для игры - C++
Здравствуйте! Помогите с написанием программы, пожалуйста. Задача: есть 2 игрока(1-ый и 2-ой соответственно), перед ними лежи куча...

программа игры на С++ - C++
Составить программу, которая: 1) предлагает игроку числовые головоломки типа ОДИН + ОДИН = МНОГО из некоторого набора таких головоломок...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.02.2013, 13:31 #2
Цитата Сообщение от nefton Посмотреть сообщение
Там всё просто. Есть начало программы, и пишеш инструкции последовательно чтоб устройство работало так, как задумано
тут тоже
Цитата Сообщение от nefton Посмотреть сообщение
Используя регистры, прерывания и тп.
только goto не используй как в своём асме. И к регистрам и прерываниям никто тебе доступа не даст, когда параллельно с тобой запущено ещё несполько приложений и сама операционка Windows.

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

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

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

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

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

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

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

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

Не по теме:

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

Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.02.2013, 22:23 #7
Цитата Сообщение от XRuZzz Посмотреть сообщение
Помоему суть ООП в том, чтобы описывать устройство реального мира в коде.
Я тоже раньше так думал. Потом посмотрел, что пишут Явисты(хоть сам на Яве и не пишу). С реальными устройствами там мало что общего. Интерфейсы ради интерфейсов...
В С++ это ощущается в меньшей степени, но тоже. Особенно с распространением паттернов.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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 раз переделываю. Надо тоже прочесть как-то.
XRuZzz
Антикодер
675 / 576 / 28
Регистрация: 15.09.2012
Сообщений: 2,522
28.02.2013, 22:49 #9
Интересно программировать микроконтроллеры на C++

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

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

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

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

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

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

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

Конечно сразу написать хорошую архитектуру не получится, для любого(долгоживущего) приложения требуется периодический рефакторинг(побочный процесс для ООП)
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 189
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 строчек
если потом предвидится както работать с этими или подобными фигурками - то надо усложнять

Вобщем я понял ответ на свой вопрос в первом сообщении. Мне надо нарисовать на бумажке не приложение, его части, классы и тп. А то, что я или кто другой потом захочет с этим сделать. Варианты развития событий. И уже отсюда отталкиваться.
booker
23 / 23 / 2
Регистрация: 21.11.2012
Сообщений: 106
01.03.2013, 19:50 #13
freemind - хорошая программка, годная для проектирования, ну это чтоб вам бумагу не изводить)
XRuZzz
Антикодер
675 / 576 / 28
Регистрация: 15.09.2012
Сообщений: 2,522
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"
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
01.03.2013, 22:47 #15
Цитата Сообщение от XRuZzz Посмотреть сообщение
Тока я не понимаю как человек, который писал для микроконтроллеров, может писать код, который не будет работать на микроконтроллерах.
Что-то я вообще не понял, о каком коде идёт речь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2013, 22:47
Привет! Вот еще темы с ответами:

Программа поверх игры - C++
Какими способами можно заставить программу отображаться и работать поверх игры. (не поверх всех окон, а именно поверх игры)? Например, в...

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

Что необходимо для написания читов для игры? - C++
По мере изучения СИ++ все больше и больше наталкиваюсь на мысль &quot;А не написать мне какой-нибудь чит для игры&quot;, но проштудировав весь...

Покер - C++
Прошу помощи. Болел - ничего не понял. Скоро экзамен, а я ничего не понимаю в С++. Дали примерные задачи, а я не понимаю как решать. Вот...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.03.2013, 22:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru