Важная информация
Показано с 1 по 7 из 7

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

  1. #1  
    Новичок
    Регистрация
    08.12.2010
    Сообщений
    3
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Немного истории... Решил написать игру змейку на бейсике, только начал и сразу столкнулся со следующей проблемой. Змейка по моей задумке должна состоять из 7 звеньев, то есть после наложения звена на новое место после нажатия клавиши, ещё одно звено должно наложиться на 8 лишнее звено, чтобы взаимоисключиться и стереться с экрана, НО... Звено по какой то непонятной мне причине накладывается в левый верхний угол экрана, то есть его координаты принимают значение 0 (х = 0, у = 0), хотя до этого уже было дано им новое значение... Так помогите же мне найти ошибку в моих записях

    P.S. Чтобы проверить эту задачку на практике можете копировать следующие записи в блокнот, дать ему тип имя.BAS и открыть его в бейсике. ;) либо просто открыть приложенный мною файл))

    Код qbasic:
    0  [Ссылки могут видеть только зарегистрированные пользователи. ] 12
     
     [Ссылки могут видеть только зарегистрированные пользователи. ] a%(100)
     x = 316: y = 236
     RT$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](77)
     LF$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](75)
     UP$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](72)
     DN$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](80)
     ESC$ = [Ссылки могут видеть только зарегистрированные пользователи. ](27)
     [Ссылки могут видеть только зарегистрированные пользователи. ]$ = [Ссылки могут видеть только зарегистрированные пользователи. ](32)
     ENTER$ = [Ссылки могут видеть только зарегистрированные пользователи. ](13)
      [Ссылки могут видеть только зарегистрированные пользователи. ] (316, 236)-(324, 244), 15, B
      [Ссылки могут видеть только зарегистрированные пользователи. ] (320, 240), 4, 15
      [Ссылки могут видеть только зарегистрированные пользователи. ] (316, 236)-(324, 244), a%
      [Ссылки могут видеть только зарегистрированные пользователи. ]
    98 IF i >= 7 THEN i = 1 ELSE i = i + 1
    99 s$ = [Ссылки могут видеть только зарегистрированные пользователи. ]
      SELECT CASE s$
       CASE RT$: xp = 20: yp = 10
       CASE LF$: xp = 0: yp = 10
       CASE UP$: xp = 10: yp = 0
       CASE DN$: xp = 10: yp = 20
       CASE ESC$: [Ссылки могут видеть только зарегистрированные пользователи. ] : [Ссылки могут видеть только зарегистрированные пользователи. ]
       CASE [Ссылки могут видеть только зарегистрированные пользователи. ]$: [Ссылки могут видеть только зарегистрированные пользователи. ] : GOTO 0
       CASE ELSE: GOTO 99
      [Ссылки могут видеть только зарегистрированные пользователи. ] SELECT
     
      IF i = 1 THEN GOTO 1: IF i = 2 THEN GOTO 2: IF i = 3 THEN GOTO 3: IF i = 4 THEN GOTO 4: IF i = 5 THEN GOTO 5: IF i = 6 THEN GOTO 6: IF i = 7 THEN GOTO 7
    
    1  x = x - 10 + xp: y = y - 10 + yp: x1 = x: y1 = y
       [Ссылки могут видеть только зарегистрированные пользователи. ] (x, y), a%: [Ссылки могут видеть только зарегистрированные пользователи. ] (x2, y2), a%: GOTO 98
    2  x = x - 10 + xp: y = y - 10 + yp: x2 = x: y2 = y
       [Ссылки могут видеть только зарегистрированные пользователи. ] (x, y), a%: [Ссылки могут видеть только зарегистрированные пользователи. ] (x3, y3), a%: GOTO 98
    3  x = x - 10 + xp: y = y - 10 + yp: x3 = x: y3 = y
       [Ссылки могут видеть только зарегистрированные пользователи. ] (x, y), a%: [Ссылки могут видеть только зарегистрированные пользователи. ] (x4, y4), a%: GOTO 98
    4  x = x - 10 + xp: y = y - 10 + yp: x4 = x: y4 = y
       [Ссылки могут видеть только зарегистрированные пользователи. ] (x, y), a%: [Ссылки могут видеть только зарегистрированные пользователи. ] (x5, y5), a%: GOTO 98
    5  x = x - 10 + xp: y = y - 10 + yp: x5 = x: y5 = y
       [Ссылки могут видеть только зарегистрированные пользователи. ] (x, y), a%: [Ссылки могут видеть только зарегистрированные пользователи. ] (x6, y6), a%: GOTO 98
    6  x = x - 10 + xp: y = y - 10 + yp: x6 = x: y6 = y
       [Ссылки могут видеть только зарегистрированные пользователи. ] (x, y), a%: [Ссылки могут видеть только зарегистрированные пользователи. ] (x7, y7), a%: GOTO 98
    7  x = x - 10 + xp: y = y - 10 + yp: x7 = x: y7 = y
       [Ссылки могут видеть только зарегистрированные пользователи. ] (x, y), a%: [Ссылки могут видеть только зарегистрированные пользователи. ] (x1, y1), a%: GOTO 98
      
     GOTO 99
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  2. #2  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Немного подкорректировал Ваше сообщение, старайтесь не использовать заглавных букв в названии темы и заключать код программы в теги [ code ] [ /code ]

    Основная проблема заключается в строчке.
    Код qbasic:
    IF i = 1 THEN GOTO 1: IF i = 2 THEN GOTO 2: IF i = 3 THEN GOTO 3: IF i = 4 THEN GOTO 4: IF i = 5 THEN GOTO 5: IF i = 6 THEN GOTO 6: IF i = 7 THEN GOTO 7

    В этом случае работает только первый IF, а последующие могут сработать только в случае верности первого условия, что невозможно. :) Переменная i не может быть одновременно равна 1 и 2 и 3 и т.д.

    Правильнее записать так:
    Код qbasic:
    IF i = 1 THEN GOTO 1
    IF i = 2 THEN GOTO 2
    IF i = 3 THEN GOTO 3
    IF i = 4 THEN GOTO 4
    IF i = 5 THEN GOTO 5
    IF i = 6 THEN GOTO 6
    IF i = 7 THEN GOTO 7
    Ответить с цитированием  
     

  3. #3  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Немного видоизменил Вашу программу. Из новенького - режим 320х200 256 цветов, контроль выхода змеи за границы экрана и проверка самопересечений. :)
    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    [Ссылки могут видеть только зарегистрированные пользователи. ] 13
    X% = 320 / 2
    Y% = 200 / 2
    KeyLeft$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](75)
    KeyRight$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](77)
    KeyUp$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](72)
    KeyDown$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](80)
    KeyEsc$ = [Ссылки могут видеть только зарегистрированные пользователи. ](27)
    SnakeLen% = 0
    SnakeMaxLen% = 7
    [Ссылки могут видеть только зарегистрированные пользователи. ] SnakeX(SnakeMaxLen%)
    [Ссылки могут видеть только зарегистрированные пользователи. ] SnakeY(SnakeMaxLen%)
     
    Start:
    'Risuem kusok zmei
    [Ссылки могут видеть только зарегистрированные пользователи. ] (X% - 2, Y% - 2)-(X% + 2, Y% + 2), 15, B
    [Ссылки могут видеть только зарегистрированные пользователи. ] (X%, Y%), 4, 15
     
    IF SnakeLen% < SnakeMaxLen% THEN
    'Uvelichenie dliny zmei
      SnakeLen% = SnakeLen% + 1
    ELSE
    'Zakrashivaem hvost chernym
      [Ссылки могут видеть только зарегистрированные пользователи. ] (SnakeX(SnakeMaxLen%), SnakeY(SnakeMaxLen%)), 0, 15
      [Ссылки могут видеть только зарегистрированные пользователи. ] (SnakeX(SnakeMaxLen%) - 2, SnakeY(SnakeMaxLen%) - 2)-(SnakeX(SnakeMaxLen%) + 2, SnakeY(SnakeMaxLen%) + 2), 0, B
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
     
    IF SnakeLen% = 0 THEN GOTO Golova
     
    'Sdvigaem massivy s koordinatami zmei vpravo
    FOR I = SnakeLen% TO 2 STEP -1
      SnakeX(I) = SnakeX(I - 1)
      SnakeY(I) = SnakeY(I - 1)
    NEXT I
     
    Golova:
    SnakeX(1) = X%
    SnakeY(1) = Y%
     
    'Proverka peresecheniya
    FOR I = 2 TO SnakeLen%
      IF SnakeX(I) = X% [Ссылки могут видеть только зарегистрированные пользователи. ] SnakeY(I) = Y% THEN
        GOTO EndProg
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    NEXT I
     
    'Chitaem klaviaturu
    InputKey:
    K$ = [Ссылки могут видеть только зарегистрированные пользователи. ]
    SELECT CASE K$
    CASE KeyLeft$
      IF X% > 10 THEN
        X% = X% - 5
        GOTO Start
      ELSE
        GOTO InputKey
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyRight$
      IF X% < 320 - 10 THEN
        X% = X% + 5
        GOTO Start
      ELSE
        GOTO InputKey
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyUp$
      IF Y% > 10 THEN
        Y% = Y% - 5
        GOTO Start
      ELSE
        GOTO InputKey
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyDown$
      IF Y% < 200 - 10 THEN
        Y% = Y% + 5
        GOTO Start
      ELSE
        GOTO InputKey
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyEsc$
      GOTO EndProg
    CASE ELSE
      GOTO InputKey
    [Ссылки могут видеть только зарегистрированные пользователи. ] SELECT
     
    EndProg:
    Ответить с цитированием  
     

  4. #4  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Версия 0.2. :) Теперь змея может сама ползать и умирает при выходе за границы экрана. Осталось заставить есть ее корм. :)

    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    [Ссылки могут видеть только зарегистрированные пользователи. ] 13
    X% = 320 / 2 + 2
    Y% = 200 / 2 + 2
    KeyLeft$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](75)
    KeyRight$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](77)
    KeyUp$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](72)
    KeyDown$ = [Ссылки могут видеть только зарегистрированные пользователи. ](0) + [Ссылки могут видеть только зарегистрированные пользователи. ](80)
    KeyEsc$ = [Ссылки могут видеть только зарегистрированные пользователи. ](27)
    SnakeLen% = 0
    SnakeMaxLen% = 7
    [Ссылки могут видеть только зарегистрированные пользователи. ] SnakeX(SnakeMaxLen%)
    [Ссылки могут видеть только зарегистрированные пользователи. ] SnakeY(SnakeMaxLen%)
     
    Start:
    'Risuem kusok zmei
    [Ссылки могут видеть только зарегистрированные пользователи. ] (X% - 2, Y% - 2)-(X% + 2, Y% + 2), 15, B
    [Ссылки могут видеть только зарегистрированные пользователи. ] (X%, Y%), 4, 15
     
    IF SnakeLen% < SnakeMaxLen% THEN
    'Uvelichenie dliny zmei
      SnakeLen% = SnakeLen% + 1
    ELSE
    'Zakrashivaem hvost chernym
      [Ссылки могут видеть только зарегистрированные пользователи. ] (SnakeX(SnakeMaxLen%), SnakeY(SnakeMaxLen%)), 0, 15
      [Ссылки могут видеть только зарегистрированные пользователи. ] (SnakeX(SnakeMaxLen%) - 2, SnakeY(SnakeMaxLen%) - 2)-(SnakeX(SnakeMaxLen%) + 2, SnakeY(SnakeMaxLen%) + 2), 0, B
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
     
    IF SnakeLen% = 0 THEN GOTO Golova
     
    'Sdvigaem massivy s koordinatami zmei vpravo
    FOR I = SnakeLen% TO 2 STEP -1
      SnakeX(I) = SnakeX(I - 1)
      SnakeY(I) = SnakeY(I - 1)
    NEXT I
     
    Golova:
    SnakeX(1) = X%
    SnakeY(1) = Y%
     
    'Proverka peresecheniya
    FOR I = 2 TO SnakeLen%
      IF SnakeX(I) = X% [Ссылки могут видеть только зарегистрированные пользователи. ] SnakeY(I) = Y% THEN
        GOTO EndProg
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    NEXT I
     
    'Chitaem klaviaturu
    InputKey:
    Kold$ = K$
    K$ = [Ссылки могут видеть только зарегистрированные пользователи. ]
    IF [Ссылки могут видеть только зарегистрированные пользователи. ](K$) = 0 THEN
    K$ = Kold$
    ELSE
    GOTO NoDelay
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
     
    'Zaderzhka
    Timx = 0
    Tim1 = [Ссылки могут видеть только зарегистрированные пользователи. ]
    Tim2 = [Ссылки могут видеть только зарегистрированные пользователи. ] - Tim1
    DO WHILE Timx < .1
      Timx = [Ссылки могут видеть только зарегистрированные пользователи. ] - Tim1 - Tim2
    LOOP
    NoDelay:
     
    SELECT CASE K$
    CASE KeyLeft$
      IF X% > 4 THEN
        X% = X% - 5
        GOTO Start
      ELSE
        GOTO EndProg
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyRight$
      IF X% < 320 - 4 THEN
        X% = X% + 5
        GOTO Start
      ELSE
        GOTO EndProg
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyUp$
      IF Y% > 2 THEN
        Y% = Y% - 5
        GOTO Start
      ELSE
        GOTO EndProg
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyDown$
      IF Y% < 200 - 4 THEN
        Y% = Y% + 5
        GOTO Start
      ELSE
        GOTO EndProg
      [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    CASE KeyEsc$
      GOTO EndProg
    CASE ELSE
      GOTO InputKey
    [Ссылки могут видеть только зарегистрированные пользователи. ] SELECT
     
    EndProg:
    Ответить с цитированием  
     

  5. #5  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Создал для своего питона отдельную тему. [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  6. #6  
    Новичок
    Регистрация
    08.12.2010
    Сообщений
    3
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Спасибо ОГРОМНОЕ! Не знал куда обратиться, чтоб ошибку нашли, ещё раз спасибо, хотя до всего остального я бы сам дошёл, ведь это и было моей целью, а эти записи просто начало, в котором я столкнулся с непонятной для меня проблемой, которая в принципе заключается в невнимательности)) СПАСИБО!!! :D
    Ответить с цитированием  
     

  7. #7  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Dimanper, пожалуйста. Я только предложил свое решение, развивайте свой вариант, я уверен, что в итоге он получится лучше моего.
    Ответить с цитированием  
     

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

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

Похожие темы

  1. Ребят, помогите понять суть программы.
    от gernsback в разделе Turbo Pascal
    Ответов: 9
    Последнее сообщение: 14.03.2012, 03:21
  2. Помогите понять программу
    от Black Doomer в разделе QBasic
    Ответов: 1
    Последнее сообщение: 15.12.2011, 18:12
  3. Ответов: 14
    Последнее сообщение: 23.08.2011, 01:06
  4. Ответов: 5
    Последнее сообщение: 24.05.2011, 12:53
  5. Ответов: 3
    Последнее сообщение: 05.03.2011, 23:46
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •