Upset!
オセロ風のゲームです。
遅いし1行なのでとてもやりづらいのが難点ですが、PBでもフルサイズの対戦オセロが何とかやれるんだ!ということが伝われば。
R1 2023/8/9 PB-SIMでのエラーを回避、PokecomGO(no wait)に対応。
対応機種
PB-SIM(fast)、PokecomGO(fast,no wait)を推奨します。PB-100+拡張メモリにも対応しますが、時間が掛かります。
プログラムサイズは1,092ステップですが、変数領域を確保した後は残メモリ12ステップになります。
遊び方
事前に RUN モードにて DEFM 58 を実行し、変数領域を確保しておきます。
盤面は 8×8。自分は黒コマ"◆"で先攻、コンピュータは白コマ"〇"で後攻です。(最初にパスすれば後攻になる)
"←"の先(左隣マス)がカーソル位置。右に行番号(上から 0,1,2,…7)を表示します。
カーソル位置は"4"← "6"→ "8"↑ "2"↓で移動し、"5"で場所を決めてコマを打ちます。パスは"0"です。
コンピュータの番ではカーソルが消え、自分の番ではカーソルを表示します。
全てのマスに打ち終えたらゲーム終了です。
コンピュータがパスし更に自分もパスしたら強制終了となり、残りのマスは折半して勝敗判定します。
プログラム説明書 program manual
PB-100実機形式
PB-SIM形式
[P0]
10 VAC
15 U(27)=2:U(28)=1:U(35)=1:U(36)=2
25 B=3:K=2:L=2:$="_\DI\CI"
30 IF KEY<>"" THEN 30
35 GOSUB #2: PRINT CSR A+1;"\LA";
61 IF KEY="4"; A=A-SGN A: GOTO 30
62 IF KEY="6"; A=A+SGN(7-A: GOTO 30
63 IF KEY="8"; B=B-SGN B: GOTO 30
64 IF KEY="2"; B=B+SGN(7-B: GOTO 30
65 IF KEY="5";PRINT CSR A;"+";: GOTO 70
66 IF KEY="0" THEN 75
67 GOTO 61
70 IF U(A+B*8)<>0 THEN 30
71 D=A:E=B:F=1:C=1: GOSUB #1
72 IF O=0 THEN 30
74 K=K+O+1:L=L-O: GOTO 76
75 IF M=-99;L=L+(64-K-L)/2:K=64-L
76 GOSUB #2:M=-99
82 FOR D=0 TO 7: FOR E=0 TO 7
84 IF U(D+E*8)<>0 THEN 104
86 F=0:C=2: GOSUB #1: IF O=0 THEN 104
90 N=0:IF (D-7)*D=0;N=4
91 IF (E-7)*E=0;N=4
92 IF U=0; IF D<2; IF E<2;N=-4: IF D=0; IF E=0;N=8
94 IF U(7)=0; IF D>5; IF E<2;N=-4: IF D=7; IF E=0;N=8
96 IF U(56)=0; IF D<2; IF E>5;N=-4: IF D=0; IF E=7;N=8
98 IF U(63)=0; IF D>5; IF E>5;N=-4: IF D=7; IF E=7;N=8
100 N=N+O+RAN#-.5: IF N>M;R=D:S=E:M=N
104 NEXT E: NEXT D
106 IF M=-99 THEN 30
108 D=R:E=S:F=1:C=2: GOSUB #1:K=K-O:L=L+O+1
110 A=D:B=E: GOTO 30
[P1]
10 O=0:FOR I=-1 TO 1: FOR J=-1 TO 1
20 IF I=0; IF J=0 THEN 95
30 G=I:H=J:IF D+G>-1; IF D+G<8; IF E+H>-1; IF E+H<8 THEN 40
35 GOTO 95
40 IF U(D+G+(E+H)*8)+C<>3 THEN 95
50 G=G+I:H=H+J:IF D+G>-1; IF D+G<8; IF E+H>-1; IF E+H<8 THEN 60
55 GOTO 95
60 T=U(D+G+(E+H)*8): IF T+C=3 THEN 50
65 IF T=0 THEN 95
67 IF F=1;U(D+E*8)=C
70 P=D:Q=E
75 P=P+I:Q=Q+J: IF P=D+G; IF Q=E+H THEN 95
80 IF F=0 THEN 90
85 U(P+Q*8)=C
90 O=O+1: GOTO 75
95 NEXT J: NEXT I: RETURN
[P2]
10 PRINT : FOR T=0 TO 7
15 PRINT CSR T;MID (U(T+B*8)+1,1);
20 NEXT T: PRINT CSR 9;B;
25 IF L+K<64; RETURN
30 PRINT : IF K>L; PRINT "Win!": END
35 IF K=L; PRINT "DRAW": END
40 PRINT "LOSE.": END