現在のカーソル位置と状態を含んでいる32ビットの
Long を返します。
下位語の下位バイト は、列を含みます。
下位語の上位バイト は行を含みます。そして、
上位語 はカーソルの状態を含みます。
行 、
列 、
状態 のパラメータのいずれかが、
Locate への呼び出しによってまさに設定された場合、戻り値は、前の値ではなくこれらの新しい値を反映します。
Locate の呼び出しでパラメータのいずれかが省略された場合、戻り値は現在の値を反映します。これは、
Locate の呼び出し前と同じです。
Locate は、指定された行と列にカーソルを移動しようとします。
位置が画面の範囲を超えている場合、カーソルは再配置されません。
そして画面での次の
Print は、最後の有効なカーソル位置から続行されます。
画面の最後の行に print し、
Print 命令文に改行文字が含まれる場合、画面はスクロールして、カーソルを自動的に最後の行の1桁目に移動します。
'$lang: "qb"
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron ("fbgfx=GDI")
10 DIM CL,NAKA,X1,Y1,I,SOTO AS LONG
20 DIM X,Y,PAI AS Single
30 Screen 12
35 View Print 16 To 30
40 Randomize ()
100 CLS 3
110 LOCATE 11,0
120 COLOR 4
130 print "Start" , Time$ ,"Calculate 'pi' by using the Monte Carlo method. "
134 t0=Val(left$(Time$ ,2))*3600+Val(mid$(Time$ ,4,2))*60+Val(Right$(Time$ ,2))
140 LINE (100,30)-(300,230),7,B
150 X=Rnd(1)
160 Y=Rnd(1)
170 IF X*X+Y*Y<1 THEN
171 CL=2
172 NAKA=NAKA+1
175 ELSE
176 CL=7
177 SOTO=SOTO+1
178 END IF
180 X1=Int(X*200+0.5)
190 Y1=Int(Y*200+0.5)
200 PSET (X1+100,230-Y1),CL
202 I=I+1
203 PAI=NAKA/(NAKA+SOTO)*4
205 If (I mod 100000)=0 then Locate 10,16: PRINT I,PAI
206 IF I<1000000 THEN
210 GOTO 150
220 ELSE
240 END IF
241 print "End" , Time$
242 t1=Val(left$(Time$ ,2))*3600+Val(mid$(Time$ ,4,2))*60+Val(Right$(Time$ ,2))
244 print using"Time Required=### Seconds";t1-t0
245 Print "Please type any key. "
250 Sleep
260 END
'$lang: "qb"
DECLARE SUB INSTRUCT ()
DECLARE SUB AUTO ()
DECLARE SUB PLAYGAME ()
DECLARE SUB MOVEPILE (N%, START%, FINISH%)
DECLARE SUB MOVEDISC (START%, FINISH%)
DECLARE SUB SHOWDISCS ()
DEFINT A-Z
DIM SHARED NUMDISCS
DIM SHARED CHOICE As Integer
LOCATE 1, 26
Print "┏━━━━━━━┓"
LOCATE 2, 26
Print "┃ ハノイの塔 ┃"
LOCATE 3, 26
Print "┗━━━━━━━┛"
Print STRING$(80, CHR$(45))
PRINT
Print "1: 自動"
PRINT "2: 人手"
Print STRING$(20, CHR$(45))
WHILE CHOICE <> 1 AND CHOICE <> 2
INPUT "どちらか入力して下さい: ", CHOICE
Wend
Print STRING$(20, CHR$(45))
WHILE NUMDISCS < 2 Or NUMDISCS > 10
INPUT "板の数を2〜10で入力して下さい: ", NUMDISCS 'この数字で、板の数を変更します。
Wend
DIM SHARED TOWERS(0 TO 2, 1 TO NUMDISCS), TOP(0 TO 2), COLORS(1 TO NUMDISCS), NUMMOVES AS LONG
CLS
TOP(0) = NUMDISCS: TOP(1) = 0: TOP(2) = 0
FOR I = 1 TO NUMDISCS
TOWERS(0, I) = NUMDISCS - I + 1
READ COLORS(I)
NEXT
DATA 6, 9, 4, 10, 11, 12, 13, 14
DATA 6, 9, 4, 10, 11, 12, 13, 14
IF CHOICE = 1 THEN CALL AUTO ELSE CALL PLAYGAME
Locate 3, 10
Print "いずれかのキー入力で終了します。"
Sleep
SUB AUTO
Dim Start As Double
Dim Second As Double
Dim Minute As Integer
Start = Timer
CALL SHOWDISCS
CALL MOVEPILE(NUMDISCS, 0, 2)
Second = Timer - Start
Minute = Second \ 60
Second = Second - Minute * 60
LOCATE 2, 50
Print Using "### 分 ##.####秒"; Minute; Second
END SUB
SUB MOVEDISC (START, FINISH)
DIM T AS SINGLE
TOWERS(FINISH, TOP(FINISH) + 1) = TOWERS(START, TOP(START))
TOP(FINISH) = TOP(FINISH) + 1
TOWERS(START, TOP(START)) = 0
TOP(START) = TOP(START) - 1
NUMMOVES = NUMMOVES + 1
CALL SHOWDISCS
If CHOICE <> 1 Then
T = Timer
WHILE Timer - T < .2:
IF INKEY$ = CHR$(27) THEN END
WEND
End If
END SUB
SUB MOVEPILE (N, START, FINISH)
IF N > 1 THEN CALL MOVEPILE(N - 1, START, 3 - START - FINISH)
CALL MOVEDISC(START, FINISH)
IF N > 1 THEN CALL MOVEPILE(N - 1, 3 - START - FINISH, FINISH)
END SUB
SUB PLAYGAME
DO
INPUT "ゲームの遊び方を表示しますか?(y/n)"; NULL$
NULL$ = UCASE$(LEFT$(LTRIM$(NULL$), 1))
IF NULL$ = "Y" THEN CALL INSTRUCT: EXIT DO
IF NULL$ = "N" THEN EXIT DO
LOOP
CALL SHOWDISCS
DO
LOCATE 1, 1
COLOR 7
PRINT "動かす板の柱番号と、移動先の番号の二つを続けて入力して下さい。"
PRINT "Escキーで強制終了できます。"
PRINT "左 = 1", "中央 = 2", "右 = 3"
DO
KEY$ = INKEY$
SELECT CASE KEY$
CASE CHR$(27)
END
CASE "1"
START = 0
EXIT DO
CASE "2"
START = 1
EXIT DO
CASE "3"
START = 2
EXIT DO
END SELECT
LOOP
DO
KEY$ = INKEY$
SELECT CASE KEY$
CASE CHR$(27)
END
CASE "1"
FINISH = 0
EXIT DO
CASE "2"
FINISH = 1
EXIT DO
CASE "3"
FINISH = 2
EXIT DO
END SELECT
LOOP
IF TOP(START) = 0 THEN PRINT "最初に指定した番号の柱には板が有りません。": GOTO 1
IF START = FINISH THEN PRINT "二つ目に指定した番号は、直前の番号と同じです。": GOTO 1
IF TOP(FINISH) > 0 THEN
IF TOWERS(START, TOP(START)) > TOWERS(FINISH, TOP(FINISH)) THEN PRINT "板は、より小さい板の上には置けません。": GOTO 1
END IF
CALL MOVEDISC(START, FINISH)
IF TOP(0) = 0 AND TOP(1) = 0 THEN EXIT DO
IF TOP(0) = 0 AND TOP(2) = 0 THEN EXIT DO
1 LOOP
END SUB
SUB SHOWDISCS
CLS
LOCATE 1, 60: PRINT "移動: "; NUMMOVES
LOCATE 25, 1
Print STRING$(80, CHR$(45));
FOR I = 1 TO TOP(0)
LOCATE 25 - I, I + 1
X = TOWERS(0, I)
IF X = 0 THEN EXIT FOR
Color COLORS(X): PRINT STRING$(X * 2, CHR$(254));
NEXT
FOR I = 1 TO TOP(1)
LOCATE 25 - I, I + NUMDISCS * 3
X = TOWERS(1, I)
IF X = 0 THEN EXIT FOR
Color COLORS(X): PRINT STRING$(X * 2, CHR$(254));
NEXT
FOR I = 1 TO TOP(2)
LOCATE 25 - I, I + NUMDISCS * 6
X = TOWERS(2, I)
IF X = 0 THEN EXIT FOR
COLOR COLORS(X): PRINT STRING$(X * 2, CHR$(254));
NEXT
END SUB
SUB INSTRUCT
Print
PRINT "ハノイの塔は、ゲームであるとともに数学パズルでもあります。"
PRINT "3つの柱と、いずれかの柱に移動させることができる数枚の板から成っています。"
PRINT "パズルは、板が、1本の柱でサイズ順に積み重なった状態から始めます。"
PRINT
PRINT "ゲームは、次の規則に従って、別の柱に全ての板を移動させることです:"
PRINT TAB(2); CHR$(248); " 一度に一枚の板しか移動できません。"
PRINT TAB(2); CHR$(248); " 移動は、どれでもよいので、"
PRINT TAB(4); "いずれか1本の柱から一番上の板をとって、"
PRINT TAB(4); "別の柱の板の上に乗せることです。"
PRINT TAB(2); CHR$(248); " 注意は、板は、より大きな板の上にしか置けないことです。"
PRINT "何かキー入力すると続けます。"
NULL$ = INPUT$(1)
END SUB