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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
admiral93
0 / 0 / 0
Регистрация: 05.06.2011
Сообщений: 4
#1

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

18.06.2011, 11:34. Просмотров 1166. Ответов 2
Метки нет (Все метки)

Программа для игры в 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     Не работает вход в цикл в игре двадцать одно
Посмотрите здесь:

Цикл do while работает неправильно в игре - C++
Доброго времени суток. Для тренировки решил написать игру суть которой вывести слово, предварительно перемешав в нем буквы, а пользователь...

Вход в бесконечный цикл при решении уравнения методом простых итераций - C++
такое задание нужно применить метод простых итераций для решение уравненения на с++ вот мое решение в маткаде(скрин прикрепил ниже) и...

Не работает рекурсивная проверка поля в игре пятнашки - C++
Привет всем. Написал код игры, но проблемы с проверкой условия рекурсии Даже если два массива равны, оно всё равно входит в условие. А...

Работает,правда,в одно действие - C++
уважаемые программисты,не могли бы вы посмотреть данную програмку?работает вроде верно,но выполняет только одно действие,после чего...

Не работает одно исключение ввода - C++
Скажем так, это часть проги, должна проверять ввод значений, чтоб они были не нулевые, это условие работает, и чтоб элемент массива e1 был...

Вывести первые двадцать чисел - C++
Вывести на экран первые двадцать чисел, кратных 7.

Найти количество понедельников, что выпадают на 13-е числа двадцать первого столетия - C++
Обчислить количество понедельников, что попадаються на 13-е числа двадцать первого столетия и напечатать их список. Счет начинать с текущей...

Не работает цикл while - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { setlocale (0,&quot;Ukrainian&quot;); int chcount=0; int...

Не работает цикл - C++
почему i всегда 0 ? #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int main(void) { int j = 0; int n =...

Не работает цикл for - C++
Всем привет! Необходимо было написать реализацию RSA, однако возникли проблемы с циклом for: for (i=2; i&lt;=funcN; i++) if...

Цикл не работает - C++
Вот код // 2.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include...

Не работает цикл!!! - C++
Help!!!!! Почему не считает цикл... опять где-то ошибся #include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
2945 / 1289 / 238
Регистрация: 19.01.2009
Сообщений: 3,366
Завершенные тесты: 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.
понимаете, дело в том, что карты потом еще понадобятся виртуальному оппоненту, и поэтому я посчитал наиболее разумным сгенерить сразу всю колоду. да и графику будет проще привинтить.
Ответ Создать тему
Опции темы

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