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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
admiral93
0 / 0 / 0
Регистрация: 05.06.2011
Сообщений: 4
18.06.2011, 11:34     Не работает вход в цикл в игре двадцать одно #1
Программа для игры в 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
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
#include <iostream>
#include <cstdlib>
#include <string.h>
#include <ctime>
#include <vector>
#include <conio.h>
#include <locale.h>
using namespace std;
 
enum Suit { clubs, diamonds, hearts, spades };
// от 2 до 10 обычные числа
const int jack = 11;
const int queen = 12;
const int king = 13;
const int ace = 14;
/////////////////////////////////////////////////////////////
class card
{ 
  public:
    int number;
    Suit suit;
     card ( ) // конструктор
      { }
    void set ( int n, Suit s ) // установка значения
      { suit = s; number = n; }
    void display ( );          // показ карты
};
/////////////////////////////////////////////////////////////
void card::display ( )
{
  if ( number >= 2 && number <= 10 )
    cout << number;
  else
  {
    switch ( number )
    {
      case jack: cout << 'J'; break;
      case queen: cout << 'Q'; break;
      case king: cout << 'K'; break;
      case ace: cout << 'A'; break;
    }
  }
  switch ( suit )
  {
    case clubs: cout << static_cast<char>( 5 ); break;
    case diamonds: cout << static_cast<char>( 4 ); break;
    case hearts: cout << static_cast<char>( 3 ); break;
    case spades: cout << static_cast<char>( 6 ); break;
  }
}
 
int main ( )
{
  setlocale(LC_ALL,"russian");
  card deck [ 52 ];
  int j;
 
  cout << endl;
 
  for ( j = 0; j < 52; j++ )   // создаем упорядоченную колоду карт
  { 
    int num = ( j % 13 ) + 2;
    Suit su = Suit ( j / 13 );
    deck [ j ].set ( num, su );
  }
  //тестовые строки-показываем исходную колоду
  /*cout << "Исходная колода:\n";
  for ( j = 0; j < 52; j++ )
  {
    deck [ j ].display ( );
//    cout < "  ";
//    if ( !( ( j + 1 ) % 13 ) ) // начинаем новую строку после каждой 13-й карты
      cout << endl;
  }
  srand ( time ( NULL ) );     // инициализируем генератор случайных чисел
  for ( j = 0; j < 52; j++ )
  {
    int k = rand ( ) % 52;     // выбираем случайную карту
    card temp = deck [ j ];    // и меняем ее с текущей
    deck [ j ] = deck [ k ];
    deck [ k ] = temp;
  } */
  // тестовые строки-показываем перемешанную колоду
 /* cout << "\nПеремешанная колода:\n";
  for ( j = 0; j < 52; j++ )
  {
    deck [ j ].display ( );
    cout << "  ";
  //  if ( !( ( j + 1 ) % 13 ) ) // начинаем новую строку после каждой 13-й карты
      cout << endl;
  }*/
  int userscore=0;
  int cnum=0;
  int i=0;
 
  for ( j = 0; j < 2; j++ ) //первая сдача карт игроку
  {
    deck [ j ].display ( );
    cnum= deck[j].number;
    
    if (  cnum >= 2 && cnum <= 10 )
        { 
        userscore= userscore+cnum;
        }
    else
        {
        if ( cnum == 14)
            {
                if (userscore>= 11) 
                {
                    userscore= userscore+1;
                } 
                else 
                {
                    userscore=userscore+11;
                }
            }
        else
        {
        userscore= userscore+10;
        }
        }
    cout << "  \n";
  }
 // тестовые строки
 /* cout << userscore;
  cout << "  \n";
  cout << i;*/
  char ansver[6];
  if (userscore==21) 
      cout << " Блэкджек!!!\n"; 
  else 
  {
      cout << userscore;
      cout << "\n";
      
 
      {
metka: cout << "Any or Stop?\n";
          cin >> ansver;
//        cout << ansver;
    do
      if (ansver[1]=='a' || ansver[1]=='A')
      {
          cout << "тестовое слово";
        j++;
       deck [ j ].display ( );
       cnum= deck[j].number;
    
     if (  cnum >= 2 && cnum <= 10 )
        { 
        userscore= userscore+cnum;
        }
    else
        {
        if ( cnum == 14)
            {
                if (userscore>= 11) 
                {
                    userscore= userscore+1;
                } 
                else 
                {
                    userscore=userscore+11;
                }
            }
        else
        {
        userscore= userscore+10;
        }
        }
    cout << "  \n";
    if (userscore==21) 
    {cout << " Блэкджек!!!\n";
    }
    else
    {if (userscore>21)
    cout << "вы проиграли";
    else {goto metka;}
    };
  }
      while (ansver[1]=='s' || ansver[1]=='S');
      }
      getch();
      return (0);
  }
  }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2011, 11:34     Не работает вход в цикл в игре двадцать одно
Посмотрите здесь:

число записать словами (123 -> сто двадцать три) C++
C++ Не работает цикл!!!
Не работает одно исключение ввода C++
C++ Работает,правда,в одно действие
Вывести первые двадцать чисел C++
Найти количество понедельников, что выпадают на 13-е числа двадцать первого столетия C++
C++ Не работает цикл
C++ Не работает цикл for

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
18.06.2011, 20:40     Не работает вход в цикл в игре двадцать одно #2
Вот посмотрите:
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.
admiral93
0 / 0 / 0
Регистрация: 05.06.2011
Сообщений: 4
19.06.2011, 14:45  [ТС]     Не работает вход в цикл в игре двадцать одно #3
спасибо большое, проблема с этим циклом решена.

Добавлено через 22 минуты
Цитата Сообщение от schdub Посмотреть сообщение
Имхо, совсем не обязательно генерить всю колоду: можно только N карт, сумма которых больше либо равна 21.
понимаете, дело в том, что карты потом еще понадобятся виртуальному оппоненту, и поэтому я посчитал наиболее разумным сгенерить сразу всю колоду. да и графику будет проще привинтить.
Yandex
Объявления
19.06.2011, 14:45     Не работает вход в цикл в игре двадцать одно
Ответ Создать тему
Опции темы

Текущее время: 12:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru