ちょっと変わったマンデルブロセット

【ソース】

#include <stdio.h>

// 描画するアスキーアートのサイズ(モニタの幅に合わせて調整してください)
#define WIDTH  80
#define HEIGHT 40
#define MAX_ITER 30

int main(void) {
    // 画面をクリアしてホームポジションに移動するエスケープシーケンス
    printf("\033[2J\033[H");
    printf("--- Mandelbrot Set ---\r\n");

    for (int y = 0; y < HEIGHT; y++) {
        // 複素数平面の虚部 (Im) へマッピング (-1.2 から 1.2)
        float ci = -1.2f + (2.4f * y / HEIGHT);

        for (int x = 0; x < WIDTH; x++) {
            // 複素数平面の実部 (Re) へマッピング (-2.0 から 0.6)
            float cr = -2.0f + (2.6f * x / WIDTH);

            float zr = 0.0f;
            float zi = 0.0f;
            int iter = 0;

            // 漸化式 Z_{n+1} = Z_n^2 + C の計算
            // |Z| > 2 (つまり zr^2 + zi^2 > 4) になるまでループ
            while (zr*zr + zi*zi <= 4.0f && iter < MAX_ITER) {
                float temp = zr*zr - zi*zi + cr;
                zi = 2.0f * zr * zi + ci;
                zr = temp;
                iter++;
            }

            // 発散速度(収束度)に応じて文字を変える(アスキーアートの階調表現)
            if (iter == MAX_ITER) {
                printf("#"); // 集合の内部(収束)
            } else if (iter > 20) {
                printf("@");
            } else if (iter > 10) {
                printf("%c", ".-:+=*"[iter % 6]);
            } else if (iter > 5) {
                printf(".");
            } else {
                printf(" "); // すぐに発散した場所
            }
        }
        printf("\r\n"); // 行の終わり(UARTなので\r\nが必要)
    }
    printf("\r\nDone!\r\n");
}

回転砲塔型スペーススクロールシューティング2  弾も回転版 【MachiKania Type PU】


・弾も回転とスクロールに対応シてみました。
 ------------以下、操作方法は前回と同じ---------
・操作は下記の通り
 左右ボタンで方向変更
 Fireボタンで弾を発射
 ※キーボード使用時は、MACHIKAP.INIファイルのEMULATEBUTTONの#を除いて、キーボードでボタンが使えるようにしてください。
  FireボタンはキーボードではFキーになります。
 SCROLL_SPEED#が縦スクロールの速さになります。その他、パラメーターをいろいろ変えて楽しんでみてください。

USEGRAPHIC
USEVAR SW,SH,SHIPX#,SHIPY#,SHIPR,MAXBULLETS,MAXASTEROIDS,BULLETSPEED#,SCORE,LIVES,GAMEOVER,ASTEROIDMINSIZE,ASTEROIDMAXSIZE,ASTEROIDMINSPEED#,ASTEROIDMAXSPEED#,DX#,DY#,DIST#,COLORWHITE,COLORBLACK,BULLETSX#,BULLETSY#,BULLETVX#,BULLETVY#,BULLETACTIVE,ASTEROIDSX#,ASTEROIDSY#,ASTEROIDVX#,ASTEROIDVY#,ASTEROIDSIZE#,ASTEROIDACTIVE,SIDE,ROTATE_DEG#,COSROT#,SINROT#,NEWX#,NEWY#,STARSX#,STARSY#,NUMSTARS,SCROLL_SPEED#
DIM BULLETSX#(20)
DIM BULLETSY#(20)
DIM BULLETVX#(20)
DIM BULLETVY#(20)
DIM BULLETACTIVE(20)
DIM ASTEROIDSX#(8)
DIM ASTEROIDSY#(8)
DIM ASTEROIDVX#(8)
DIM ASTEROIDVY#(8)
DIM ASTEROIDSIZE#(8)
DIM ASTEROIDACTIVE(8)
DIM STARSX#(100)
DIM STARSY#(100)
REM Initialize constants
SW=336
SH=216
SHIPX#=FLOAT#(SW)/2
SHIPY#=FLOAT#(SH)/5*4
SHIPR=8
MAXBULLETS=20
MAXASTEROIDS=8
BULLETSPEED#=3
ASTEROIDMINSIZE=6
ASTEROIDMAXSIZE=16
ASTEROIDMINSPEED#=1.5
ASTEROIDMAXSPEED#=2.0
ROTATE_DEG#=1
NUMSTARS=100
SCROLL_SPEED#=0.8
COLORWHITE=255
COLORBLACK=0
REM Initialize game variables
SCORE=0
LIVES=3
GAMEOVER=0
REM Clear arrays
FOR I=0 TO MAXBULLETS-1
BULLETACTIVE(I)=0
NEXT
FOR I=0 TO MAXASTEROIDS-1
ASTEROIDACTIVE(I)=0
NEXT
REM Initialize stars (random positions)
FOR I=0 TO NUMSTARS-1
  STARSX#(I)=FLOAT#(RND() % SW)
  STARSY#(I)=FLOAT#(RND() % SH)
NEXT
REM Generate initial asteroids
FOR I=0 TO 3
GOSUB GENERATEASTEROID
NEXT
REM Main game loop
WHILE GAMEOVER=0
GCLS
REM Handle rotation input (隕石、星、弾を回転)
IF KEYS(4) THEN
  COSROT#=COS#(ROTATE_DEG#*PI#/180)
  SINROT#=SIN#(ROTATE_DEG#*PI#/180)
  REM Rotate asteroids
  FOR I=0 TO MAXASTEROIDS-1
    IF ASTEROIDACTIVE(I)=1 THEN
      NEWX#=ASTEROIDSX#(I)-SHIPX#
      NEWY#=ASTEROIDSY#(I)-SHIPY#
      ASTEROIDSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
      ASTEROIDSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
    ENDIF
  NEXT
  REM Rotate stars
  FOR I=0 TO NUMSTARS-1
    NEWX#=STARSX#(I)-SHIPX#
    NEWY#=STARSY#(I)-SHIPY#
    STARSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
    STARSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
  NEXT
  REM Rotate bullets
  FOR I=0 TO MAXBULLETS-1
    IF BULLETACTIVE(I)=1 THEN
      NEWX#=BULLETSX#(I)-SHIPX#
      NEWY#=BULLETSY#(I)-SHIPY#
      BULLETSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
      BULLETSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
    ENDIF
  NEXT
ENDIF
IF KEYS(8) THEN
  COSROT#=COS#(-ROTATE_DEG#*PI#/180)
  SINROT#=SIN#(-ROTATE_DEG#*PI#/180)
  REM Rotate asteroids
  FOR I=0 TO MAXASTEROIDS-1
    IF ASTEROIDACTIVE(I)=1 THEN
      NEWX#=ASTEROIDSX#(I)-SHIPX#
      NEWY#=ASTEROIDSY#(I)-SHIPY#
      ASTEROIDSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
      ASTEROIDSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
    ENDIF
  NEXT
  REM Rotate stars
  FOR I=0 TO NUMSTARS-1
    NEWX#=STARSX#(I)-SHIPX#
    NEWY#=STARSY#(I)-SHIPY#
    STARSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
    STARSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
  NEXT
  REM Rotate bullets
  FOR I=0 TO MAXBULLETS-1
    IF BULLETACTIVE(I)=1 THEN
      NEWX#=BULLETSX#(I)-SHIPX#
      NEWY#=BULLETSY#(I)-SHIPY#
      BULLETSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
      BULLETSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
    ENDIF
  NEXT
ENDIF
REM Scroll asteroids, stars, and bullets downward
FOR I=0 TO MAXASTEROIDS-1
  IF ASTEROIDACTIVE(I)=1 THEN
    ASTEROIDSY#(I)=ASTEROIDSY#(I)+SCROLL_SPEED#
  ENDIF
NEXT
FOR I=0 TO NUMSTARS-1
  STARSY#(I)=STARSY#(I)+SCROLL_SPEED#
  IF STARSY#(I)>FLOAT#(SH) THEN STARSY#(I)=STARSY#(I)-FLOAT#(SH)
NEXT
FOR I=0 TO MAXBULLETS-1
  IF BULLETACTIVE(I)=1 THEN
    BULLETSY#(I)=BULLETSY#(I)+SCROLL_SPEED#
  ENDIF
NEXT
REM Draw stars (background)
GCOLOR COLORWHITE
FOR I=0 TO NUMSTARS-1
  PSET INT(STARSX#(I)),INT(STARSY#(I)),COLORWHITE
NEXT
REM Draw cannon (fixed, always pointing up)
GCOLOR COLORWHITE
CIRCLE INT(SHIPX#),INT(SHIPY#),SHIPR,COLORWHITE
LINE INT(SHIPX#),INT(SHIPY#),INT(SHIPX#),INT(SHIPY#-20),COLORWHITE
REM Handle fire
IF KEYS(32) THEN GOSUB FIREBULLET
REM Update bullets (upward movement relative to scroll)
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
  BULLETSY#(I)=BULLETSY#(I)-BULLETSPEED#
  IF BULLETSY#(I)<0 THEN BULLETACTIVE(I)=0
ENDIF
NEXT
REM Update asteroids (additional movement beyond scroll)
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
  ASTEROIDSX#(I)=ASTEROIDSX#(I)+ASTEROIDVX#(I)
  ASTEROIDSY#(I)=ASTEROIDSY#(I)+ASTEROIDVY#(I)
  IF ASTEROIDSY#(I)>FLOAT#(SH)+20 OR ASTEROIDSX#(I)<FLOAT#(-20) OR ASTEROIDSX#(I)>FLOAT#(SW)+20 THEN
    ASTEROIDACTIVE(I)=0
    GOSUB GENERATEASTEROID
  ENDIF
ENDIF
NEXT
REM Check bullet-asteroid collision
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
  FOR J=0 TO MAXASTEROIDS-1
    IF ASTEROIDACTIVE(J)=1 THEN
      DX#=BULLETSX#(I)-ASTEROIDSX#(J)
      DY#=BULLETSY#(I)-ASTEROIDSY#(J)
      DIST#=SQRT#(DX#*DX#+DY#*DY#)
      IF DIST#<ASTEROIDSIZE#(J)+FLOAT#(3) THEN
        BULLETACTIVE(I)=0
        ASTEROIDACTIVE(J)=0
        SCORE=SCORE+10
        GOSUB GENERATEASTEROID
      ENDIF
    ENDIF
  NEXT
ENDIF
NEXT
REM Check ship-asteroid collision
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
  DX#=SHIPX#-ASTEROIDSX#(I)
  DY#=SHIPY#-ASTEROIDSY#(I)
  DIST#=SQRT#(DX#*DX#+DY#*DY#)
  IF DIST#<FLOAT#(SHIPR)+ASTEROIDSIZE#(I) THEN
    LIVES=LIVES-1
    ASTEROIDACTIVE(I)=0
    GOSUB GENERATEASTEROID
    IF LIVES<=0 THEN GAMEOVER=1
  ENDIF
ENDIF
NEXT
REM Draw bullets
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
  CIRCLEFILL INT(BULLETSX#(I)),INT(BULLETSY#(I)),3,COLORWHITE
ENDIF
NEXT
REM Draw asteroids
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
  CIRCLE INT(ASTEROIDSX#(I)),INT(ASTEROIDSY#(I)),INT(ASTEROIDSIZE#(I)),COLORWHITE
ENDIF
NEXT
REM Draw HUD
GPRINT 0,0,COLORWHITE,COLORBLACK,"SCORE:"+DEC$(SCORE)
GPRINT 0,10,COLORWHITE,COLORBLACK,"LIVES:"+DEC$(LIVES)
WAIT 1
WEND
GCLS
GPRINT SW/2-50,SH/2,COLORWHITE,COLORBLACK,"GAME OVER"
GPRINT SW/2-50,SH/2+10,COLORWHITE,COLORBLACK,"SCORE:"+DEC$(SCORE)
WAIT 300
END
LABEL FIREBULLET
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=0 THEN
  BULLETACTIVE(I)=1
  BULLETSX#(I)=SHIPX#
  BULLETSY#(I)=SHIPY#-20
  BULLETVX#(I)=0
  BULLETVY#(I)=-BULLETSPEED#
  RETURN
ENDIF
NEXT
RETURN
LABEL GENERATEASTEROID
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=0 THEN
  ASTEROIDACTIVE(I)=1
  SIDE=RND() % 3
  IF SIDE=0 THEN
    ASTEROIDSX#(I)=FLOAT#(-20)
    ASTEROIDSY#(I)=FLOAT#(RND() % SH)
    ASTEROIDVX#(I)=ASTEROIDMINSPEED#+(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#)
    ASTEROIDVY#(I)=(FLOAT#(RND())/32768)*2-1
  ELSEIF SIDE=1 THEN
    ASTEROIDSX#(I)=FLOAT#(SW)+20
    ASTEROIDSY#(I)=FLOAT#(RND() % SH)
    ASTEROIDVX#(I)=-(ASTEROIDMINSPEED#+(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#))
    ASTEROIDVY#(I)=(FLOAT#(RND())/32768)*2-1
  ELSE
    ASTEROIDSX#(I)=FLOAT#(RND() % SW)
    ASTEROIDSY#(I)=FLOAT#(-20)
    ASTEROIDVX#(I)=(FLOAT#(RND())/32768)*4-2
    ASTEROIDVY#(I)=ASTEROIDMINSPEED#+(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#)
  ENDIF
  ASTEROIDSIZE#(I)=FLOAT#(ASTEROIDMINSIZE)+FLOAT#(INT((FLOAT#(RND())/32768)*(FLOAT#(ASTEROIDMAXSIZE)-FLOAT#(ASTEROIDMINSIZE))))
  RETURN
ENDIF
NEXT
RETURN

回転砲塔型スペーススクロールシューティング!!  【MachiKania Type PU】


・今度は砲台を回転させると宇宙空間が回転するスクロールゲームです。
  上の画像で見ると前回と同じようですが、感じは全然違います。
・操作は下記の通り
 左右ボタンで方向変更
 Fireボタンで弾を発射
 ※キーボード使用時は、MACHIKAP.INIファイルのEMULATEBUTTONの#を除いて、キーボードでボタンが使えるようにしてください。
  FireボタンはキーボードではFキーになります。
 SCROLL_SPEED#が縦スクロールの速さになります。その他、パラメーターをいろいろ変えて楽しんでみてください。

USEGRAPHIC
USEVAR SW,SH,SHIPX#,SHIPY#,SHIPR,MAXBULLETS,MAXASTEROIDS,BULLETSPEED#,SCORE,LIVES,GAMEOVER,ASTEROIDMINSIZE,ASTEROIDMAXSIZE,ASTEROIDMINSPEED#,ASTEROIDMAXSPEED#,DX#,DY#,DIST#,COLORWHITE,COLORBLACK,BULLETSX#,BULLETSY#,BULLETVX#,BULLETVY#,BULLETACTIVE,ASTEROIDSX#,ASTEROIDSY#,ASTEROIDVX#,ASTEROIDVY#,ASTEROIDSIZE#,ASTEROIDACTIVE,SIDE,ROTATE_DEG#,COSROT#,SINROT#,NEWX#,NEWY#,STARSX#,STARSY#,NUMSTARS,SCROLL_SPEED#
DIM BULLETSX#(20)
DIM BULLETSY#(20)
DIM BULLETVX#(20)
DIM BULLETVY#(20)
DIM BULLETACTIVE(20)
DIM ASTEROIDSX#(8)
DIM ASTEROIDSY#(8)
DIM ASTEROIDVX#(8)
DIM ASTEROIDVY#(8)
DIM ASTEROIDSIZE#(8)
DIM ASTEROIDACTIVE(8)
DIM STARSX#(100)
DIM STARSY#(100)
REM Initialize constants
SW=336
SH=216
SHIPX#=FLOAT#(SW)/2
SHIPY#=FLOAT#(SH)/5*4
SHIPR=8
MAXBULLETS=20
MAXASTEROIDS=8
BULLETSPEED#=3
ASTEROIDMINSIZE=6
ASTEROIDMAXSIZE=16
ASTEROIDMINSPEED#=1.5
ASTEROIDMAXSPEED#=2.0
ROTATE_DEG#=1
NUMSTARS=100
SCROLL_SPEED#=0.8
COLORWHITE=255
COLORBLACK=0
REM Initialize game variables
SCORE=0
LIVES=3
GAMEOVER=0
REM Clear arrays
FOR I=0 TO MAXBULLETS-1
BULLETACTIVE(I)=0
NEXT
FOR I=0 TO MAXASTEROIDS-1
ASTEROIDACTIVE(I)=0
NEXT
REM Initialize stars (random positions)
FOR I=0 TO NUMSTARS-1
  STARSX#(I)=FLOAT#(RND() % SW)
  STARSY#(I)=FLOAT#(RND() % SH)
NEXT
REM Generate initial asteroids
FOR I=0 TO 3
GOSUB GENERATEASTEROID
NEXT
REM Main game loop
WHILE GAMEOVER=0
GCLS
REM Handle rotation input (隕石と星を回転)
IF KEYS(4) THEN
  COSROT#=COS#(ROTATE_DEG#*PI#/180)
  SINROT#=SIN#(ROTATE_DEG#*PI#/180)
  REM Rotate asteroids
  FOR I=0 TO MAXASTEROIDS-1
    IF ASTEROIDACTIVE(I)=1 THEN
      NEWX#=ASTEROIDSX#(I)-SHIPX#
      NEWY#=ASTEROIDSY#(I)-SHIPY#
      ASTEROIDSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
      ASTEROIDSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
    ENDIF
  NEXT
  REM Rotate stars
  FOR I=0 TO NUMSTARS-1
    NEWX#=STARSX#(I)-SHIPX#
    NEWY#=STARSY#(I)-SHIPY#
    STARSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
    STARSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
  NEXT
ENDIF
IF KEYS(8) THEN
  COSROT#=COS#(-ROTATE_DEG#*PI#/180)
  SINROT#=SIN#(-ROTATE_DEG#*PI#/180)
  REM Rotate asteroids
  FOR I=0 TO MAXASTEROIDS-1
    IF ASTEROIDACTIVE(I)=1 THEN
      NEWX#=ASTEROIDSX#(I)-SHIPX#
      NEWY#=ASTEROIDSY#(I)-SHIPY#
      ASTEROIDSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
      ASTEROIDSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
    ENDIF
  NEXT
  REM Rotate stars
  FOR I=0 TO NUMSTARS-1
    NEWX#=STARSX#(I)-SHIPX#
    NEWY#=STARSY#(I)-SHIPY#
    STARSX#(I)=NEWX#*COSROT#-NEWY#*SINROT#+SHIPX#
    STARSY#(I)=NEWX#*SINROT#+NEWY#*COSROT#+SHIPY#
  NEXT
ENDIF
REM Scroll asteroids and stars downward
FOR I=0 TO MAXASTEROIDS-1
  IF ASTEROIDACTIVE(I)=1 THEN
    ASTEROIDSY#(I)=ASTEROIDSY#(I)+SCROLL_SPEED#
  ENDIF
NEXT
FOR I=0 TO NUMSTARS-1
  STARSY#(I)=STARSY#(I)+SCROLL_SPEED#
  IF STARSY#(I)>FLOAT#(SH) THEN STARSY#(I)=STARSY#(I)-FLOAT#(SH)
NEXT
REM Draw stars (background)
GCOLOR COLORWHITE
FOR I=0 TO NUMSTARS-1
  PSET INT(STARSX#(I)),INT(STARSY#(I)),COLORWHITE
NEXT
REM Draw cannon (fixed, always pointing up)
GCOLOR COLORWHITE
CIRCLE INT(SHIPX#),INT(SHIPY#),SHIPR,COLORWHITE
LINE INT(SHIPX#),INT(SHIPY#),INT(SHIPX#),INT(SHIPY#-20),COLORWHITE
REM Handle fire
IF KEYS(32) THEN GOSUB FIREBULLET
REM Update bullets
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
  BULLETSY#(I)=BULLETSY#(I)-BULLETSPEED#
  IF BULLETSY#(I)<0 THEN BULLETACTIVE(I)=0
ENDIF
NEXT
REM Update asteroids
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
  ASTEROIDSX#(I)=ASTEROIDSX#(I)+ASTEROIDVX#(I)
  ASTEROIDSY#(I)=ASTEROIDSY#(I)+ASTEROIDVY#(I)
  IF ASTEROIDSY#(I)>FLOAT#(SH)+20 OR ASTEROIDSX#(I)<FLOAT#(-20) OR ASTEROIDSX#(I)>FLOAT#(SW)+20 THEN
    ASTEROIDACTIVE(I)=0
    GOSUB GENERATEASTEROID
  ENDIF
ENDIF
NEXT
REM Check bullet-asteroid collision
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
  FOR J=0 TO MAXASTEROIDS-1
    IF ASTEROIDACTIVE(J)=1 THEN
      DX#=BULLETSX#(I)-ASTEROIDSX#(J)
      DY#=BULLETSY#(I)-ASTEROIDSY#(J)
      DIST#=SQRT#(DX#*DX#+DY#*DY#)
      IF DIST#<ASTEROIDSIZE#(J)+FLOAT#(3) THEN
        BULLETACTIVE(I)=0
        ASTEROIDACTIVE(J)=0
        SCORE=SCORE+10
        GOSUB GENERATEASTEROID
      ENDIF
    ENDIF
  NEXT
ENDIF
NEXT
REM Check ship-asteroid collision
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
  DX#=SHIPX#-ASTEROIDSX#(I)
  DY#=SHIPY#-ASTEROIDSY#(I)
  DIST#=SQRT#(DX#*DX#+DY#*DY#)
  IF DIST#<FLOAT#(SHIPR)+ASTEROIDSIZE#(I) THEN
    LIVES=LIVES-1
    ASTEROIDACTIVE(I)=0
    GOSUB GENERATEASTEROID
    IF LIVES<=0 THEN GAMEOVER=1
  ENDIF
ENDIF
NEXT
REM Draw bullets
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
  CIRCLEFILL INT(BULLETSX#(I)),INT(BULLETSY#(I)),3,COLORWHITE
ENDIF
NEXT
REM Draw asteroids
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
  CIRCLE INT(ASTEROIDSX#(I)),INT(ASTEROIDSY#(I)),INT(ASTEROIDSIZE#(I)),COLORWHITE
ENDIF
NEXT
REM Draw HUD
GPRINT 0,0,COLORWHITE,COLORBLACK,"SCORE:"+DEC$(SCORE)
GPRINT 0,10,COLORWHITE,COLORBLACK,"LIVES:"+DEC$(LIVES)
WAIT 1
WEND
GCLS
GPRINT SW/2-50,SH/2,COLORWHITE,COLORBLACK,"GAME OVER"
GPRINT SW/2-50,SH/2+10,COLORWHITE,COLORBLACK,"SCORE:"+DEC$(SCORE)
WAIT 300
END
LABEL FIREBULLET
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=0 THEN
  BULLETACTIVE(I)=1
  BULLETSX#(I)=SHIPX#
  BULLETSY#(I)=SHIPY#-20
  BULLETVX#(I)=0
  BULLETVY#(I)=-BULLETSPEED#
  RETURN
ENDIF
NEXT
RETURN
LABEL GENERATEASTEROID
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=0 THEN
  ASTEROIDACTIVE(I)=1
  SIDE=RND() % 3
  IF SIDE=0 THEN
    ASTEROIDSX#(I)=FLOAT#(-20)
    ASTEROIDSY#(I)=FLOAT#(RND() % SH)
    ASTEROIDVX#(I)=ASTEROIDMINSPEED#+(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#)
    ASTEROIDVY#(I)=(FLOAT#(RND())/32768)*2-1
  ELSEIF SIDE=1 THEN
    ASTEROIDSX#(I)=FLOAT#(SW)+20
    ASTEROIDSY#(I)=FLOAT#(RND() % SH)
    ASTEROIDVX#(I)=-(ASTEROIDMINSPEED#+(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#))
    ASTEROIDVY#(I)=(FLOAT#(RND())/32768)*2-1
  ELSE
    ASTEROIDSX#(I)=FLOAT#(RND() % SW)
    ASTEROIDSY#(I)=FLOAT#(-20)
    ASTEROIDVX#(I)=(FLOAT#(RND())/32768)*4-2
    ASTEROIDVY#(I)=ASTEROIDMINSPEED#+(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#)
  ENDIF
  ASTEROIDSIZE#(I)=FLOAT#(ASTEROIDMINSIZE)+FLOAT#(INT((FLOAT#(RND())/32768)*(FLOAT#(ASTEROIDMAXSIZE)-FLOAT#(ASTEROIDMINSIZE))))
  RETURN
ENDIF
NEXT
RETURN

シンプルアステロイド【Machikania Type PU】

・砲台を回転させて弾を打って小惑星を破壊するレトロゲームです。
・本物のような円盤は飛んできません(*^^*);
・操作は下記の通り
 左右ボタンで方向変更
 Fireボタンで迎撃
 上ボタンで加速
 減速キーは… ない…😱😱
 逆方向に方向転換してから再加速して減速…
 ※キーボード使用時は、MACHIKAP.INIファイルのEMULATEBUTTONの#を除いて、キーボードでボタンが使えるようにしてください。
  FireボタンはキーボードFキーになります。

USEGRAPHIC
USEVAR SW,SH,SHIPX#,SHIPY#,SHIPVX#,SHIPVY#,SHIPANGLE#,SHIPR#,MAXBULLETS,MAXASTEROIDS,BULLETSPEED#,SHIPSPEED#,ROTSPEED#,SCORE,LIVES,GAMEOVER,ASTEROIDMINSIZE#,ASTEROIDMAXSIZE#,ASTEROIDMINSPEED#,ASTEROIDMAXSPEED#,DX#,DY#,DIST#,RAD#,COLORWHITE,COLORBLACK,BULLETSX#,BULLETSY#,BULLETVX#,BULLETVY#,BULLETACTIVE,ASTEROIDSX#,ASTEROIDSY#,ASTEROIDVX#,ASTEROIDVY#,ASTEROIDSIZE#,ASTEROIDACTIVE

DIM BULLETSX#(10)
DIM BULLETSY#(10)
DIM BULLETVX#(10)
DIM BULLETVY#(10)
DIM BULLETACTIVE(10)
DIM ASTEROIDSX#(5)
DIM ASTEROIDSY#(5)
DIM ASTEROIDVX#(5)
DIM ASTEROIDVY#(5)
DIM ASTEROIDSIZE#(5)
DIM ASTEROIDACTIVE(5)

REM Initialize constants
SW=336
SH=216
SHIPR#=5
MAXBULLETS=10
MAXASTEROIDS=5
BULLETSPEED#=5
SHIPSPEED#=0.2
ROTSPEED#=5
ASTEROIDMINSIZE#=5
ASTEROIDMAXSIZE#=15
ASTEROIDMINSPEED#=0.5
ASTEROIDMAXSPEED#=1.5
COLORWHITE=255
COLORBLACK=0

REM Initialize game variables
SHIPX#=FLOAT#(SW)/2
SHIPY#=FLOAT#(SH)/2
SHIPVX#=0
SHIPVY#=0
SHIPANGLE#=0
SCORE=0
LIVES=3
GAMEOVER=0
REM Clear arrays
FOR I=0 TO MAXBULLETS-1
BULLETACTIVE(I)=0
NEXT
FOR I=0 TO MAXASTEROIDS-1
ASTEROIDACTIVE(I)=0
NEXT

REM Generate initial asteroids
FOR I=0 TO 3
GOSUB GENERATEASTEROID
NEXT

REM Main game loop
WHILE GAMEOVER=0
GCLS

REM Handle input
IF KEYS(4) THEN SHIPANGLE#=SHIPANGLE#-ROTSPEED#
IF KEYS(8) THEN SHIPANGLE#=SHIPANGLE#+ROTSPEED#
IF SHIPANGLE#<0 THEN SHIPANGLE#=FMOD#(SHIPANGLE#+360,360)
IF SHIPANGLE#>=360 THEN SHIPANGLE#=FMOD#(SHIPANGLE#,360)
IF KEYS(1) THEN
RAD#=SHIPANGLE#*PI#/180
SHIPVX#=SHIPVX#+COS#(RAD#)*SHIPSPEED#
SHIPVY#=SHIPVY#+SIN#(RAD#)*SHIPSPEED#
ENDIF
IF KEYS(32) THEN GOSUB FIREBULLET

REM Update ship
SHIPX#=SHIPX#+SHIPVX#
SHIPY#=SHIPY#+SHIPVY#
IF SHIPX#<0 THEN SHIPX#=SHIPX#+FLOAT#(SW)
IF SHIPX#>=FLOAT#(SW) THEN SHIPX#=FMOD#(SHIPX#,FLOAT#(SW))
IF SHIPY#<0 THEN SHIPY#=SHIPY#+FLOAT#(SH)
IF SHIPY#>=FLOAT#(SH) THEN SHIPY#=FMOD#(SHIPY#,FLOAT#(SH))

REM Update bullets
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
BULLETSX#(I)=BULLETSX#(I)+BULLETVX#(I)
BULLETSY#(I)=BULLETSY#(I)+BULLETVY#(I)
IF BULLETSX#(I)<0 OR BULLETSX#(I)>=FLOAT#(SW) OR BULLETSY#(I)<0 OR BULLETSY#(I)>=FLOAT#(SH) THEN BULLETACTIVE(I)=0
ENDIF
NEXT

REM Update asteroids
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
ASTEROIDSX#(I)=ASTEROIDSX#(I)+ASTEROIDVX#(I)
ASTEROIDSY#(I)=ASTEROIDSY#(I)+ASTEROIDVY#(I)
IF ASTEROIDSX#(I)<0 THEN ASTEROIDSX#(I)=ASTEROIDSX#(I)+FLOAT#(SW)
IF ASTEROIDSX#(I)>=FLOAT#(SW) THEN ASTEROIDSX#(I)=FMOD#(ASTEROIDSX#(I),FLOAT#(SW))
IF ASTEROIDSY#(I)<0 THEN ASTEROIDSY#(I)=ASTEROIDSY#(I)+FLOAT#(SH)
IF ASTEROIDSY#(I)>=FLOAT#(SH) THEN ASTEROIDSY#(I)=FMOD#(ASTEROIDSY#(I),FLOAT#(SH))
ENDIF
NEXT

REM Bullet-Asteroid collision
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN
FOR J=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(J)=1 THEN
DX#=BULLETSX#(I)-ASTEROIDSX#(J)
DY#=BULLETSY#(I)-ASTEROIDSY#(J)
DIST#=SQRT#(DX#*DX#+DY#*DY#)
IF DIST#<ASTEROIDSIZE#(J) THEN
BULLETACTIVE(I)=0
ASTEROIDACTIVE(J)=0
SCORE=SCORE+10
GOSUB GENERATEASTEROID
ENDIF
ENDIF
NEXT
ENDIF
NEXT

REM Ship-Asteroid collision
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN
DX#=SHIPX#-ASTEROIDSX#(I)
DY#=SHIPY#-ASTEROIDSY#(I)
DIST#=SQRT#(DX#*DX#+DY#*DY#)
IF DIST#<SHIPR#+ASTEROIDSIZE#(I) THEN
LIVES=LIVES-1
ASTEROIDACTIVE(I)=0
GOSUB GENERATEASTEROID
IF LIVES<=0 THEN GAMEOVER=1
ENDIF
ENDIF
NEXT

REM Draw everything
GCOLOR COLORWHITE
RAD#=SHIPANGLE#*PI#/180
CIRCLE INT(SHIPX#),INT(SHIPY#),INT(SHIPR#),COLORWHITE
LINE INT(SHIPX#),INT(SHIPY#),INT(SHIPX#+COS#(RAD#)*10),INT(SHIPY#+SIN#(RAD#)*10),COLORWHITE
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=1 THEN PSET INT(BULLETSX#(I)),INT(BULLETSY#(I)),COLORWHITE
NEXT
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=1 THEN CIRCLE INT(ASTEROIDSX#(I)),INT(ASTEROIDSY#(I)),INT(ASTEROIDSIZE#(I)),COLORWHITE
NEXT
GPRINT 0,0,COLORWHITE,COLORBLACK,"SCORE:"+DEC$(SCORE)
GPRINT 0,8,COLORWHITE,COLORBLACK,"LIVES:"+DEC$(LIVES)
WAIT 1
WEND
GCLS
GPRINT SW/2-40,SH/2,COLORWHITE,COLORBLACK,"GAME OVER"
GPRINT SW/2-40,SH/2+8,COLORWHITE,COLORBLACK,"SCORE:"+DEC$(SCORE)
WAIT 300
END

LABEL FIREBULLET
FOR I=0 TO MAXBULLETS-1
IF BULLETACTIVE(I)=0 THEN
BULLETACTIVE(I)=1
BULLETSX#(I)=SHIPX#
BULLETSY#(I)=SHIPY#
RAD#=SHIPANGLE#*PI#/180
BULLETVX#(I)=COS#(RAD#)*BULLETSPEED#
BULLETVY#(I)=SIN#(RAD#)*BULLETSPEED#
RETURN
ENDIF
NEXT
RETURN

LABEL GENERATEASTEROID
FOR I=0 TO MAXASTEROIDS-1
IF ASTEROIDACTIVE(I)=0 THEN
ASTEROIDACTIVE(I)=1
IF RND() % 2 = 0 THEN
  ASTEROIDSX#(I) = FLOAT#(RND() % SW)
  IF RND() % 2 = 0 THEN
    ASTEROIDSY#(I) = 0
  ELSE
    ASTEROIDSY#(I) = FLOAT#(SH-1)
  ENDIF
ELSE
  ASTEROIDSY#(I) = FLOAT#(RND() % SH)
  IF RND() % 2 = 0 THEN
    ASTEROIDSX#(I) = 0
  ELSE
    ASTEROIDSX#(I) = FLOAT#(SW-1)
  ENDIF
ENDIF
ASTEROIDVX#(I)=(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#)+ASTEROIDMINSPEED#
IF RND() % 2=0 THEN ASTEROIDVX#(I)=-ASTEROIDVX#(I)
ASTEROIDVY#(I)=(FLOAT#(RND())/32768)*(ASTEROIDMAXSPEED#-ASTEROIDMINSPEED#)+ASTEROIDMINSPEED#
IF RND() % 2=0 THEN ASTEROIDVY#(I)=-ASTEROIDVY#(I)
ASTEROIDSIZE#(I)=FLOAT#(INT((FLOAT#(RND())/32768)*(ASTEROIDMAXSIZE#-ASTEROIDMINSIZE#)))+ASTEROIDMINSIZE#
RETURN
ENDIF
NEXT
RETURN

スピログラフ(その2)【MachiKania Type PU】

周期を確認して最後まで書くように修正しました。

REM KM-BASIC program for MachiKania type PU                                    
REM Draws Spirograph patterns                                                   
REM Hypotrochoid curves                                                         
USEVAR CENTERX, CENTERY, OLDX, OLDY, NEWX, NEWY                                 
USEVAR RR,STEPS,INC,THETA                                                       
                                                                                
USEGRAPHIC 1                                                                    
GCLS                                                                            
                                                                                
CENTERX#=FLOAT#(SYSTEM(22)/2)                                                   
CENTERY#=FLOAT#(SYSTEM(23)/2)                                                   
                                                                                
R#=FLOAT#(90)                                                                   
RR#=FLOAT#(42)                                                                  
P#=FLOAT#(20)                                                                   
                                                                                
X#=R#-RR#                                                                       
Y#=RR#                                                                          
C#=X#                                                                           
D#=Y#                                                                           
                                                                                
LABEL JUDGE                                                                     
                                                                                
IF Y#=0 THEN ANSWER                                                             
W#=FMOD#(X#,Y#)                                                                 
X#=Y#                                                                           
Y#=W#                                                                           
GOTO JUDGE                                                                      
                                                                                
LABEL ANSWER                                                                    
                                                                                                                                                                                             
PRINT                                                                           
PRINT "Out cycle=",                                                             
PRINT D#/X#                                                                     
PRINT "In cycle =",                                                             
PRINT C#/X#                                                                     
                                                                                
STEPS=2000                                                                      
INC#=FLOAT#(2)*D#/X#*PI#/FLOAT#(STEPS)                                          
THETA#=FLOAT#(0)                                                                
                                                                                
OLDX#=CENTERX# + (R#-RR#)*COS#(THETA#) + P#*COS#(((R#-RR#)/RR#)*THETA#)         
OLDY#=CENTERY# + (R#-RR#)*SIN#(THETA#) - P#*SIN#(((R#-RR#)/RR#)*THETA#)         
REM PRINT OLDX#                                                                 
REM PRINT OLDY#                                                                 
                                                                                
GCOLOR 15                                                                       
                                                                                
FOR I=1 TO STEPS                                                                
  THETA#=THETA# + INC#                                                          
  NEWX#=CENTERX# + (R#-RR#)*COS#(THETA#) + P#*COS#(((R#-RR#)/RR#)*THETA#)       
  NEWY#=CENTERY# + (R#-RR#)*SIN#(THETA#) - P#*SIN#(((R#-RR#)/RR#)*THETA#)       
REM PRINT THETA#                                                                
REM PRINT NEWX#                                                                 
REM PRINT NEWY#                                                                 
REM PRINT                                                                       
  LINE INT(OLDX#),INT(OLDY#),INT(NEWX#),INT(NEWY#),7                            
  OLDX#=NEWX#                                                                   
  OLDY#=NEWY#                                                                   
                                                                                
NEXT                                                                            
                                                                                
GPRINT 0,0,7,0,"R,RR,P:"                                                        
GPRINT 80,0,7,0,DEC$(INT(R#))                                                   
GPRINT 120,0,7,0,DEC$(INT(RR#))                                                 
GPRINT 160,0,7,0,DEC$(INT(P#))                                                  
                                                                                
END

スピログラフ【MachiKania Type PU】




・昔懐かしい…というか今でも百均とかでも互換品売っているんでしょうか? スピログラフ
・これもとりあえずプログラムを貼りますが、どこで描き終わるのまだつかめず、途中で描き終わっちゃったらごめんなさい😅
 Grokも2π(360度)までしか書いてきませんでした。スピログラフって、一周じゃ終わらないですものね。
とりあえず、BASICプログラム(改版するかもしれません)

REM KM-BASIC program for MachiKania type PU
REM Draws Spirograph patterns
REM Hypotrochoid curves
USEVAR CENTERX, CENTERY, OLDX, OLDY, NEWX, NEWY
USEVAR RR,STEPS,INC,THETA

USEGRAPHIC 1
GCLS

CENTERX#=FLOAT#(SYSTEM(22)/2)
CENTERY#=FLOAT#(SYSTEM(23)/2)

R#=FLOAT#(85)
RR#=FLOAT#(20)
P#=FLOAT#(40)

STEPS=2000
INC#=FLOAT#(40)*PI#/FLOAT#(STEPS)
THETA#=FLOAT#(0)

OLDX#=CENTERX# + (R#-RR#)*COS#(THETA#) + P#*COS#(((R#-RR#)/RR#)*THETA#)
OLDY#=CENTERY# + (R#-RR#)*SIN#(THETA#) - P#*SIN#(((R#-RR#)/RR#)*THETA#)
REM PRINT OLDX#
REM PRINT OLDY#

GCOLOR 15

FOR I=1 TO STEPS
  THETA#=THETA# + INC#
  NEWX#=CENTERX# + (R#-RR#)*COS#(THETA#) + P#*COS#(((R#-RR#)/RR#)*THETA#)
  NEWY#=CENTERY# + (R#-RR#)*SIN#(THETA#) - P#*SIN#(((R#-RR#)/RR#)*THETA#)
REM PRINT THETA#
REM PRINT NEWX#
REM PRINT NEWY#
REM PRINT
  LINE INT(OLDX#),INT(OLDY#),INT(NEWX#),INT(NEWY#),7
  OLDX#=NEWX#
  OLDY#=NEWY#

NEXT

GPRINT 0,0,7,0,"R,RR,P:"
GPRINT 80,0,7,0,DEC$(INT(R#))
GPRINT 120,0,7,0,DEC$(INT(RR#))
GPRINT 160,0,7,0,DEC$(INT(P#))

END

スターフィールド・シミュレーション【MachiKania Type PU】


・宇宙、そこは最後のフロンティア…🛸
・今日もGrokにBASICで書いてもらいました
・昔、スクリーンセーバーにもありましたね
・星が流れるだけなので需要はないと思いますが、下記、BASICのプログラムを添付します。…⭐️

SFSIM.BAS

REM Starfield Simulation for MachiKania type PU
REM This program simulates a starfield where stars move from front to back.
REM Target: MachiKania type PU
REM Uses double buffering for smooth animation.
USEVAR SX,SY,SZ,PX,PY,CX,CY,WD,HT,FC,SP,MZ
DIM SX(200)
DIM SY(200)
DIM SZ(200)
USEGRAPHIC 2,2
REM Enter graphic mode, use screen 2 for drawing80 
GPALETTE 0,0,0,0
REM Black
GPALETTE 1,255,255,255
REM White
GCOLOR 1
WD=336 : HT=216 : CX=WD/2 : CY=HT/2 : FC=256 : SP=2 : MZ=256
REM Initialize stars
FOR I=0 TO 199
  X(I)=(RND()-16384)*WD/32768
  SY(I)=(RND()-16384)*HT/32768
  SZ(I)=RND()%MZ + 1
NEXT
F=1
REM Screen toggle starts with 1

LABEL MAINLOOP
GCLS
REM Clear the drawing screen
FOR I=0 TO 199
  SZ(I)=SZ(I)-SP
  IF SZ(I)<1 THEN
    SZ(I)=MZ
    SX(I)=(RND()-16384)*WD/32768
    SY(I)=(RND()-16384)*HT/32768
  ENDIF
  PX=SX(I)*FC/SZ(I) + CX
  PY=SY(I)*FC/SZ(I) + CY
  IF PX>=0 AND PX<WD AND PY>=0 AND PY<HT THEN PSET PX,PY,1
NEXT

WAIT 1
REM Wait for 1/60 second

USEGRAPHIC 3,F
REM Swap screens
F=3-F
REM Toggle between 1 and
GOTO MAINLOOP

※追記:このときにGrokにお願いした内容は下記の通りです。質問する人(アカウント)や時期によっても回答が異なることがあるようです。
MachiKania BASICシステムで使われているKM-BASIC(下記URL)でスターフィールド・シミュレーション(前方から後方に星が流れるアニメーション)のプログラムを書いてください。
http://www.ze.em-net.ne.jp/~kenken/machikania/machikania-guide.pdf
・ターゲットはMachiKania type PUにしてください。
・コメントはアポストロフィでなく、REM文でお願いします。
・2文字以上の変数は、プログラムの最初でUSEVAR文で宣言をお願いします。
・乱数を使う場合、このBASICは、引数を持たないRND()という関数で、値は0 から 32767 までの擬似乱数を返しすことに注意してください。