Number Breaker

2009年3月5日

4つのヒントを手掛かりにして、隠された4つの数字とその順番を推理するゲームです。このゲームはルールが単純明快なので、暇潰しにはもってこいです。

特徴

この作品は、主要なポケコンである「FX-890P/Z-1/Z-1GR」(以下Z-1)、「PC-E500/E550/E650/1480U/1490U(Ⅱ)/U6000」(以下E500)、「PC-E200/G801/G802/G803/G805/G811/G813/G815」(以下E200)のどれでも、同じBASICリストで同じゲームが動くという「一粒で三度おいしい」ゲームです。

入力方法

E500とE200の方は[BASIC]を押してプログラムモードにして、リストを打ち込んでください。Z-1の方は[MENU][2]と押した後[SHIFT]+[数字]として、適当なプログラムエリアを選択してBASICリストを打ち込んでください。

BASICリスト中では、その機種に対応しない命令が使用されている場合があります。しかし、自動的に機種判別をするのでエラーが出ることはありません。

Z-1をお使いの方はやけにスペースが多いことに気がついたかもしれませんが、適当にスペースを詰めて入力したほうがメモリを節約できます。

遊び方

プログラムを実行するとタイトルが表示されるので、スペースを押してください。

4桁の数字を入力すると、その数字が答えとどれだけ近いかのヒントを表示してくれます。10回以内に当ててください。

[SAME]は、数字も位置も合っているものの数で、[SWAP]は、数字の位置を適当に並びかえるとSAMEになるものの数です。[LARGE]は答えより大きい数がいくつあるか、[SMALL]は答えより小さい数がいくつあるかを表示します。

例えば、答えが6692のとき、1234と入力すると、
(SAME,SWAP,LARGE,SMALL)=(0,1,1,3)
6789と入力すると、
(SAME,SWAP,LARGE,SMALL)=(1,1,2,1)
6666と入力すると、
(SAME,SWAP,LARGE,SMALL)=(2,0,1,1)
と表示されます。

手抜きのプログラムでは上の例で6666と入力したときに、SWAP=4などと表示するものもありますが、このプログラムではきちんとSWAP=0と表示します。リプレイはスペースキーです。

機種判別

誰でも考えつくのは「その機種にしかない命令を実行してエラーが出たら、ON ERROR GOTOで処理しよう」というものでしょう。しかしこの方法は、GOTOが無意味に増えてしまう上、プログラムが分かりにくくなるという欠点があります。次に考えるのは、「遊ぶ人にプログラムの最初の変数を一つ書き換えてもらってそれで対応しよう」というものでしょう。しかしこの方法は、プログラマは良くても、遊ぶほうが面倒くさいという欠点があります。そこで、私が採用したのは次の方法です。

関数の返り値を利用する

E200でPRINT LEN(STR$(1))を実行すると1が表示されます。E500とZ-1では2が表示されます。E200ではSTR$の引数が正のとき、先頭にスペースが入らないのです。また、E500ではHEX$(1)の返り値は1ですが、Z-1では常に4桁で返されるので、0001が返ってきます(E200系にはG815を除いてHEX$()がありません)。この返り値を判定することで機種判別をしています。今回のプログラムで主に問題になったのは、

  1. 乱数の発生のさせかたが異なる(いずれもN88BASICと異なる)
  2. STR$()の仕様が異なる(E200が特殊)
  3. PRINT USING命令の書式の制限が厳しい(E200)
  4. 変数の使用制限が厳しい(E200ではAとA$が同時に使えないし一文字文字変数は7文字まで、二文字変数は16文字までしか記憶できない)
  5. 画面の広さが異なる(E200が24桁、E500が40桁、Z-1が32桁)
  6. BASICとしては標準の命令が使えない。(E200にERASEがなく、G815以外のE200にはなんとELSEがない)
  7. INPUTの動作が微妙に異なる(?の扱いで表示が微妙にずれる)
  8. PRINTの動作が微妙に異なる(E200では数字の後にピリオドが表示される)

などがあります。また、数字を入力するときに何も入力しないで[リターン]だけ押したときの処理も機種によって異なります。

プログラムリスト

1 'Number Breaker for FX-890P/PC-E200/PC-E500 (BASIC version)
100 CLS :CLEAR :DIM P(9),Q(9)
110 IF STR$ (0)="0" THEN Z=24:GOTO 130
120 IF HEX$ (0)="0" THEN Z=40 ELSE Z=32
130 IF Z-32 THEN RANDOMIZE
140 LOCATE (Z-18)/2,1:PRINT "<<Number Breaker>>"
150 LOCATE (Z-14)/2,3:PRINT "PUSH SPACE KEY";
160 IF INKEY$<>" " THEN 160
170 CLS :LOCATE (Z-21)/2,2:PRINT "Same Swap Large Small"
180 N=1:B$="????"
190 IF Z=24 THEN A$=RIGHT$ ("0000"+STR$ (RND(10000)),4):GOTO 220
200 IF Z=32 THEN R=INT(RAN#*10000) ELSE R=RND(10000)
210 A$=RIGHT$ ("0000"+MID$ (STR$ (R),2,LEN (STR$ (R))-1),4)
220 LOCATE (Z-15)/2,0:PRINT LEFT$ (B$+"0000",4)+" =>"+RIGHT$ (" "+STR$ (N),2)+MID$ ("stndrdth",N*2-1+(N>4)*(N*2-8),2)+":    "
230 LOCATE (Z-15)/2+12,0:INPUT"",B$
240 M=0:W=0:L=0:S=0:FOR I=0 TO 9:P(I)=0:Q(I)=0:NEXT
250 FOR I=1 TO 4:P=VAL (MID$ (A$,I,1)):Q=VAL (MID$ (B$,I,1)):M=M-(P=Q):S=S-(P>Q):L=L-(P<Q):IF P-Q THEN P(P)=P(P)+1:Q(Q)=Q(Q)+1
260 NEXT :FOR I=0 TO 9:P=P(I):Q=Q(I):IF P>0 AND Q>0 THEN W=W+(P+(P>Q)*(P-Q))
270 NEXT
280 Q=(Z-21)/2:LOCATE Q+1,3:PRINT M;:LOCATE Q+6,3:PRINT W;:LOCATE Q+11,3:PRINT L;:LOCATE Q+17,3:PRINT S;
290 IF M-4 AND N<10 THEN N=N+1:GOTO 220
300 IF M=4 THEN LOCATE (Z-12)/2,1:PRINT "[GAME CLEAR]"
310 IF M-4 THEN LOCATE (Z-16)/2,1:PRINT "[TURN OVER:"+A$+"]"
320 IF INKEY$<>" " THEN 320
330 GOTO 170

このカテゴリのページ

コメント

コメント(0件)

コメントする

トラックバック

トラックバック(0件)

トラックバック先

当サイトについて

栃木県宇都宮市在住のWeb屋さんのブログ。サイト設計からコーディング、プログラミングまで幅広く担当します。Web標準,WordPress,jQueryあたりに興味があります。≫PROFILE

Get Adobe Flash playerPlugin by wpburn.com wordpress themes