非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

X68000(11)

Windows 上で動作確認をするため ChatGPT で QB64 に書き換えてもらいましたが、これは思ったように動きませんでした。他の方法も考えていきたいと思います。

Windows 上で動作するイベントドリブンではない BASIC 系のプログラミング言語はありますか

と入力すると以下のような回答が返されました。

とても良い質問ですね!
Windows上で動作するイベントドリブンではないBASIC系のプログラミング言語」ですが、確かにいくつかあります。以下に代表的なものと特徴をまとめました。

✅ 主な選択肢

① QB64

🔹 概要

  • QuickBASIC 4.5互換のモダンBASIC。
  • Windows上で動作する(他にもLinux/macOS対応)。
  • GUIアプリではなく、基本的にはコンソールアプリで動作。

(ただし後述のSCREEN 12やSCREEN 13でグラフィックスも可能)

🔹 特徴

  • イベントドリブンではなく、手続き型でループ主体。
  • `INPUT`, `PRINT`, `PSET`, `LINE`, `CIRCLE` などで描画可能。
  • マウスやキーボードもポーリング方式で扱える(例:`_MOUSEBUTTON`, `_MOUSEX`)。
  • 実行ファイル(.exe)にビルド可能。

🔹 リンク
👉 https://www.qb64.dev/

② FreeBASIC

🔹 概要

  • QB系統の文法を踏襲しつつ、さらにC言語風の機能を強化。
  • WindowsでもLinuxでも動作可能。
  • GUIアプリというよりは、こちらも主にコンソールアプリ。

🔹 特徴

  • イベントドリブンではなく、手続き型でループ主体。
  • `PSET`, `LINE`, `CIRCLE`などグラフィック機能も強力。
  • マウスやキーボードは`GETMOUSE`, `INKEY$`でポーリング方式。

🔹 リンク
👉 https://www.freebasic.net/

③ SmileBASIC(Petit Computer)

🔹 概要

  • もともとニンテンドーDS/3DS/Switch向けBASIC環境。
  • Windows版(SmileBASIC 4)も存在する(ただしSwitchがメイン)。
  • これはちょっと特殊で、Windows上での配布は公式サイトからアプリとして購入。

🔹 特徴

  • 手続き型(ループ+ポーリング)も書ける。
  • ただし一部イベントドリブン要素(ボタン押下、画面タッチなど)も搭載。
  • 組み込みのグラフィック命令(LINE, CIRCLEなど)。

🔎 イベントドリブンでない(手続き型)とは?

DO
    ' 描画や処理
    ' キーやマウスの状態を読み取る(ポーリング)
LOOP UNTIL 終了条件

イベントドリブンWindowsアプリのForm1\_Clickなど)とは異なり、すべて自分でループを書いて制御します。

📝 結論

以下の選択肢がオススメです:

言語名 イベントドリブン? グラフィック 備考
QB64 ❌(手続き型) あり Win対応、BASIC的
FreeBASIC ❌(手続き型) あり Win/Linux対応、BASIC/Cミックス
SmileBASIC △(一部イベント) あり 主にSwitch向けだけどPC版あり

特にQB64は純粋にBASICスタイルで手続き型、X-BASICに近い感覚で扱えますよ!
もし興味があれば、サンプルコードや具体的な導入方法もお手伝いできますので、ぜひ教えてくださいね。 🚀

QB64 と FreeBASIC の違いを教えてください

と入力すると以下のような回答が返されました。

いい質問ですね!
QB64とFreeBASICはどちらもWindows上で動く「BASIC系言語」ですが、それぞれ特徴や狙いが違います。以下に、比較表特徴解説をまとめました!

🗂️ QB64 と FreeBASIC の比較表

特徴 QB64 FreeBASIC
目指す互換性 QuickBASIC 4.5完全互換 QuickBASIC風(部分互換)+C言語
言語仕様 ほぼQB4.5そのまま(レトロBASIC) QB風に加えて拡張(構造体・ポインタなど)
画面出力 コンソール中心(ただしグラフィックモードあり) 同じくコンソール中心(SDLGUIも可能)
グラフィック SCREEN 12, 13相当(2D中心) 同等機能+SDLOpenGL)もサポート
GUIサポート なし(自作ライブラリ必要) なし(SDLGTK+を自分で呼ぶ形)
コンパイル 32/64bitネイティブ実行可能 32/64bitネイティブ実行可能
コードの自由度 ほぼQB4.5の構文通り QB構文+C的な新機能(ポインタ、型、など)
C言語ライク ほぼなし あり(型、外部ライブラリ呼び出し、構造体)
サードパーティ ほぼQB64のみ SDLOpenGLが直接利用可能

📝 それぞれの特徴とメリット

🌟 QB64

QuickBASIC 4.5互換が最優先!

  • QB4.5で作ったプログラムがほぼそのまま動く。
  • 古いBASICプログラムを再利用したい人に最適。
  • グラフィック(SCREEN 12/13モードなど)も簡単。
  • `_MOUSEBUTTON`, `_MOUSEX`, `_MOUSEY`など、現代的なポーリング式マウス対応あり。

❌ 逆に言うと「QBの枠」をあまり超えないので、ポインタや構造体といったC言語的な高度なデータ構造は扱いにくいです。

🌟 FreeBASIC

BASIC文法を拡張してより近代的に!

  • QuickBASIC風のコードも書けるが、型安全、ポインタ、構造体、外部ライブラリ呼び出し、DLLなどC的な機能が豊富。
  • SDL/OpenGL/GTK+などGUIライブラリを組み合わせれば、ゲームやGUIアプリも作れる。
  • 64bitコードもOK、C言語に近いコードも書ける。

❌ その分、QuickBASICの完全互換ではない(PRINT文の挙動など細かい違いがある場合も)。

🔑 どっちを選ぶ?

昔のBASIC資産を再利用したい・BASIC文法だけで完結したいなら:
👉 QB64

BASICっぽい文法でありながら、構造体やポインタも使いたい・C言語的にステップアップしたいなら:
👉 FreeBASIC

🚀 まとめ

オススメ用途 言語
レトロBASICを再現 QB64
モダンBASIC+C風 FreeBASIC

どちらも無料でWindowsにインストールできるので、ぜひ試してみてください!
もし導入手順やサンプルコードが必要でしたら、お手伝いしますね。📘✨

先ほどと同様の以下のようなプログラムを QB64 で作ってください:

円が表示されていて、その円の円周上の点をマウスでクリックすると、点の場所を示すために小さい円が表示されます。
マウスのクリックを繰り返して円周上の点を追加していきます。
円周上の点が追加されると、それらの点を頂点とする多角形が表示されて、その多角形の面積(円の半径を1とする)が表示されます。

と入力すると以下のような回答が返されました。

もちろんです!
以下に、QB64用のプログラムとして「円の円周上の点をマウスクリックで追加 → 小さな円表示 → 多角形を描画 → 面積を表示」するコード例を示します。
(半径=1の円として計算し、表示上は画面サイズに合わせています)

🖥️ QB64コード例

SCREEN 12
CONST CX = 320       ' 円の中心 X
CONST CY = 240       ' 円の中心 Y
CONST RADIUS = 200   ' 画面上の円の半径(描画用)
CONST RADIUS_NORM = 1 ' 計算上の半径(単位円)

DIM pointX(100) AS SINGLE
DIM pointY(100) AS SINGLE
DIM pointCount AS INTEGER

DO
    CLS
    
    ' 円の描画
    CIRCLE (CX, CY), RADIUS, 15
    
    ' マウス入力
    mx = _MOUSEX
    my = _MOUSEY
    
    ' クリック検出
    IF _MOUSEBUTTON(1) THEN
        ' 中心からの距離
        dx = mx - CX
        dy = my - CY
        dist = SQR(dx * dx + dy * dy)
        IF dist <> 0 THEN
            ' 単位円上の座標(正規化)
            nx = dx / dist
            ny = dy / dist
            
            pointCount = pointCount + 1
            pointX(pointCount) = nx
            pointY(pointCount) = ny
            _DELAY 200 ' チャタリング防止
        END IF
    END IF
    
    ' 円周上の点(小さい円)を描画
    FOR i = 1 TO pointCount
        ' 描画位置を計算
        px = CX + pointX(i) * RADIUS
        py = CY + pointY(i) * RADIUS
        CIRCLE (px, py), 5, 12
    NEXT
    
    ' 多角形を描画
    IF pointCount >= 2 THEN
        FOR i = 1 TO pointCount
            j = i MOD pointCount + 1
            x1 = CX + pointX(i) * RADIUS
            y1 = CY + pointY(i) * RADIUS
            x2 = CX + pointX(j) * RADIUS
            y2 = CY + pointY(j) * RADIUS
            LINE (x1, y1)-(x2, y2), 14
        NEXT
    END IF
    
    ' 面積計算(単位円)
    area = 0
    IF pointCount >= 3 THEN
        FOR i = 1 TO pointCount
            j = i MOD pointCount + 1
            area = area + (pointX(i) * pointY(j) - pointX(j) * pointY(i))
        NEXT
        area = ABS(area) / 2
    END IF
    
    ' 面積表示
    LOCATE 2, 2
    PRINT "面積 (半径=1) = "; area
    
    _LIMIT 60
LOOP UNTIL _KEYDOWN(27) ' ESCキーで終了

🔎 ポイント解説

画面描画

  • `SCREEN 12`: 640×480 16色(VGA相当)モードで描画。

円の描画

`CIRCLE (CX, CY), RADIUS, 15`

→ 画面中央に大きな円を描画。

マウスクリック

  • `_MOUSEBUTTON(1)` で左クリック検出。
  • 中心からの相対座標を求め、単位円に正規化。

単位円と描画

  • `pointX`, `pointY`は単位円上の座標(半径=1)。
  • 描画時に`RADIUS`を掛けて画面に表示。

多角形と面積

  • 3点以上なら多角形を形成し、Shoelaceの公式で面積を計算。
  • 半径=1なので、面積もそのまま「単位円の面積比」で計算。

ESCキーで終了

  • `_KEYDOWN(27)`が押されたらループを抜ける。

もし分からないところや改良したい部分があれば、ぜひ教えてくださいね!
必要に応じてコメントも追加したり、GUI化(外部DLLなど)についてもご案内します。🚀