FreeBASIC マニュアルのトップに戻る

FreeBASIC Locate

目次→実行時ライブラリー参考→実行画面関連LOCATE←オリジナル・サイト

LOCATE 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

現在のカーソル位置を設定します。

構文:
declare function Locate( row as long = 0, column as long = 0, state as long = -1, start as long = 0, stop as long = 0 ) as long

用法:
Locate [row], [column], [state]

result = Locate( [row], [column], [state] )
new_column = lobyte( result )
new_row = hibyte( result )
new_state = hiword( result )

パラメタ:
row
実行画面の、1から始まる垂直方向の文字位置(行)。
column
実行画面の、1から始まる水平方向の文字位置(桁)。
state
コンソール(実行画面)モードのみでのカーソルの状態:0 はオフ、1 はオン。
描画モードではテキストカーソルは表示されません。
start
無視されます。
-lang qb 方言の互換性だけを考慮しました。
stop
無視されます。
-lang qb 方言の互換性だけを考慮しました。

戻り値:
現在のカーソル位置と状態を含んでいる32ビットの Long を返します。
下位語の下位バイトは、列を含みます。下位語の上位バイトは行を含みます。そして、上位語はカーソルの状態を含みます。

状態 のパラメータのいずれかが、Locate への呼び出しによってまさに設定された場合、戻り値は、前の値ではなくこれらの新しい値を反映します。
Locate の呼び出しでパラメータのいずれかが省略された場合、戻り値は現在の値を反映します。これは、Locate の呼び出し前と同じです。

Locate は、指定された行と列にカーソルを移動しようとします。
位置が画面の範囲を超えている場合、カーソルは再配置されません。 そして画面での次の Print は、最後の有効なカーソル位置から続行されます。
画面の最後の行に print し、Print 命令文に改行文字が含まれる場合、画面はスクロールして、カーソルを自動的に最後の行の1桁目に移動します。

記述:
文字カーソルを、描画モードと実行画面モードの両方に、設定します。

例:
Locate 10
Print "現在の行:"; CsrLin
Sleep



'' 実行画面でマウス位置を追尾して、テキスト・カーソルで位置を表示
Dim As Long x = 0, y = 0, dx, dy

Cls
Locate , , 1

While Inkey <> Chr(27)
    GetMouse dx, dy
    If( dx <> x Or dy <> y ) Then
        Locate y+1, x+1: Print " ";
        x = dx
        y = dy
        Locate 1, 1: Print x, y, ""
        Locate y+1, x+1: Print "X";
    End If
Wend



 下は、モンテカルロ法による、円周率の推定です。
 わずか一秒で、百万個の点をプロットできるのは、コンパイラーの威力ですね。
モンテカルロ法による、円周率の推定 注:FreeBASIC 1.08〜 で、SetEnviron を追加しなくても、日本語環境で描画画面が表示されるように改善されました。
'$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

towerFB  以下は、QB64 http://www.qb64.net/
サンプル・フォルダにあるプログラムを、FreeBASIC 用に微修正したものです。
QB64\programs\samples\misc\tower.bas
'$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

QBからの違い:

参照:
実行画面関連 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2022-03-25 14:10:10
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承