Тема: Война в горах
Война в горах
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