Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Помогите найти ошибку в программе "я свободен"

  1. #1 Помогите найти ошибку в программе "я свободен" 
    Новичок
    Регистрация
    07.08.2011
    Сообщений
    21
    Сказал(а) спасибо
    9
    Поблагодарили 0 раз(а) в 0 сообщениях
    Помогите пожалуйста разобраться с программой . Суть программы в том,что точка движущаяся в сосуде , в какой-то момент должна попасть в горлышко сосуда , и выбравшись, появится надпись я свободен !! Проблема в том что точка пробивает стенку сосуда. все координаты пересматривал 10-ки раз , не могу понять в чем дело . на скрине показано где пробивает и координаты сосуда . я ток начал изучать графику , прошу не судить строго, если упустил какую-то мелочь

    CLS
    SCREEN 12
    LINE (100, 350)-(400, 350), 10
    LINE (100, 350)-(100, 200), 10
    LINE (100, 200)-(200, 200), 10
    LINE (200, 200)-(200, 150), 10
    LINE (400, 350)-(400, 200), 10
    LINE (400, 200)-(240, 200), 10
    LINE (240, 200)-(240, 150), 10
    x = 200
    y = 320
    f = 1
    d = 1
    1 : PSET (x, y), 4
    FOR i = 1 TO 30: NEXT i
    PSET (x, y), 0
    x = x + f
    y = y + d
    IF y = 350 THEN d = -d
    IF y = 200 AND 99 < x < 201 THEN d = -d
    IF y = 200 AND 239 < x < 401 THEN d = -d
    IF y = 200 AND 200 < x < 240 THEN GOTO 2
    IF x = 100 OR x = 400 THEN f = -f
    GOTO 1
    2 : IF x = 200 OR x = 240 THEN f = -f
    IF y = 50 THEN GOTO 3
    GOTO 1
    3 : LOCATE 20, 20: PRINT "9 na svobode !!!"

    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Вложения
    Ответить с цитированием  
     

  2. #2  
    Модератор Аватар для pingvin
    Регистрация
    11.02.2011
    Сообщений
    389
    Сказал(а) спасибо
    80
    Поблагодарили 75 раз(а) в 48 сообщениях
    Мы добрые, судить не будем. Сейчас решим
    На этом месте могло быть Ваше "Спасибо"
    Ответить с цитированием  
     

  3. #3  
    Модератор Аватар для pingvin
    Регистрация
    11.02.2011
    Сообщений
    389
    Сказал(а) спасибо
    80
    Поблагодарили 75 раз(а) в 48 сообщениях
    Извините, но дальше доработать не успеваю. И маленький вопросик. Судя по заданию кажется, что Вы учите Бейсик по книге Сафронова Игоря Константиновича "Бейсик в задачах и примерах", это так?
    Код :
    CLS
    SCREEN 12
    LINE (100, 351)-(400, 351), 10
    LINE (100, 351)-(100, 200), 10
    LINE (100, 200)-(200, 200), 10
    LINE (200, 200)-(200, 150), 10
    LINE (400, 351)-(400, 200), 10
    LINE (400, 200)-(240, 200), 10
    LINE (240, 200)-(240, 150), 10
    x = 200
    y = 320
    dx = 1
    dy = 1
    1
    PSET (x, y), 15
    FOR i = 1 TO 500: NEXT i
    IF y < 200 AND (x = 240 AND x = 200) THEN GOTO 4
    IF (x < 100) AND y > 200 THEN dx = -dx
    IF (y < 200) AND (x < 200 OR x > 240) THEN dy = -dy
    IF y > 351 THEN dy = -dy
    IF x > 400 THEN dx = -dx
    GOTO 4
    2
    dx = -dx
    IF y < 50 THEN GOTO 3
    4
    x = x + dx
    y = y + dy
    GOTO 1
    3
    LOCATE 20, 20: PRINT "9 na svobode !!!"
    На этом месте могло быть Ваше "Спасибо"
    Ответить с цитированием  
     

  4. Пользователь сказал cпасибо:

    Роман (18.08.2011)

  5. #4  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,531
    Сказал(а) спасибо
    126
    Поблагодарили 428 раз(а) в 291 сообщениях
    Записей в блоге
    6
    Можно программу сделать так: Проверять стенку не кучей условий, а проверять одну текущую точку на цвет, если этот цвет равен цвету сосуда, то повернуться, иначе идти вперёд. Текущий пиксель можно проверять командой point(x,y)
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  6. #5  
    Новичок
    Регистрация
    07.08.2011
    Сообщений
    21
    Сказал(а) спасибо
    9
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от Kakos_nonos Посмотреть сообщение
    Можно программу сделать так: Проверять стенку не кучей условий, а проверять одну текущую точку на цвет, если этот цвет равен цвету сосуда, то повернуться, иначе идти вперёд. Текущий пиксель можно проверять командой point(x,y)
    сложновато как-то
    Ответить с цитированием  
     

  7. #6  
    Новичок
    Регистрация
    07.08.2011
    Сообщений
    21
    Сказал(а) спасибо
    9
    Поблагодарили 0 раз(а) в 0 сообщениях
    Pingvin бейсик в задачах и примерах -- это да , а вот насчет Сафронова Игоря Константиновича не знаю , у меня автор не подписан . В общем я прикрепил файлик[Ссылки могут видеть только зарегистрированные пользователи. ] а по поводу программы , дело в выражениях типо A<x<b и скобках ?? прост хочу понять чего она не работает Кстати пасиб, ваша программа работает , только вот поправочка маленькая
    CLS
    SCREEN 12
    LINE (100, 351)-(400, 351), 10
    LINE (100, 351)-(100, 200), 10
    LINE (100, 200)-(200, 200), 10
    LINE (200, 200)-(200, 150), 10
    LINE (400, 351)-(400, 200), 10
    LINE (400, 200)-(240, 200), 10
    LINE (240, 200)-(240, 150), 10
    x = 200
    y = 320
    dx = 1
    dy = 1
    1
    PSET (x, y), 15
    FOR i = 1 TO 500: NEXT i
    IF y < 200 AND (x = 240 OR x = 200) THEN GOTO 2
    IF (x < 100) AND y > 200 THEN dx = -dx
    IF (y < 200) AND (x < 200 OR x > 240) THEN dy = -dy
    IF y > 351 THEN dy = -dy
    IF x > 400 THEN dx = -dx
    GOTO 4
    2
    dx = -dx
    IF y < 50 THEN GOTO 3
    4
    x = x + dx
    y = y + dy
    GOTO 1
    3
    LOCATE 20, 20: PRINT "9 na svobode !!!"
    Последний раз редактировалось Роман; 18.08.2011 в 17:51.
    Ответить с цитированием  
     

  8. #7  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Ну скока можно с ентими GOTO, непонятно ж ничего!!! Да и эти неявные циклы....
    Код :
    CLS
    SCREEN 12
    LINE (100, 351)-(400, 351), 10
    LINE (100, 351)-(100, 200), 10
    LINE (100, 200)-(200, 200), 10
    LINE (200, 200)-(200, 150), 10
    LINE (400, 351)-(400, 200), 10
    LINE (400, 200)-(240, 200), 10
    LINE (240, 200)-(240, 150), 10
    t = 10
    x = 200
    y = 320
    dx = -1
    dy = -1
     
    DO WHILE y > 150
        PSET (x, y), 15
     
        'zamedlitel 
        PauseTime = 0.001 ' cek
        Start = TIMER
        DO WHILE TIMER < (Start + PauseTime)
            '
        LOOP
        ' v butilke
        IF (y >= 200) THEN
            IF (y < 210) AND ((x > 200) AND (x < 240)) THEN 'perehod v gorlishko
                IF x >= 400 THEN dx = dx * (-1)
                IF x <= 100 THEN dx = dx * (-1)
            ELSE
                IF y >= 351 THEN dy = dy * (-1)
                IF y <= 200 THEN dy = dy * (-1)
                IF x >= 400 THEN dx = dx * (-1)
                IF x <= 100 THEN dx = dx * (-1)
            END IF
        ELSE ' v gorlishke
            IF x >= 240 THEN dx = dx * (-1)
            IF x <= 200 THEN dx = dx * (-1)
        END IF
        x = x + dx
        y = y + dy
    LOOP
     
    LOCATE 20, 20: PRINT "9 na svobode !!!"

    Ну во всяком случае с моей точки зрения. И наконец обратите внимание на замедлитель ваши 500 циклов на моем компе ничего не замедляют!
    Последний раз редактировалось Dimon012; 19.08.2011 в 13:37.
    Ответить с цитированием  
     

  9. Пользователь сказал cпасибо:

    Роман (19.08.2011)

  10. #8  
    Новичок
    Регистрация
    07.08.2011
    Сообщений
    21
    Сказал(а) спасибо
    9
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от Dimon012 Посмотреть сообщение
    Ну скока можно с ентими GOTO, непонятно ж ничего!!! Да и эти неявные циклы....

    Ну во всяком случае с моей точки зрения. И наконец обратите внимание на замедлитель ваши 500 циклов на моем компе ничего не замедляют!
    Как сказал выше , я еще новичек и операторы типо DO WHILE PauseTime Start = TIMER LOOP мне еще не знакомы . А вот структура условных операраторов норм , над ток разобраться .. А нащет замедлителя , дак quick.basic.4.5 у мя тож не замедляет , а вот на QBasic 1.0 RUS вполне норм
    Ответить с цитированием  
     

  11. #9  
    Новичок
    Регистрация
    07.08.2011
    Сообщений
    21
    Сказал(а) спасибо
    9
    Поблагодарили 0 раз(а) в 0 сообщениях
    Абадябер , буду пробовать , вродь просто
    Ответить с цитированием  
     

  12. #10  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Цитата Сообщение от Роман Посмотреть сообщение
    А нащет замедлителя , дак quick.basic.4.5 у мя тож не замедляет , а вот на QBasic 1.0 RUS вполне норм
    Обязательно разберитесь) Любой алгоритм можно и нужно реализовать без Goto. Я уже забыл, когда в программах последний раз писал это слово, также как и Label в Pascal'у). Что касается замедления, лучше используйте для него код, предложенный Diman. Процедура задержки примитивна, и вам не составит труда понять, как она работает. А именно, происходит простое ожидание по таймеру, при этом в цикле проверяется равенство текущего значения таймера (TIMER) и финального, когда надо будет выходить из цикла. Данная процедура должна корректно работать на любой машине.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  13. Пользователь сказал cпасибо:

    Роман (19.08.2011)

Страница 1 из 2 12 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. iso Образ диска win95 или win98 для "VIRTUAL PC"
    от Артем в разделе Операционные системы
    Ответов: 5
    Последнее сообщение: 09.11.2017, 09:44
  2. Ответов: 4
    Последнее сообщение: 02.12.2011, 16:39
  3. Ответов: 5
    Последнее сообщение: 24.05.2011, 12:53
  4. Ответов: 3
    Последнее сообщение: 05.03.2011, 23:46
  5. Ответов: 6
    Последнее сообщение: 09.12.2010, 18:40
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •