ЧИТАТЕЛЬ ЧИТАТЕЛЮ
Своими успехами в области программирования на Бейсике делится с нами т. Дронов из Читы. Его опыт пригодится начинающим программистам.
"Высылаю Вам на суд свою первую программу и хочу сказать Вам большое спасибо за "ZX-РЕВЮ". Благодаря Вам я, изучив за месяц два годовых комплекта "ZX-РЕВЮ", узнал очень много хитростей и секретов Бейсика. Подтверждением этого является эта программа, написанная за один вечер. Я знаю, Бейсик - легкий язык, но без хорошей книги его не ПРОСТО освоить. А Ваша литература лучшая из всех, которую я видел. Информация излагается очень понятно и доступно. "Сейчас я, с помощью Вашей книги, приступаю к изучению Ассемблера. Надеюсь овладеть и этим языком, хотя он намного сложнее.
Теперь несколько слов о программе. Это аналог широко известной настольной игры "Морской бой", в которую мы частенько играли в детстве. Маленькое отличие заключается в том, что в моей игре корабли можно располагать как угодно и где угодно в пределах своего квадрата. Так же делает и компьютер."
ИФК: Спасибо за теплые слова. От себя хотим добавить несколько слов. Корабли в этой игре - только одноклеточные, их можно ставить и поодиночке, и вплотную друг к другу как угодно. После попадания корабль сразу же считается потопленным. Всего их 20 у Вас и столько же у компьютера. Посмотрите на листинг программы: действительно, это занятие на один вечер. Если организовать в программе ограничения на расположение кораблей, на их конфигурацию (одно- или многоклеточные и т.д.), программа получилась бы как минимум, раз в пять длиннее. Но можем Вас уверить, что набрав самостоятельно эту программу, Вы с не меньшим азартом будете вести сражения с компьютером. А может быть, вскоре у Вас появится желание внести в программу ограничения на конфигурацию и расположение кораблей - что же, пробуйте смело. Лучшее обучение программированию - это обучение "в бою".
Автор предлагает русифицировать программу при помощи символов UDG-графики. Однако, поскольку мы уже привыкли к постоянно используемому нами методу русификации, мы приводим, как обычно, вариант для загружаемого русско-латинского символьного набора. Думаем, что автор простит нам такое вторжение в его программу и еще несколько непринципиальных штрихов. Итак, предлагаем программу всем читателям.
DROHuU * |
TCHITfl * 1993 |
|
МОРСКОЙ |
БОЙ |
|
8123456789 |
|
О 123456789 |
P |
+ |
F |
■ ■ |
|
E |
|
в |
■ + |
|
С |
+ |
с |
■ |
|
E |
|
□ |
|
|
E |
+ + X |
E |
|
|
F |
|
F |
■ ■ |
|
G |
|
G |
■ |
|
H I |
|
s |
|
|
J |
|
J |
|
|
|
1 9 |
|
1 9 |
ВВЕДИТЕ КООРДИНАТЫ |
"H" |
Рис. 1
1 GO TO 10
2 BORDER 7: PAPER 7: INK 0: CLEAR : LOAD "chr" CODE 64600
4 GO TO 0
5 SAVE "SEA" LINE 2: SAVE "chr"CODE 64600,768: STOP
8 POKE 23606,88: POKE 23607,251: RETURN
9 POKE 23606,0: POKE 23607,60: RETURN
10 BORDER 5: PAPER 7: INK 0: CLS : POKE 23658,8: GO SUB 8 15 REM РИСУЕМ ИГРОВОЕ ПОЛЕ ===
20 FOR N=0 TO 9 30 LET Z$=CHR$ (N+65)
40 PRINT AT 7,N+4;N;AT 7,N+19;N;AT N+8,3;Z$;TAB 18; Z$ 50 NEXT N
60 PRINT AT 0,1; PAPER 4;" DRONOV * TCHITA * 1993 " 70 PRINT AT 3,10; PAPER 7; INK 1; " МОРСКОЙ БОЙ " 80 DRAW 255,0: DRAW 0,175: DRAW -255,0: DRAW 0,-175 90 PLOT 112,112: GO SUB 630: PLOT 232,112: GO SUB 630 100 REM ФОРМИРУЕМ КООРДИНАТЫ КОРАБЛЕЙ КОМПЬЮТЕРА ============
110 PRINT #0;"ПОДОЖДИТЕ МИНУТОЧКУ, ПОЖАЛУЙСТА." 120 DIM A$(20,4): DIM B$(20,4) 130 FOR N=1 TO 10
140 LET Y=8+INT (RND*10): LET X=4+INT (RND*10)
150 LET A$(N)=CHR$ 22+CHR$ Y+CHR$ X
160 IF N=1 THEN GO TO 200
170 FOR M=1 TO N-1
180 IF A$(N)=A$(M) THEN GO TO 140
190 NEXT M
200 NEXT N
210 INPUT ;: PRINT #0;"Я ГОТОВ! РАСПОЛОЖИМ ВАШИ КОРАБЛИ": BEEP .5,40: PAUSE 50 220 REM РИСУЕМ КОРАБЛИ =========
230 FOR N=1 TO 20
240 GO SUB 690: LET Y=Y-57: LET X=X-29 250 LET G$=CHR$ 22+CHR$ Y+CHR$ X: LET B$(N)=G$ 260 IF N=1 THEN GO TO 300 270 FOR M=1 TO N-1
280 IF B$(N)=B$(M) THEN GO SUB 740: GO TO 240 290 NEXT M
300 PRINT INK 1; G$+CHR$ 143 310 NEXT N
320 REM НАЧАЛО ИГРЫ ===========
330 LET W=0: LET Q=0: BEEP .5,20 340 PRINT AT 20,4;20;TAB 19;20
350 LET N=INT (RND*2): REM РОЗЫГРЫШ ПЕРВОГО ХОДА ==========
360 IF N THEN GO TO 520
370 PRINT #0;TAB 10;"ВАШ ВЫСТРЕЛ"
380 PAUSE 40
390 IF Q=20 THEN INPUT ;: PRINT #0;TAB 4;"ПОЗДРАВЛЯЮ! ВЫ ПОБЕДИЛИ": FOR K=10 TO 15: BEEP
.1,K: NEXT K: GO TO 790 400 GO SUB 690: LET Y=Y-57: LET X=X-44 410 IF SCREEN$ (Y,X)="+" THEN GO TO 620 420 IF SCREEN$ (Y,X)="X" THEN GO TO 620 430 GO SUB 680 440 FOR N=1 TO 20
450 IF F$=A$(N) THEN PRINT #0; TAB 4;"БРАВО! ПРЯМОЕ ПОПАДАНИЕ": LET A$(N)=C$+"X": PRINT
PAPER 2;A$(N): LET Q=Q+1: PRINT AT 20,4;20-Q;" ": BEEP .5,1: PAUSE 20:GO TO 390 460 NEXT N
470 PRINT C$+"+": BEEP .1,40 480 PRINT #0;TAB 14;"МИМО!" 490 REM ПЕРЕХОД ХОДА ==========
500 PAUSE 40: INPUT ;
510 IF W=20 THEN PRINT #0;TAB 6; "ВАША ФЛОТИЛИЯ РАЗБИТА": BEEP .8,2: BEEP .6,2: BEEP .2,2:
BEEP .8,2: GO TO 760 520 PRINT #0;TAB 10; "МОЙ ВЫСТРЕЛ": PAUSE 20 530 LET Y=8+INT (RND*10): LET X=19+INT (RND*10) 540 IF SCREEN$ (Y,X)="+" THEN GO TO 530 550 IF SCREEN$ (Y,X)="X" THEN GO TO 530 560 GO SUB 680 570 FOR N=1 TO 20
580 IF F$=B$(N) THEN LET B$(N)=C$+"X": INPUT ;: PRINT #0; TAB 6;"ВАШ КОРАБЛЬ ПОТОПЛЕН":
PRINT INK 1;B$(N): LET W=W+1: PRINT AT 20,19;20-W;" ": BEEP .5,1: GO TO 500 590 NEXT N
600 INPUT ;: PRINT #0;TAB 5;"BAM ПОВЕЗЛО, Я НЕ ПОПАЛ": PRINT C$+"+" 610 BEEP .1,40: GO TO 380
620 PRINT #0; "ВЫ СЮДА УЖЕ СТРЕЛЯЛИ": GO TO 380
630 RESTORE
640 FOR N=0 TO 8
650 READ Y,X: DRAW Y,X 660 NEXT N 670 RETURN
680 LET C$=CHR$ 22+CHR$ Y+CHR$ X: LET F$=C$+" ": RETURN
690 INPUT "ВВЕДИТЕ КООРДИНАТЫ " ;D$
700 IF LEN D$<2 THEN GO SUB 740: GO TO 690
710 LET Y=CODE D$(1): LET X=CODE D$(2)
720 IF Y<65 OR Y>74 OR X<48 OR X>57 THEN GO SUB 740: GO TO 690 730 RETURN
740 PRINT #0;TAB 12; "ОШИБКА! " 750 BEEP .5,20: PAUSE 40: RETURN 760 FOR N=1 TO 20
770 IF A$(N,4)=" " THEN PRINT PAPER 2;A$(N) 780 NEXT N
790 PAUSE 70: INPUT ;: PRINT #0;TAB 4;"ХОТИТЕ ЕЩЕ РАЗОК? (Y/N)": PAUSE 0 800 IF INKEY$="N" THEN GO SUB 9: STOP 810 RUN
820 DATA 0,-81,-81,0,0,81,81,0,0,-2,2,0,0,-81,-81,0,0,2