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

Не работает вход в цикл в игре двадцать одно - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Алгоритм перебора http://www.cyberforum.ru/cpp-beginners/thread322013.html
Всем доброго времени суток! Уважаемые форумчане подскажите алгоритм полного перебора, можно без кода, лишь ход действий. Конкретнее. В кармане некоторое количество монет. Какие суммы денег возможны из данного количества. Например: есть 3 монеты. Возможны варианты: 1+1+5=7 копеек, 5+10+10=25 копеек и т.п. Вынес себе весь мозг, так ниче и не придумал. Пробовал разные варианты но все не то. Если...
C++ проверьте пожалуйста! Доброе утро!Хочу показать вам не проверку свое творение.Не запускается. Вот текст ошибки: g++.exe "C:\Users\user\Desktop\Dev-Cpp\nature.cpp" -o "C:\Users\user\Desktop\Dev-Cpp\nature.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" ... http://www.cyberforum.ru/cpp-beginners/thread322005.html
прекалк C++
Доброго времени суток Знаю, что есть задачи, которые можно решить только с помощью этого прекалка. Но что это такое - найти не могу =( Просьба дать линки на какую-нибудь литературу по этой теме, либо объяснить на примере. Что он делает, примерно представляю - на олимпиадные задачи отводится определенное время, обычно 1 секунда. Иногда этого недостаточно, и в таких случаях, как я понял, пишут...
C++ указатели в с++
Здравствуйте уважаемые программисты! У меня есть одна проблема, не могу решить задачу в с++ с указателями, 5 задач в контрольной работе, 4 задачи решил, а эту не могу... не доходит.. помогите пожалуйста ее решить, все уже перепробывал... вот сама задача: "Исследовать действия процедуры delete при удалении значений целого и вещественного типов, записываемых на одно место динамической памяти ЭВМ....
C++ Произведение между мин и макс. Прога виснет :) http://www.cyberforum.ru/cpp-beginners/thread321976.html
не пойму в чём ошибка float proizv(float * a, int n){ int i, min_ind,max_ind; float pr=1,min=a,max=a; for(i=0;i<n;i++){ if(min>a){ min_ind=i; } }
C++ Запись и чтение файлов на диск и с диска НАПИСАТЬ ДВЕ ПРОГРАММЫ 1) СОЗДАНИЯ ФАЙЛА С УКАЗАННЫМИ ПОЛЯМИ И 2) СЧИТЫВАНИЕ ДАННЫХ ИЗ ФАЙЛА И ВЫВОД НА ЭКРАН МОНИТОРА В ВИДЕ ТАБЛИЦЫ, ЗАТЕМ ОПЯТЬ СЧИТАТЬ ДАННЫЕ ИЗ ФАЙЛА И ВЫПОЛНИТЬ ВЫБОРКУ ПО НЕКОТОРОМУ УСЛОВИЯ (условие придумать самостоятельно). НАПРИМЕР : считать данные из файла и вычислить средний балл по группе. ПРЕДУСМОТРЕТЬ ВОЗМОЖНОСТЬ ЗАПРОСА С КЛАВИАТУРЫ ИМЕНИ ФАЙЛА: Файл содержит... подробнее

Показать сообщение отдельно
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
18.06.2011, 20:40     Не работает вход в цикл в игре двадцать одно
Вот посмотрите:
main.cpp
C++
1
2
3
4
5
6
7
8
#include "twentyonegame.h"
#include <iostream>
 
int main (int argc, char ** argv)
{
    setlocale(LC_ALL, "Russian");
    return TwentyOneGame().gameLoop();
}

twentyonegame.h
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
#pragma once
 
class Card;
 
class PlayerWin {};
class PlayerLoose {};
 
class TwentyOneGame
{
public:
    TwentyOneGame();
    ~TwentyOneGame();
    
    int gameLoop();
 
private:
    static const size_t _cardsCout = 52;
    Card * _deck[_cardsCout];
    
    int _playerScore;
    
    void initDeck();
    void addPlayerScore(const Card &);
    void getPlayerRandomCard();
    void cleanUpAllCards();
};

twentyonegame.cpp
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
#include "twentyonegame.h"
#include "card.h"
 
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <ctime>
 
TwentyOneGame::TwentyOneGame()
{
    srand(time(0));
    memset(_deck, 0, sizeof(_deck));
}
 
TwentyOneGame::~TwentyOneGame()
{
    cleanUpAllCards();
}
 
void TwentyOneGame::initDeck()
{
    cleanUpAllCards();
 
    size_t i = 0;
    for (size_t suit = first_suit; suit <= last_suit; ++suit)
        for (size_t name = first_name; name <= last_name; ++name)
            _deck[i++] = new Card(Name(name), Suit(suit));
    assert(i == _cardsCout);
}
 
void TwentyOneGame::addPlayerScore(const Card & card)
{
    // здесь мы увеличиваем текущий счет игрока
    _playerScore += card.name();
    
    std::cout << "Score: " << _playerScore << std::endl;
    
    if (_playerScore > 21)
        throw PlayerLoose();
    else if (_playerScore == 21)
        throw PlayerWin();
}
 
void TwentyOneGame::getPlayerRandomCard()
{
    // генерируем случайный индекс карты
    size_t idx;
    while (!(_deck[idx = (rand() % _cardsCout)]));
    // помечаем данную карту как пустую
    const Card * card = _deck[idx];
    
    std::cout << "Card: " << card->fullName() << " ";
    
    _deck[idx]  = 0;
    if (card) addPlayerScore(*card);
    delete card;
}
 
int TwentyOneGame::gameLoop()
{
    std::string buff;
    do
    {
        std::cout << std::endl;
        bool playerWin = false;
        initDeck();
        _playerScore = 0;
        try
        {
            // сдаем первые две карты
            getPlayerRandomCard();
            do
            {
                getPlayerRandomCard();
                std::cout << "Press [S] for stop  or any key for next step: ";
                std::getline(std::cin, buff);
            } while (!(buff[0] == 'S' || buff[0] == 's'));
        }
        catch(PlayerLoose) { playerWin = false; }
        catch(PlayerWin)   { playerWin = true;  }
        
        std::cout << "You " << ( playerWin ? "WIN, congratulations :)" : "LOOSE, :(") << std::endl;
        std::cout << "Press [N] for new game or any key for quit: ";
        std::getline(std::cin, buff);
    } while (buff[0] == 'N' || buff[0] == 'n');
    return 0;
}
 
void TwentyOneGame::cleanUpAllCards()
{
    // чистим колоду
    for (size_t i = 0; i < _cardsCout; ++i)
        delete _deck[i];
}

card.h
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
#pragma once
 
#include <string>
 
enum Suit {
    clubs
    , diamonds
    , hearts
    , spades
    , first_suit = clubs
    , last_suit = spades
};
 
enum Name {
      two
    , three
    , four
    , five
    , six
    , seven
    , eight
    , nine
    , ten
    , jack
    , queen
    , king
    , ace
    , first_name = two
    , last_name = ace
};
 
class Card
{
public:
    Card (Name n, Suit s);
    const std::string & fullName () const;
    int name() const;
    int suit() const;
 
private:
    Name _name;
    Suit _suit;
    std::string _strName;
 
    static const char * _names[];
    static const char * _suits[];
};

card.cpp
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
#include "card.h"
 
#include <string>
 
const char * Card::_names[] = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
const char * Card::_suits[] = {"\x05","\x04","\x03","\x06"};
 
Card::Card (Name n, Suit s)
    : _suit(s)
    , _name(n)
{
    // инициализируем текстовое название карты
    _strName = _names[_name];
    _strName += _suits[_suit];
}
 
const std::string & Card::fullName () const
{
    return _strName;
}
 
int Card::name() const
{
    return _name + 2;
}
 
int Card::suit() const
{
    return _suit;
}


Добавлено через 18 минут
Имхо, совсем не обязательно генерить всю колоду: можно только N карт, сумма которых больше либо равна 21.
 
Текущее время: 09:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru