Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> do while и неверный ввод с клавиатуры 
:(
    Опции темы
heforma
Дата 11.11.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



Здравствуйте! у меня проблема =(

Код

#include <iostream>
using namespace std;
struct fild{
    unsigned point:3;
};
const int size=12;
fild plr[size][size];//Поле игрока
fild shot[size][size];//Стрельбище игрока
fild cmp[size][size];//Поле копьютера
int ScorePlr=16;//Количество возможных попаданий в играка
int ScoreCmp=16;//Количество возможных попаданий в компьютер
void Begin()//Первичная инициализация
{
    for(int i=0;i<size;i++)
    {
        for(int j=0;j<size;j++)
        {
        if(i==0||i==size-1||j==0||j==size-1)
        {
            plr[i][j].point=4;
            shot[i][j].point=4;
            cmp[i][j].point=4;
        }
        else
        {
        plr[i][j].point=0;
        shot[i][j].point=0;
        cmp[i][j].point=0;
        }
        }
    }
}
void ShipInAuto()//Функция автаматической растановки кораблей
{

}
void ShipInPlr()//Функция ручной растановки кораблей
{
    int X,Y;
    cout<<"Расставте корабли\n"<<endl;
    cout<<"Четырех палубный"<<endl;
    cout<<"Координата (X) | ";
    cin>>X;
    cout<<"Координата (Y) | ";
    cin>>Y;

}
void Show()//Функция отображения поля
{
    cout<<"   0123456789\t 0123456789\n";
    for(int i=0;i<size;i++)
    {
        if(i>0&&i<11)cout<<i-1<<' ';
        else cout<<"  ";
        for(int j=0,k=-size;j<size*2;j++,k++)
        {
            if(j<size)
            {
                if(plr[i][j].point==0) cout<<' ';//Пусто
                if(plr[i][j].point==1) cout<<'X';//Корабль
                if(plr[i][j].point==2) cout<<'*';//Воронка
                if(plr[i][j].point==3) cout<<' ';//Вокруг корабля
                if(plr[i][j].point==4) cout<<'#';//рамка
            }
            else
            {
                if(shot[i][k].point==0) cout<<' ';
                if(shot[i][k].point==1) cout<<'X';
                if(shot[i][k].point==2) cout<<'*';
                if(shot[i][k].point==3) cout<<' ';
                if(shot[i][k].point==4) cout<<'#';
            }
            if(j==size-1) cout<<"\t";
        }
        if(i>0&&i<11)cout<<' '<<i-1;
        else cout<<"  ";
        cout<<endl;
    }
    cout<<"   0123456789\t 0123456789\n";
    cout<<endl;
}
void PlrShot()//Функция выстрел игрока
{
    int X,Y;
    cout<<"Введите координаты выстрела X и Y\n\n";
    cout<<"Введите X ";
    do
    {
    cin>>X;
    if(X<0||X>9) cout<<"\nПо данным разведки,\nв этом квадрате не может быть кораблей врага!\nПовторите ввод!\n"<<endl;
    }
    while(X<0||X>9);
    X++;
    cout<<"Введите Y ";
    do
    {
    cin>>Y;
    if(Y<0||Y>9) cout<<"\nПо данным разведки,\nв этом квадрате не может быть кораблей врага!\nПовторите ввод!\n"<<endl;
    }
    while(Y<0||Y>9);
    Y++;
    if(shot[Y][X].point==2||shot[X][Y].point==1)
    {
    cout<<"Вы уже производили выстрел в этот квадрат!"<<endl;
    cout<<"Повторите ввод!"<<endl;
    PlrShot();
    }
    else
    {
    if(cmp[Y][X].point==0)
    {
        cout<<"Капитан мы промахнулись!\n";
        shot[Y][X].point=2;
    }
    else
    {
        cout<<"Точно в цель!\nЕщё не много и мы потопим весь их флот!\n";
        shot[Y][X].point=1;
    }
    }
}
void CmpShot()//Функция выстрел компьютера
{

}
void main(){
    setlocale(0,"");
    Begin();
    for(;;)
    {
    Show();
    PlrShot();
    }
}


При вводе любой буквы цикл залипает =(
Что делать?
PM MAIL   Вверх
Фантом
Дата 12.11.2011, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(heforma @  11.11.2011,  23:49 Найти цитируемый пост)
Что делать? 

Вводить символ, а затем проверять его содержимое на корректность.
PM   Вверх
Lols
Дата 12.11.2011, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 21.10.2011

Репутация: нет
Всего: нет



И так все необходимые символы? А проще можно?
PM MAIL   Вверх
heforma
Дата 12.11.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



Цитата(Lols @ 12.11.2011,  02:44)
И так все необходимые символы? А проще можно?

Проще, это игра морской бой, выстрелы игроком производятся с цифровой клавиатуры, указывается строка и столбик массива, если ввести символ алфавита тогда цикл становиться бесконечным и восстановить игру становиться не возможным

Добавлено @ 09:25
Цитата(Фантом @ 12.11.2011,  00:34)
Цитата(heforma @  11.11.2011,  23:49 Найти цитируемый пост)
Что делать? 

Вводить символ, а затем проверять его содержимое на корректность.

Код

do
    {
    cin>>X;
    if(X<0||X>9) cout<<"\nПо данным разведки,\nв этом квадрате не может быть кораблей врага!\nПовторите ввод!\n"<<endl;
    }
    while(X<0||X>9);


я проверяю на корректность.

Это сообщение отредактировал(а) heforma - 12.11.2011, 09:26
PM MAIL   Вверх
fish9370
Дата 12.11.2011, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(heforma @  12.11.2011,  09:23 Найти цитируемый пост)

Код

do    {    
          cin >> X;    
          if (X < 0 || X > 9) 
                cout << "\nПо данным разведки," 
                       << "\nв этом квадрате не может быть кораблей врага!\n" 
                       << "Повторите ввод!\n"
                      << endl;    
}    while(X < 0 || X > 9);




Цитата(heforma @  12.11.2011,  09:23 Найти цитируемый пост)
я проверяю на корректность.


ты не правильно понимаешь работу потокового ввода-вывода, если у тебя X объявлен как int, и ты указал что в него должны поступить данные, то он и будет ждать int. 
естественно, что если ты введешь не int, он все еще будет ждать int - твое зависание.

как решить проблему?

у меня есть два способа:
считывать данные не в int а в char, а потом конвертировать в int (например atoi(ch) - '0'), либо воспользоваться встроенным механизмом проверки ошибок в потоках если ты возьмешь документацию по cin то ты увидишь там кучу методов для этого.

думаю сейчас тебе кто-то набросает пример. 

Это сообщение отредактировал(а) fish9370 - 12.11.2011, 10:08


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1828 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.