Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Встреча двух игроков, ошибка или конфликт версий Visual C++ 
V
    Опции темы
Kirill89
Дата 9.2.2007, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include "stdafx.h"
#include "iostream.h"
#include "fstream.h"
#include "windows.h"
#include "stdlib.h"

void srand(){
    GetTickCount();
}

class CGame{
public:

    int pole[10][10];
    bool isover;
    bool isover2;

    void gen(){
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                pole[i][j]=0;
            }
        }
        pole[0][0]=1;
        pole[9][9]=2;
        isover=false;
        isover2=false;
    }

    void show(){
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                if(j==0){cout<<"\n";}
                cout<<pole[i][j];
            }
        }
    }

    bool iswin(){
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                if(pole[i][j]==3){
                    isover=true;
                    return true;
                }else{
                    return false;
                }
            }
        }
    }

    bool islose(int x,int y){
        if(x<0 || x>9 || y<0 || y>9){
            isover=true;
            return true;
        }
        else{
            return false;
        }
    }

    void move1(int nomer,char a){
        int m;
        switch(a){
        case 'r':
            m=1;
            break;
        case 'l':
            m=2;
            break;
        case 'u':
            m=3;
            break;
        case 'd':
            m=4;
            break;
        default:
            m=0;
        }
        if(nomer==1)
        {
            for(int i=0;i<10;i++){
                for(int j=0;j<10;j++){
                    if(m==1)
                    {
                        if(islose(i+1,j)){isover2=true;return;}
                        if(pole[i][j]==1 && pole[i+1][j]!=2)
                        {
                            pole[i][j]=0;
                            pole[i+1][j]=1;
                            return;
                        }
                        if(pole[i+1][j]==2){pole[i+1][j]=3;pole[i][j]=0;return;}
                    }
                    if(m==2)
                    {
                        if(islose(i-1,j)){isover2=true;return;}
                        if(pole[i][j]==1 && pole[i-1][j]!=2)
                        {
                            pole[i][j]=0;
                            pole[i-1][j]=1;
                            return;
                        }
                        if(pole[i-1][j]==2){pole[i-1][j]=3;pole[i][j]=0;return;}
                    }
                    if(m==3)
                    {
                        if(islose(i,j+1)){isover2=true;return;}
                        if(pole[i][j]==1 && pole[i][j+1]!=2)
                        {
                            pole[i][j]=0;
                            pole[i][j+1]=1;
                            return;
                        }
                        if(pole[i][j+1]==2){pole[i][j+1]=3;pole[i][j]=0;return;}
                    }
                    if(m==4)
                    {
                        if(islose(i,j-1)){isover2=true;return;}
                        if(pole[i][j]==1 && pole[i][j-1]!=2)
                        {
                            pole[i][j]=0;
                            pole[i][j-1]=1;
                            return;
                        }
                        if(pole[i][j-1]==2){pole[i][j-1]=3;pole[i][j]=0;return;}
                    }
                }
            }
        }
        if(nomer==2)
        {
            for(int i=0;i<10;i++){
                for(int j=0;j<10;j++){
                    if(m==1)
                    {
                        if(islose(i+1,j)){isover2=true;return;}
                        if(pole[i][j]==2 && pole[i+1][j]!=1)
                        {
                            pole[i][j]=0;
                            pole[i+1][j]=2;
                            return;
                        }
                        if(pole[i+1][j]==1){pole[i+1][j]=3;pole[i][j]=0;return;}
                    }
                    if(m==2)
                    {
                        if(islose(i-1,j)){isover2=true;return;}
                        if(pole[i][j]==2 && pole[i-1][j]!=1)
                        {
                            pole[i][j]=0;
                            pole[i-1][j]=2;
                            return;
                        }
                        if(pole[i-1][j]==1){pole[i-1][j]=3;pole[i][j]=0;return;}
                    }
                    if(m==3)
                    {
                        if(islose(i,j+1)){isover2=true;return;}
                        if(pole[i][j]==2 && pole[i][j+1]!=1)
                        {
                            pole[i][j]=0;
                            pole[i][j+1]=1;
                            return;
                        }
                        if(pole[i][j+1]==1){pole[i][j+1]=3;pole[i][j]=0;return;}
                    }
                    if(m==4)
                    {
                        if(islose(i,j-1)){isover2=true;return;}
                        if(pole[i][j]==2 && pole[i][j-1]!=1)
                        {
                            pole[i][j]=0;
                            pole[i][j-1]=1;
                            return;
                        }
                        if(pole[i][j-1]==1){pole[i][j-1]=3;pole[i][j]=0;return;}
                    }
                }
            }
        }
    }
};

void main()
{
    int l=0;
    cout<<"zadanie 1"<<"\n";
    CGame game;
    game.gen();
    //game.show();
    char a[5];
    int b[5];
    for(int i=0;i<5;i++){
        cin>>b[i];
        cin>>a[i];
        if(a[i]=='e' || b[i]==0){goto m1;}else{l++;}
    }
m1:
    for(int m=0;m<l;m++){
        for(int n=0;n<b[m];n++){
            game.move1(1,a[m]);
            game.show();
            cout<<"\n";
        }
    }

    ////////////////////////////
    l=0;
    for(int q=0;q<5;q++){
        a[q]=' ';
        b[q]=1;
    }
    ////////////////////////////
    for(int w=0;w<5;w++){
        cin>>b[w];//вот это место пропускается напрочь!//////////////////////////////
        cin>>a[w];//Никакого ввода нет и в помине!
        if(a[w]=='e' || b[w]==0){goto m2;}else{l++;}
    }
m2:
    for(int z=0;z<l;z++){
        for(int x=0;x<b[z];x++){
            game.move1(2,a[z]);
            game.show();
            cout<<"\n";
        }
    }
    if(game.iswin()){
        cout<<"win"<<"\n";
        for(int p=0;p<10;p++){
            for(int o=0;o<10;o++){
                if(game.pole[p][o]==3){
                    cout<<"x:"<<p<<"\n";
                    cout<<"y:"<<o<<"\n";
                }
            }
        }
    };
    if(game.iswin()!=true && !game.isover==true){cout<<"no"<<"\n";};
    if(game.isover2){cout<<"error!"<<"\n";};
}



Для, собственно своего, удобства опубликовал весь код. Пропускается второй ввод. Ввожу строку для первого, жму ентер, всё - конец программы! а где второй ввод!?
Помогите пожалуйста разобраться!


--------------------
PM MAIL WWW   Вверх
tht
Дата 9.2.2007, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня все работает...
правда я компилировал это дело в С++ 2005
 потому мне пришлось кое что добавить и подправить
объявления заголовков стало выглядеть так:
Код

#include <iostream>
#include <fstream>
#include <windows.h>
#include <stdlib.h>
#include <istream>
#include <ostream>


а в самом начале *.cpp проекта дабавил
Код

using namespace std;

не знаю на самом деле зачем это нада было добавлять. так было в msdn написано в примере.
 и вообще пока такие изменения не сделал компилятор выводил ошибку о несуществовании cout и cin 

Это сообщение отредактировал(а) tht - 9.2.2007, 05:20
PM MAIL   Вверх
vinter
Дата 9.2.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата
Для, собственно своего, удобства опубликовал весь код


ну раз тебе удобно то разбирайся сам.. а мне лень просматривать кучу текста, искать в нем ошибку.. приведи кусок текста где происходит ошибка, а весь код не нужен..


--------------------
Мой блог
PM MAIL WWW   Вверх
Kirill89
Дата 10.2.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  9.2.2007,  13:12 Найти цитируемый пост)
ну раз тебе удобно то разбирайся сам.. а мне лень просматривать кучу текста, искать в нем ошибку.. приведи кусок текста где происходит ошибка, а весь код не нужен.. 

нет, там есть пометка где конкретно не работает. просто я неуверен, что ошибка заключена именно в этих строках.
Код

    ////////////////////////////
    for(int w=0;w<5;w++){
        cin>>b[w];//вот это место пропускается напрочь!//////////////////////////////
        cin>>a[w];//Никакого ввода нет и в помине!
        if(a[w]=='e' || b[w]==0){goto m2;}else{l++;}
    }
m2:


tht, работает 2 ввода подряд?!

Это сообщение отредактировал(а) Kirill89 - 10.2.2007, 17:30


--------------------
PM MAIL WWW   Вверх
SerpentVV
Дата 10.2.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Цитата(tht @ 9.2.2007,  05:17)
а в самом начале *.cpp проекта дабавил
Код

using namespace std;

не знаю на самом деле зачем это нада было добавлять. так было в msdn написано в примере.
 и вообще пока такие изменения не сделал компилятор выводил ошибку о несуществовании cout и cin

Именно! стандартная библиотека "обернута" в стандартное пространство имен std. При использовании имен из него нужно либо писать явный префикс
std::cin
std::cout

или использовать директиву using
using namespace std;

можно еще писать
using std::cin;
using std::cout;


PM MAIL   Вверх
Kirill89
Дата 10.2.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



дописал, всё равно не работает... и даже если 
Цитата(SerpentVV @  10.2.2007,  19:18 Найти цитируемый пост)
Именно! стандартная библиотека "обернута" в стандартное пространство имен std. При использовании имен из него нужно либо писать явный префикс

почему первый ввод работает?


--------------------
PM MAIL WWW   Вверх
vinter
Дата 11.2.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



оба ввода работают
а заголовки должны выглядеть след. образом
Код

#include "stdafx.h"
#include <iostream.h>
#include <fstream.h>
#include <windows.h>
#include <stdlib.h>

нечего компилятор путать! и лишний раз гонять.smile


--------------------
Мой блог
PM MAIL WWW   Вверх
Kirill89
Дата 11.2.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  11.2.2007,  15:41 Найти цитируемый пост)
оба ввода работают
а заголовки должны выглядеть след. образом

код C++
1:
2:
3:
4:
5:

#include "stdafx.h"
#include <iostream.h>
#include <fstream.h>
#include <windows.h>
#include <stdlib.h>





нечего компилятор путать! и лишний раз гонять. 


Я прописал всё в точности как написано. Вторго ввода нет. Я в этом абсолютно уверен! У меня visual studio 6.0, причем, если бы этот глюк был только у меня, я бы даже спрашивать не стал. Этот код неработает именно на 6.0, как я понял... Почему?



--------------------
PM MAIL WWW   Вверх
SerpentVV
Дата 11.2.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Ну понятно... Просто использовалась старая форма заголовков...
Но <iostream.h> отличается от <iostream>
Правда, не знаю как с этим в VC++6...
А в новых - точно отличается...

PM MAIL   Вверх
Kirill89
Дата 12.2.2007, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я, конечно, могу увеличить массив, сделать один длинный ввод, но всё-равно, мне очень интересно, почему на 6.0 - ничего, а на 2005 - всё отлично...  smile  


--------------------
PM MAIL WWW   Вверх
sergejzr
Дата 12.2.2007, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Внимание! Эта тема не соответствует правилам форума

Заголовок темы не отражает её суть, или несколько вопросов в одной теме.

Ознакомьтесь с правилами! http://forum.vingrad.ru/act-SR/f-27.html

Тема перенесена в Центр Помощи


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Kirill89
Дата 12.2.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Очень мило! При чем тут центор помощи!? Программа работает, или, во всяком случае, почти работает... Я просто немогу понять почему неработает на visual C++ 6.0. Или, как алтернатива, как, не меняя основной класс заставить её работать?!
Извините, возможно я незнаю всех тонкостей, но эта тема, по моему мнению, должна находится на форуме С++!


--------------------
PM MAIL WWW   Вверх
zkv
Дата 13.2.2007, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Kirill89 @  12.2.2007,  20:43 Найти цитируемый пост)
Или, как алтернатива, как, не меняя основной класс заставить её работать?!

можно было бы подсказать, если понятно пояснишь что делает прога, особенно в main() ты что пытаешься ввести? и где проверки валидности введенных данных? Где приглашения ко вводу? Вываливается голый экран и что дальше делать хз. 

А вообще многое не нравится в твоей проге, я бы ни в жизнь такую не зачел smile 
 - ужасный интерфейс 
 - использование меток, хотя вполне break'ами можно обойтись 
 - отсутствие проверки введенных данных 
 - main почему то ничего не возвращает 
 - пачка ненужных пустых операторов
 - в метод CGame::move1 (замечательный выбор имени для метода) вообще страшно заглядывать

Это все не заглядывая в логику, что там не знаю, не пытался понять smile

Вообще проблема имхо кроется в использовании cin>> для char'а, не знаю что именно происходит, потому что не знаю, как такой ввод должен реагировать на всякие служебные+пробельные символы, и не знаю что у тебя должно вводиться. 
PM MAIL   Вверх
sergejzr
Дата 13.2.2007, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Kirill89 @  12.2.2007,  19:43 Найти цитируемый пост)
Извините, возможно я незнаю всех тонкостей, но эта тема, по моему мнению, должна находится на форуме С++! 

А почитать предупреждение влом? smile
Называйте темы свои нормально, тогда их никто трогать не будет. А темы с такими названиями вообще-то в мусорку надо сразу выкидывать.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Kirill89
Дата 13.2.2007, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zkv, насамом деле я писал это задание для олимпиады в колледже, но ни у кого оно не получилось в силу разнообразных причин. Как Вы понимаете, я писал его вспешке, и поэтому оно выглядит столь неприглядно. Те, кто проверяли это задание тоже несмогли понять почему неработает вродебы вполне рабочая его чать. Этот вопрос я задал задолго после олимпиады ради собственного интереса.
Цель программы написать алгоритм движения так, чтобы игроки (1 и 2 на поле нулей) встретились где-либо.
Входные данные (например): 
3 r(right) 2 u(up) e(end)
1 l(left) 2 d(down) e(end)
Выходные:
no (если они не встретились)
OK (если встретились)
error (если один покинул предела поля.)

Вы говорите, что "проблема имхо кроется в использовании cin>> для char'а", тогда почему один раз он читает данные и совершает необходимые действия, а второй раз - пропускает ввод?  smile 

sergejzr, извините ещё раз, постараюсь более не совершать подобных ошибок.


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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