ホームページはこちら

謎のプログラミング言語でフラッピーバードもどきを作った

こんにちは

一昔前に「フラッピーバード」なるスマホゲームが流行りましたね。

そのゲームを真似て簡易的なものを作ったので紹介します。

作ったもの

こんなものを作ってみました。コードをみてもらうとわかりますが、ペーペーの書いたものなのでわかりづらさMAXかつバグまみれです笑

参考 github

  • 使用言語はsunaba
  • ライブラリ等外部リソースは無使用

ソースコードはこんな感じです

flappyもどき
memory[55001] -> 1

#--------- 以下の数値で難易度調節 --------------
const SQUARE_SIZE -> 8
const PIPE_SPEED -> 9 #1の位は小数
const PIPE_HOLE -> 2 #パイプの穴の数
const PIPE_BOXES -> 8 #画面に表示されるパイプブロックの数(SQUARE_SIZEによって変える)
const GRAVITY -> 6 #1, 10の位は小数
const FLY -> 130 #1, 10の位は小数(どれだけ飛ぶか)

#↑デフォルトは上から
# SQUARE_SIZE -> 8
# PIPE_SPEED -> 8
# PIPE_HOLE -> 2
# PIPE_BOXES -> 8
# GRAVITY -> 6
# FLY -> 145


#-------------- color -------------------
const green -> 228822
const yellow -> 888822
const blue -> 113399
const white -> 999999
const black -> 000000


#------------------------ Main ---------------------------
random_number -> 0
score -> 0
end -> 1

#-----------initialize----------------------
#---- bird status (1, 10の桁は小数として扱う) --------
birdAy -> GRAVITY
birdVy -> 0
birdY -> 0

#----- pipe status (画面上に最大2つのパイプが表示されるので2個用意) ------
pipeX1 -> 990 #1の位は小数(パイプの位置)
pipeX2 -> 990
i1 -> random(random_number) #パイプのどこに穴を開けるか
i2 -> random(random_number)

#------ others --------
space_before -> 0
scoreFlag -> 0

refresh_screen(black)
show_score(score)


while 1
  memory[55000] -> 1
  if end = 1
    #-----------initialize----------------------
    #---- bird status (1, 10の桁は小数として扱う) --------
    birdAy -> GRAVITY
    birdVy -> 0
    birdY -> 0

    #----- pipe status (画面上に最大2つのパイプが表示されるので2個用意) ------
    pipeX1 -> 990 #1の位は小数(パイプの位置)
    pipeX2 -> 990
    i1 -> random(random_number) #パイプのどこに穴を開けるか
    i2 -> random(random_number)

    #------ others --------
    space_before -> 0
    scoreFlag -> 0

    refresh_screen(black)
    show_score(score)



  #------- press enter ---------
  if memory[50009] = 1
    random_number -> random_number + random_number
    score -> 0
    end -> 0

  #--------- ゲームループスタート ------------
  if (end = 0)
    space -> memory[50008]
    refresh_screen(blue)

    #-------- パイプの動き ----------
    if pipeX1 < 150
      pipeX1 -> 990
      i1 -> random(random_number)
    if pipeX2 < -350 #画面から消す(一時的)
      pipeX2 -> pipeX1
      i2 -> i1
      scoreFlag -> 0

    pipeX1 -> pipeX1 - PIPE_SPEED
    pipeX2 -> pipeX2 - PIPE_SPEED
    pipe(pipeX1/10, i1)
    pipe(pipeX2/10, i2)

    #----------- スペースを押したとき -----------
    if (space_before = 0) * (space = 1)
      birdVy -> -FLY
      random_number -> random_number + random_number

    #---------- トリの物理処理(自由落下) ------------
    birdVy -> birdVy + birdAy
    birdY -> birdY + birdVy
    bird(birdY/100)

    #----------- それぞれの位置(score, end処理用) -------------
    pipeLeft -> pipeX2/10
    pipeRight -> (pipeX2/10) + SQUARE_SIZE
    pipeBottom -> (i2 * (SQUARE_SIZE + 2)) - 1
    pipeTop -> ((i2 + PIPE_HOLE) * (SQUARE_SIZE + 2)) + 1
    birdLeft -> 15
    birdRight -> 15 + SQUARE_SIZE
    birdTop -> birdY/100
    birdBottom -> (birdY/100) + SQUARE_SIZE

    #---------- 点数 -----------------
    if (pipeRight < birdRight) * (scoreFlag = 0)
      score -> score + 1
      scoreFlag -> 1
    show_score(score)

    #------ ゲームオーバー処理 -----------
    if ((birdY/100) + SQUARE_SIZE > 100)
      end -> 1
    if (pipeLeft < birdRight) * (birdLeft < pipeRight)
      if (pipeTop < birdBottom) + (birdTop < pipeBottom)
        end -> 1

    space_before -> space
    random_number -> random_number + 1
    if random_number > 10000
      random_number -> random_number - 10000


  random_number -> random_number + 1
  if random_number > 10000
    random_number -> random_number - 10000

#------------ def -----------------------------------------
def dot(x, y, color)
	memory[60000 + x + (y * 100)] -> color

def dot_white(x, y)
  dot(x, y, 999999)

def sq(x, y, color)
  b -> 0
  while b < SQUARE_SIZE
    a -> 0
    while a < SQUARE_SIZE
      if (x+a >= 0) * (x+a < 100) * (y+b >= 0) * (y+b < 100)
        dot(x + a, y + b, color)
      a -> a + 1
    b -> b + 1

def bird(y)
  sq(15, y, yellow)

def pipe(x, i)
  a -> 0
  y -> 0
  while a < 10
    y -> y + 1
    if (i != a) * (i+1 != a)
      sq(x, y, green)
    y -> y + SQUARE_SIZE + 1
    a -> a + 1

def refresh_screen(color)
  b -> 0
  while b < 100
    a -> 0
    while a < 100
      dot(a, b, color)
      a -> a + 1
    b -> b + 1

def random(number) #1〜(PIPE_BOXES-1)までの数字をランダムで返す(random_numberと一緒に使う)
  a -> number / (PIPE_BOXES-1)
  out -> (1 + (number - ((PIPE_BOXES-1) * a)))

def show_score(no)
  if no > 99 #最高得点
    no -> 99
  tens -> no / 10 #十の位
  ones -> no - (tens * 10) #一の位
  number(5, 5, tens)
  number(10, 5, ones)

def number(x, y, num) #ドット数字
  if num = 0
    dot_white(x, y)
    dot_white(x+1, y)
    dot_white(x+2, y)
    dot_white(x, y+1)
    dot_white(x+2, y+1)
    dot_white(x, y+2)
    dot_white(x+2, y+2)
    dot_white(x, y+3)
    dot_white(x+2, y+3)
    dot_white(x, y+4)
    dot_white(x+1, y+4)
    dot_white(x+2, y+4)
  if num = 1
    dot_white(x+2, y)
    dot_white(x+2, y+1)
    dot_white(x+2, y+2)
    dot_white(x+2, y+3)
    dot_white(x+2, y+4)
  if num = 2
    dot_white(x, y)
    dot_white(x+1, y)
    dot_white(x+2, y)
    dot_white(x+2, y+1)
    dot_white(x, y+2)
    dot_white(x+2, y+2)
    dot_white(x+1, y+2)
    dot_white(x, y+3)
    dot_white(x, y+4)
    dot_white(x+1, y+4)
    dot_white(x+2, y+4)
  if num = 3
    dot_white(x, y)
    dot_white(x+1, y)
    dot_white(x+2, y)
    dot_white(x+2, y+1)
    dot_white(x, y+2)
    dot_white(x+1, y+2)
    dot_white(x+2, y+2)
    dot_white(x+2, y+3)
    dot_white(x, y+4)
    dot_white(x+1, y+4)
    dot_white(x+2, y+4)
  if num = 4
    dot_white(x, y)
    dot_white(x+2, y)
    dot_white(x, y+1)
    dot_white(x+2, y+1)
    dot_white(x, y+2)
    dot_white(x+1, y+2)
    dot_white(x+2, y+2)
    dot_white(x+2, y+3)
    dot_white(x+2, y+4)
  if num = 5
    dot_white(x, y)
    dot_white(x+1, y)
    dot_white(x+2, y)
    dot_white(x, y+1)
    dot_white(x, y+2)
    dot_white(x+2, y+2)
    dot_white(x+1, y+2)
    dot_white(x+2, y+3)
    dot_white(x, y+4)
    dot_white(x+1, y+4)
    dot_white(x+2, y+4)
  if num = 6
    dot_white(x, y)
    dot_white(x+1, y)
    dot_white(x+2, y)
    dot_white(x, y+1)
    dot_white(x+2, y+2)
    dot_white(x, y+2)
    dot_white(x+1, y+2)
    dot_white(x, y+3)
    dot_white(x+2, y+3)
    dot_white(x, y+4)
    dot_white(x+1, y+4)
    dot_white(x+2, y+4)
  if num = 7
    dot_white(x, y)
    dot_white(x+2, y)
    dot_white(x, y+1)
    dot_white(x+2, y+1)
    dot_white(x+1, y)
    dot_white(x+2, y+2)
    dot_white(x+2, y+3)
    dot_white(x+2, y+4)
  if num = 8
    dot_white(x, y)
    dot_white(x+1, y)
    dot_white(x+2, y)
    dot_white(x, y+1)
    dot_white(x+2, y+1)
    dot_white(x, y+2)
    dot_white(x+2, y+2)
    dot_white(x+1, y+2)
    dot_white(x, y+3)
    dot_white(x+2, y+3)
    dot_white(x, y+4)
    dot_white(x+1, y+4)
    dot_white(x+2, y+4)
  if num = 9
    dot_white(x, y)
    dot_white(x+1, y)
    dot_white(x+2, y)
    dot_white(x, y+1)
    dot_white(x+2, y+1)
    dot_white(x, y+2)
    dot_white(x+2, y+2)
    dot_white(x+1, y+2)
    dot_white(x+2, y+3)
    dot_white(x, y+4)
    dot_white(x+1, y+4)
    dot_white(x+2, y+4)

遊び方

  • STEP.1
    まず、githubまたは上のコードをコピーしてメモ帳などに貼り付けてください。
  • STEP.2
    こちらからsunabaをダウンロードします。
  • STEP.3
    ダウンロードしたsunabaを起動して、先ほどコピペしたメモファイルをsunaba上にドラッグ&ドロップします。
  • STEP.4
    レッツプレイ

使うボタンはエンターとスペースキーです。

エンターで開始、スペースでジャンプ

sunabaとは何か

参考 プログラミング言語Sunaba

上のHPをみてもらうとわかりやすいですが、あるプログラマが作った単純な言語です。

とある大学の講義以外ではほとんど使われていないため文献やライブラリが無く、全て自分の頭で考えなければいけないので、基礎プログラミング能力が身につけられます。

実際に触ってみたところ、不便だと感じるところも少しだけありましたが、概ね扱いやすく楽しくさわれました。

今まで授業でやってたプログラムって、理論をこねくり回すようなものばかりでゲームを実際に作ったりしてきませんでした。これをきっかけに「あれ、プログラムって意外に楽しいかも」と思えるようになれたのでよかったです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です