#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

hl = 1      #上段左タイル   1番タイル
hc = 2      #上段中タイル   2番タイル
hr = 3      #上段右タイル   3番タイル
cl = 4      #中段左タイル   4番タイル
cc = 5      #中段中タイル   5番タイル
cr = 6      #中段右タイル   6番タイル
ll = 7      #下段左タイル   7番タイル
lc = 8      #下段中タイル   8番タイル
lr = 0      #下段右タイル   9番タイル
start = 0   #スタート用
require 'curses'
include Curses

init_screen
cbreak
noecho
begin
  puts "3✕3のスライドパズル。\n動かしたいタイル番号を入力して動かしてね。\nタイル番号は下の通り。\n-------------\n| 1 | 2 | 3 |\n-------------\n| 4 | 5 | 6 |\n-------------\n| 7 | 8 | 9 |\n-------------\nタイルの数字が左上から右に向かって右下まで順に1〜9になればクリア。"

  start = 1             #ゲームスタート
  while start == 1
    srand()               #配置指定
    puzzle = rand(3)
    if puzzle == 1
      hl = 1
      hc = 2
      hr = 3
      cl = 4
      cc = 5
      cr = 6
      ll = 7
      lc = 0
      lr = 8
      start = 0
    else
      hl = 8
      hc = 6
      hr = 7
      cl = 2
      cc = 5
      cr = 4
      ll = 3
      lc = 0
      lr = 1
      start = 0
    end
    while true
      if hl == 0
        air = 1
      end
      if hc == 0
        air = 2
      end
      if hr == 0
        air = 3
      end
      if cl == 0
        air = 4
      end
      if cc == 0
        air = 5
      end
      if cr == 0
        air = 6
      end
      if ll == 0
        air = 7
      end
      if lc == 0
        air = 8
      end
      if lr == 0
        air = 9
      end
      while true
        if hl == 1
          if hc == 2
            if hr == 3
              if cl == 4
                if cc == 5
                  if cr == 6
                    if ll == 7
                      if lc == 8
                        if lr == 0
                          start = 0
                          
                          def stop(x)
                            sleep(x)
                          end
                          
                          puts"-------------\n| 1 | 2 | 3 |\n-------------\n| 4 | 5 | 6 |\n-------------\n| 7 | 8 |   |\n-------------\nクリア!!!おめでとう!!!"
                          stop(5)
                          puts "...もっかいやる?"
                          stop(1)
                          puts "いや、やらんわな。おつかれさま。\nCtrlとCを一緒に押してゲームを終了してね。"
                          stop(3000)
                          break
                        end
                      end
                    end
                  end
                end
              end
            end
          end
        end
        if air == 1   #空白が1のとき
          printf("-------------\n|   | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n",hc,hr,cl,cc,cr,ll,lc,lr)
          while air == 1
            idou = getch.to_i
            if idou == 2
              hl += hc
              hc -= hc
              air = 2
              break
            elsif idou == 4
              hl += cl
              cl -= cl
              air = 4
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 2   #空白が2のとき
          printf("-------------\n| %d |   | %d |\n-------------\n| %d | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n",hl,hr,cl,cc,cr,ll,lc,lr)
          while air == 2
            idou = getch.to_i
            if idou == 1
              hc += hl
              hl -= hl
              air = 1
              break
            elsif idou == 3
              hc += hr
              hr -= hr
              air = 3
              break
            elsif idou == 5
              hc += cc
              cc -= cc
              air = 5
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 3   #空白が3のとき
          printf("-------------\n| %d | %d |   |\n-------------\n| %d | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n",hl,hc,cl,cc,cr,ll,lc,lr)
          while air == 3
            idou = getch.to_i
            if idou == 2
              hr += hc
              hc -= hc
              air = 2
              break
            elsif idou == 6
              hr += cr
              cr -= cr
              air = 6
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 4   #空白が4のとき
          printf("-------------\n| %d | %d | %d |\n-------------\n|   | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n",hl,hc,hr,cc,cr,ll,lc,lr)
          while air == 4
            idou = getch.to_i
            if idou == 1
              cl += hl
              hl -= hl
              air = 1
              break
            elsif idou == 5
              cl += cc
              cc -= cc
              air = 5
              break
            elsif idou == 7
              cl += ll
              ll -= ll
              air = 7
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 5   #空白が5のとき
          printf("-------------\n| %d | %d | %d |\n-------------\n| %d |   | %d |\n-------------\n| %d | %d | %d |\n-------------\n",hl,hc,hr,cl,cr,ll,lc,lr)
          while air == 5
            idou = getch.to_i
            if idou == 2
              cc += hc
              hc -= hc
              air = 2
              break
            elsif idou == 4
              cc += cl
              cl -= cl
              air = 4
              break
            elsif idou == 6
              cc += cr
              cr -= cr
              air = 6
              break
            elsif idou == 8
              cc += lc
              lc -= lc
              air = 8
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 6   #空白が6のとき
          printf("-------------\n| %d | %d | %d |\n-------------\n| %d | %d |   |\n-------------\n| %d | %d | %d |\n-------------\n",hl,hc,hr,cl,cc,ll,lc,lr)
          while air == 6
            idou = getch.to_i
            if idou == 3
              cr += hr
              hr -= hr
              air = 3
              break
            elsif idou == 5
              cr += cc
              cc -= cc
              air = 5
              break
            elsif idou == 9
              cr += lr
              lr -= lr
              air = 9
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 7   #空白が7のとき
          printf("-------------\n| %d | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n|   | %d | %d |\n-------------\n",hl,hc,hr,cl,cc,cr,lc,lr)
          while air == 7
            idou = getch.to_i
            if idou == 4
              ll += cl
              cl -= cl
              air = 4
              break
            elsif idou == 8
              ll += lc
              lc -= lc
              air = 8
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 8   #空白が8のとき
          printf("-------------\n| %d | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n| %d |   | %d |\n-------------\n",hl,hc,hr,cl,cc,cr,ll,lr)
          while air == 8
            idou = getch.to_i
            if idou == 5
              lc += cc
              cc -= cc
              air = 5
              break
            elsif idou == 7
              lc += ll
              ll -= ll
              air = 7
              break
            elsif idou == 9
              lc += lr
              lr -= lr
              air = 9
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        elsif air == 9   #空白が9のとき
          printf("-------------\n| %d | %d | %d |\n-------------\n| %d | %d | %d |\n-------------\n| %d | %d |   |\n-------------\n",hl,hc,hr,cl,cc,cr,ll,lc)
          while air == 9
            idou = getch.to_i
            if idou == 6
              lr += cr
              cr -= cr
              air = 6
              break
            elsif idou == 8
              lr += lc
              lc -= lc
              air = 8
              break
            else
              puts "それは動かせないよ。"
              redo
            end
          end
        end
      end
    end
  end
end
