1 Отредактировано garnizon (30-12-2021 20:35)

Тема: Война в горах

Война в горах

http://agatcomp.ru/agat/Software/Game/L … orah.shtml

В принципе игра работает как под Бейсик60 так и под ИКП-бейсик.

Но, если снаряд вылетает за пределы экрана, в ИКП игра сбрасывается с ошибкой (в аттаче картинка).
Это опять косяки ИКП-Бейсика?


Если после срабатывания ошибки набрать ?Х получим число 128.
Вообще-то в этой игрушке используются случайные числа, возможно, в зависимости от них она может и на бейсике-60 упасть при удачном стечении обстоятельств? Но мне не удало, как ни старался, под Б60 получить ошибку.
Там что-то вроде того, что X выходит за допустимый диапазон. Он должен быть в районе 0-127.

Воспроизвести можно так:
на вопрос "вы будете играть один" ответить "N"
на вопрос "уровень сложности - "9"
В игре ввести координаты - скорость снаряда: 30, угол вылета: 45.

На страничке сайта есть диск с Б60 для семерки, и диск с ИКП для девятки. Файл игры на обоих дисках одинаков.

    0  GOSUB 5002
    3  DIM A(129)
    5  GOSUB 3000
    9  GOSUB 5200
   10  HTAB 2: VTAB 29
   20  PRINT "ВЫ БУДEТЕ ИГРАТЬ ОДИН ? (Y/N):"
   30  GET ASK$
   40  GOSUB 5200
   50  IF ASK$ = "Y" THEN  HTAB 10: VTAB 29: INPUT "ВАШЕ ИМЯ ? :";NAME1$:C = 1:NAME2$ = "MASHINE": GOTO 120
   60  IF ASK$ <  > "N" THEN 10
   65 C = 0
   70  HTAB 4: VTAB 29
   80  INPUT "КТО СИДИТ СЛЕВА ? :";NAME1$
   90  GOSUB 5200
  100  HTAB 4: VTAB 29
  110  INPUT "КТО СИДИТ СПРАВА? :";NAME2$
  115  GOTO 165
  120  GOSUB 5200
  130  HTAB 5: VTAB 29
  140  INPUT "СТЕПЕНЬ СЛОЖНОСТИ (1-9):";SLG
  150  IF (SLG > 9) OR (SLG < 1) THEN 120
  160 C = 1
  165  GOSUB 5200
  170  HTAB 12: VTAB 29
  180  PRINT "ОТЛИЧНО !!!"
  480 GE = 10
  490  DEF  FN D(X) =  INT ( RND (7) * X)
  500  REM ===ГРАНИЦЫ===
  510  REM 
  520 PL1Y = 127 -  FN D(60)
  530 PL2Y = 127 -  FN D(60)
  540 PL1X = 5 +  FN D(20)
  550 PL2X = 122 -  FN D(20)
  560 SRX = PL1X +  FN D(78)
  570 SRY = 127 -  FN D(90)
  580  REM -------------
  590  REM ==МАССИВ ГР==
  600  REM 
  620  FOR I = 0 TO PL1X
  630 A(I) = PL1Y
  640  NEXT 
  650 DLIN = SRX - PL1X
  660 VIS = PL1Y - SRY
  670  IF DLIN = 0 THEN 710
  680  FOR I = 1 TO DLIN
  690 A(PL1X + I) =  -  INT (I * VIS / DLIN) + PL1Y - 1
  700  NEXT 
  710 DLIN = PL2X - SRX
  720 VIS = PL2Y - SRY
  730  IF DLIN = 0 THEN 770
  740  FOR I = 1 TO DLIN
  750 A(PL2X - I) =  -  INT (I * VIS / DLIN) + PL2Y - 1
  760  NEXT 
  770  FOR I = PL2X TO 127
  780 A(I) = PL2Y
  790  NEXT 
  800  REM -------------
  810  REM ===РИСУЕМ ГР===
  820  REM 
  825  MGR= 2
  830  COLOR= 2
  840  PLOT 0,PL1Y TO PL1X,PL1Y
  850  PLOT  TO SRX,SRY TO PL2X,PL2Y TO 127,PL2Y
  855 X1 =  FN D(PL1X - 5)
  856 X2 = PL2X +  FN D(122 - PL2X)
  860  REM 
  862  GOSUB 880
  864  GOTO 1040
  870  REM ===ПРОВЕРКА===
  880  REM 
  890  COLOR= 2
  900  FOR I = O TO 127
  910  PLOT I,A(I) TO I,127
  920  NEXT 
  930  REM 
  940  REM ===СТАВИМ АПР===
  950  REM 
  980  REM 
  990  COLOR= 1
 1000  FOR I = 1 TO 5
 1010  PLOT X1,PL1Y - I TO X1 + 4,PL1Y - I
 1020  PLOT X2,PL2Y - I TO X2 + 4,PL2Y - I
 1030  NEXT 
 1035  RETURN 
 1040  REM 
 1050  REM === ИГРА ===
 1060  REM 
 1070 H =  INT ( RND (7) + 0.5)
 1080  GET ASK$
 1085 X = 0:Y = 0:
 1087 ALFA = 0:V = O
 1090  IF H = 0 THEN X0 = X2:XSP = X2:XD = X1 + 4:ST = 1:Y0 = PL2Y - 5:K$ = NAME1$:YN = PL1Y - 5: GOTO 1110
 1100  IF H = 1 THEN X0 = X1:XSP = X1 + 4:XD = X2:ST =  - 1:Y0 = PL1Y - 5:K$ = NAME2$:YN = PL2Y - 5
 1105  IF (C = 1) AND (H = 1) THEN 5700
 1110  REM === ТЕКСТ ===
 1120  REM 
 1130  TEXT= 6
 1140  HOME 
 1145  IF H = 0 THEN SV = SV1
 1146  IF H = 1 THEN SV = SV2
 1150  HTAB 5
 1160  VTAB 5
 1170  PRINT "ВНИМАНИЕ ";K$", ВАШ ХОД!"
 1180  HTAB 5
 1190  VTAB 13
 1200  PRINT "СКОРОСТЬ СНАРЯДА (";SV;")";
 1201  INPUT ":";V
 1202  IF H = 0 THEN SV1 = V
 1203  IF H = 1 THEN SV2 = V
 1210  HTAB 5
 1220  VTAB 17
 1228  IF H = 0 THEN SAL = SAL1
 1229  IF H = 1 THEN SAL = SAL2
 1230  PRINT "УГОЛ ВЫЛЕТА (";SAL;")";
 1231  INPUT ":";SAL
 1232  IF H = 0 THEN SAL1 = SAL
 1233  IF H = 1 THEN SAL2 = SAL
 1240  IF (SAL < 0) OR (SAL > 90) THEN 1210
 1250 ALFA = SAL * 3.1415 / 180
 1255  HOME 
 1260  MGR= 2
 1270  GOSUB 880
 1300  GET A$
 1310  COLOR= 3
 1340  REM 
 1350  REM ===ЦИКЛ===
 1351  REM 
 1352 TALI =  TAN (ALFA)
 1353 PP = GE / 2 / V / V / ( COS (ALFA) ^ 2)
 1360  REM 
 1365 K = 0
 1370 X = XD
 1380 X = X + ST
 1385 K = K + 1
 1390 Y = YN -  INT (K * (TALI - K * PP))
 1400  IF (X < X0) OR (X > X0 + 4) THEN 1430
 1410  IF (X = XSP) AND (Y > Y0) AND (Y < Y0 + 5) THEN 1510
 1420  IF (Y > Y0) AND (X <  > XSP) THEN 1510
 1430  IF Y >  = A(X) THEN  COLOR= 1: PLOT X,A(X): GOTO 1482
 1440  IF (X = 0) OR (X = 128) THEN 1481
 1450  IF Y >  = 0 THEN  PLOT X,Y
 1475 I = X:T = 10: GOSUB 5000
 1480  GOTO 1380
 1481  HOME : IF (C = 1) AND (H = 1) THEN XPOP = X
 1482  IF H = 0 THEN H = 1: GOTO 1486
 1485  IF H = 1 THEN H = 0
 1486  GET ASK$
 1487  GOTO 1085
 1490  REM 
 1500  REM === ВЗРЫВ ===
 1510  REM 
 1520  FOR I = 1 TO 9
 1530  COLOR= I
 1540  FOR J = 1 TO 5
 1550  PLOT X0,Y0 + 5 - J TO X0 + 4,Y0 + 5 - J
 1560  NEXT 
 1570  NEXT 
 1572 XPOP = 0
 1575  FOR ROK = 0 TO 15
 1580 I = 210:T = 1: GOSUB 5000
 1590 I = 255: GOSUB 5000
 1600  NEXT 
 1610  FOR I = 0 TO 20
 1620 CL =  RND (7) * 8
 1630  COLOR= CL
 1640  PLOT XSP + ST * 4,Y0 + 4 TO  RND (7) * 70, RND (7) * 40
 1660  REM =  RND (7) * 254 + 1:T = 20
 1670  REM OSUB 5000
 1680  NEXT 
 1690  GET ASK$
 1700  GOSUB 3000
 1710  GOSUB 5200
 1720  HTAB 6: VTAB 29
 1730  PRINT "ИГРАЕМ ТАК ЖЕ ? (Y/N)"
 1740  GET ASK$
 1750  IF ASK$ = "Y" THEN 165
 1760  IF ASK$ = "N" THEN 9
 1780  GOTO 1710
 3000  REM 
 3010  REM ===ЗАСТАВКА===
 3020  REM 
 3030  TEXT= 6
 3040  HOME 
 3050  RIBBON= 7
 3060  HTAB 14
 3070  VTAB 11
 3080  PRINT "ВОЙНА"
 3090  HTAB 16
 3100  VTAB 14
 3110  PRINT "В"
 3120  HTAB 14
 3130  VTAB 17
 3140  PRINT "ГОРАХ"
 3150  FOR I = 1 TO 10
 3160  HTAB 9
 3170  VTAB 4
 3180  RIBBON= 1
 3190  PRINT " СДЕЛАНО В СССР"
 3200  NEXT 
 3210  HTAB 7
 3220  VTAB 22
 3230  PRINT "____________________"
 3240  HTAB 7
 3250  VTAB 21
 3260  PRINT "******        ******"
 3270  HTAB 14
 3280  VTAB 21
 3290  RIBBON= 1
 3300  FLASH 
 3310  PRINT "ПРИВЕТ"
 3320  NORMAL 
 3330  HTAB 12
 3340  VTAB 25
 3341  RIBBON= 1
 3350  PRINT " ДМИТРИЕВ "
 3360  FOR I = 2 TO 31
 3370  VTAB 1
 3380  HTAB I
 3390  PRINT "*"
 3400  VTAB 2
 3410  HTAB I
 3420  PRINT "*"
 3430  VTAB 6
 3440  HTAB I
 3450  PRINT "*"
 3460  VTAB 27
 3470  HTAB I
 3480  PRINT "*"
 3490  VTAB 31
 3500  HTAB I
 3510  PRINT "*"
 3520  VTAB 31
 3530  HTAB I
 3540  PRINT "*"
 3550  NEXT 
 3560  RIBBON= 2
 3570  VTAB 29
 3580  HTAB 12
 3590  PRINT "ВЕРСИЯ 1.0"
 3595  GET ASK$
 4000  RETURN 
 5000  POKE 768,I: POKE 769,T
 5001  CALL 770: RETURN 
 5002  DATA     160,0,174,0,3,173,48,192
 5003  DATA     136,208,5,206,1,3,240,5
 5004  DATA     202,208,245,240,237,96,256
 5005 A = 770
 5006  READ X
 5007  IF X = 256 THEN  RETURN 
 5008  POKE A,X
 5009 A = A + 1
 5010  GOTO 5006
 5200  VTAB 29
 5210  PRINT "                               "
 5220  RETURN 
 5700  IF XPOP = 0 THEN ALFA = 45:KONT = 10:PALFA = 45: GOTO 5730
 5710  IF XPOP > XSP THEN ALFA = PALFA + 40
 5720  IF XPOP < XSP THEN ALFA = PALFA - 5
 5730  IF  INT ( RND (7) + 0.5) = 1 THEN ZK =  - 1: GOTO 5750
 5740 ZK = 1
 5750 ALFA = PALFA
 5760 ALFA = ALFA * 3.1415926 / 180
 5765 YUS = PL2Y - PL1Y
 5767 XUS = PL2X - PL1X
 5771 OO = ZK * ( RND (7) + 1) * KONT * 10 / SLG
 5773 LL = GE * XUS * XUS / 2 /  COS (ALFA) /  COS (ALFA) / (ALFA *  TAN (ALFA) - YUS)
 5774 V =  SQR ( ABS (LL)) + OO
 5780  IF KONT <  > 0 THEN KONT = KONT - 1
 5785  COLOR= 7
 5790  GOTO 1352
  
Post's attachments

ERR.png, 1.41 kb, 459 x 182
ERR.png 1.41 kb, 108 downloads since 2021-12-30 

2 Отредактировано garnizon (31-12-2021 22:30)

Re: Война в горах

Тут ошибка оказалась:

1440  IF (X = 0) OR (X = 128) THEN 1481



Еще есть версии, где  строка 1430 выглядит вот так :

IF Y >  = A(X) THEN  COLOR= 1: PLOT X,A(X) + 1: GOTO 1482

вместо

IF Y >  = A(X) THEN  COLOR= 1: PLOT X,A(X): GOTO 1482

3

Re: Война в горах

На самом деле, это не косяк ИКП-бейсика, а его более корректная работа.
Он проверяет значения аргументов оператора PLOT, а Бейсик-60 не проверяет.

Я добавил строчку:

1395 PLOT 200,200

И ИКП Бейсик тут же отругался на недопустимое значение. А под Бейсик-60 программа продолжила работать.

Программа слишком поздно проверяет, что X стал больше 127.
Я бы строчку 1440 перенумеровал в 1395.

4

Re: Война в горах

Так и сделаю, сейчас я сделал

1440  IF (X = 0) OR (X = 127) THEN 1481 и все заработало

5

Re: Война в горах

avivanov76 пишет:

Программа слишком поздно проверяет, что X стал больше 127.
Я бы строчку 1440 перенумеровал в 1395.

А что это даст?

6

Re: Война в горах

Игра вылетает в строке 1430, при попытке выполнить оператор PLOT X,A(X) когда X = 128.
В строке 1440 делается проверка, что X = 0 или X = 128 и рисование полета снаряда прекращается. Но это слишком поздно, такая проверка должна стоять до выполнения строки 1430. Поэтому я и предлагаю эту проверку поставить перед всеми остальными. Остальные проверки идут со строки 1400, значит, номер строки должен быть меньше 1400.

Но вариант с исправлением 1440  IF (X = 0) OR (X = 127) THEN 1481 тоже работает, он не дает X принять значение 128.
Правда, при этом строчки 1450 и 1475 при допустимом значении X = 127 не отработают.

7

Re: Война в горах

Так и сделал - все совсем прекрасно стало. Сенькс.