From 60029df93ad23e83bb4fcd599d72dbb162aeb223 Mon Sep 17 00:00:00 2001 From: valya1 Date: Tue, 17 May 2016 00:07:05 +0500 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D0=B3=D0=B8,=20=D0=B1=D0=B0=D0=B3?= =?UTF-8?q?=D0=B8...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Backgammon/Backgammon.cpp | 105 ++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 49 deletions(-) diff --git a/Backgammon/Backgammon.cpp b/Backgammon/Backgammon.cpp index e76d14d..671b823 100644 --- a/Backgammon/Backgammon.cpp +++ b/Backgammon/Backgammon.cpp @@ -87,18 +87,19 @@ void throw_dice() bool turn_is_possible(vecint dices, bool head_chip) { int count = 0; // считаем, что оба хода возможны - for (int i = 0; i < 2; i++) // проверяем возможность хода с очками на обоих кубиках + for (int i = 0; i < dices.size(); i++) // проверяем возможность хода с очками на кубиках { int ok_positions = 24; // позиция "плохая", если на ней нет фишек или с неё нельзя сходить, изначально считаем, что все "хорошие" for (int j = 0; j < 24 - dices[i]; j++) - if ( (val[i].chip == p[player - 1] && val[i + dices[i]].chip == p[(player % 2)]) || val[i].chip.empty() || (j==0 && head_chip)) + if ( (val[j].chip == p[player - 1] && val[j + dices[i]].chip == p[(player % 2)]) || val[j].chip.empty() || (j==0 && head_chip && player==1) + || (j==12 && head_chip && player==2) || val[j].chip!=p[player-1]) ok_positions--; /* если на текущей позиции - ваша фишка, а на итоговой - фишка соперника, или текущая позиция пустая, - или если это голова и с нее уже сняли фишку, то метим позицию как плохую*/ + или если это голова и с нее уже сняли фишку, или же на этой позиции чужая фишка, то метим позицию как плохую)))))*/ // (player-1) - текущий игрок, ( (player %2)+1 ) - противник! if (ok_positions == 0) count++; // ход с этими очками невозможен } - if (count==2) + if ( count==dices.size() ) return false; return true; } @@ -113,8 +114,6 @@ void turn() dices.push_back(dice1); dices.push_back(dice2); cout << "Ходит игрок " << player << endl; - if (turn_is_possible(dices, head_chip)) - { if (dice1 == dice2) // дубль { cout << "Вам выпал дубль!!!" << endl << endl; @@ -123,59 +122,67 @@ void turn() } while (!dices.empty()) { - cout << "Введите номер ячейки, откуда переставлять: "; - cin >> pos; - while ((val[pos].chip != p[player - 1]) || (head_chip && pos==12 && player==2) || (head_chip && pos == 0 && player == 1)) - // если ход чужой фишкой или попытка снять еще одну с головы + if (turn_is_possible(dices, head_chip)) { - if ((pos == 0 && player==1) || (pos == 12 && player ==2)) - cout << "С головы фишку снимать больше нельзя. Введите другую позицию" << endl; - else - cout << "Здесь чужая фишка или пустая ячейка. Введите позицию заново." << endl; + cout << "Введите номер ячейки, откуда переставлять: "; cin >> pos; - } - if ((pos == 0 && player==1) || (pos==12 && player==2)) // сняли фишку с головы, больше снимать нельзя - head_chip = true; - cout << "Количество очков: "; - cin >> points; - while (val[(pos + points)%24].chip == p[player % 2]) - { - cout << "Ход невозможен, здесь чужая фишка. Введите количество очков заново или любую другую цифру, чтобы изменить ход." << endl; + while ((val[pos].chip != p[player - 1]) || (head_chip && pos == 12 && player == 2) || (head_chip && pos == 0 && player == 1)) + // если ход чужой фишкой или попытка снять еще одну с головы + { + if ((pos == 0 && player == 1) || (pos == 12 && player == 2)) + cout << "С головы фишку снимать больше нельзя. Введите другую позицию" << endl; + else + cout << "Здесь чужая фишка или пустая ячейка. Введите позицию заново." << endl; + cin >> pos; + } + if ((pos == 0 && player == 1) || (pos == 12 && player == 2)) // сняли фишку с головы, больше снимать нельзя + head_chip = true; + cout << "Количество очков: "; cin >> points; - } - for (int i = 0; i < dices.size(); i++) - if (points == dices[i]) + while (val[(pos + points) % 24].chip == p[player % 2]) { - dices.erase(dices.begin() + i); // удаляем кубик из массива кубиков - flag = true; - break; + cout << "Ход невозможен, здесь чужая фишка. Введите количество очков заново или любую другую цифру, чтобы изменить ход." << endl; + cin >> points; } + for (int i = 0; i < dices.size(); i++) + if (points == dices[i]) + { + dices.erase(dices.begin() + i); // удаляем кубик из массива кубиков + flag = true; + break; + } - if (flag) // flag - признак верности хода, меняем расположение фишки - { - val[(pos + points) % 24].chip = val[pos].chip; - val[pos].amount--; - if (val[pos].amount == 0) - val[pos].chip.erase(); // удаляем фишку, если ячейка стала пустой - val[(pos + points) % 24].amount++; + if (flag) // flag - признак верности хода, меняем расположение фишки + { + if ((player == 1 && (pos + points) <= 23) || (player == 2 && (pos + points) >= 6)) //условие того, что фишка не выйдет из дома + { + val[(pos + points) % 24].chip = val[pos].chip; + val[pos].amount--; + if (val[pos].amount == 0) + val[pos].chip.erase(); // удаляем фишку, если ячейка стала пустой + val[(pos + points) % 24].amount++; - system("cls"); - show_field(); + system("cls"); + show_field(); - if (!dices.empty()) - cout << "У вас остались следующие ходы: " << endl; - for (int i = 0; i < dices.size(); i++) - cout << dices[i] << " "; - cout << endl; - flag = false; + if (!dices.empty()) + cout << "У вас остались следующие ходы: " << endl; + for (int i = 0; i < dices.size(); i++) + cout << dices[i] << " "; + cout << endl; + flag = false; + } + } + else + cout << "Ходить из дома нельзя." << endl; + }else + { + cout << "Вы не можете ходить, ход переходит сопернику"; + Sleep(1000); + break; } } - } - else - { - cout << "Вы не можете ходить, ход переходит сопернику"; - Sleep(1000); - } + head_chip = false; player = (player % 2) + 1; //переход хода другому игроку }