前回記事はこちらです。↓
基本動作を作成しよう。
基本操作の概要
実際の画面で、基本動作の流れを説明します。
この様に、
- “選択待機状態” → 和了を完成させたい手牌をクリック →
- “交換牌選択可能状態” → 交換したい牌をクリック →
- “牌交換待機状態” → 2.で選んだ牌と交換したい牌をクリック → 牌交換 →1.選択待機状態
と、3つの状態を行き来しながら、ゲームを進めることになります。
ですので、プログラムは状態を表す変数を用意して、この変数の値によって処理内容を切り替える方法で組んでいきます。
フローチャートを描く
以上の内容を簡単なフローチャートにするとこんな感じです。
flowchart TD
0000>"状態=選択待機状態"]
0001[/"loop"\]
0002{"?状態"}
9999[\"loop"/]
0000-->0001
0001-->0002
0100["和了を完成させたい手牌をクリック"]
0101[["選択した手牌を保持"]]
0102>"状態=交換牌選択可能状態"]
0002-->0100
subgraph steel["選択待機状態"]
0100-->0101
0101-->0102
end
0102-->9999
0200["交換したい牌をクリック"]
0201[["選択した牌を保持"]]
0202>"状態=牌交換待機状態"]
0002-->0200
subgraph base_click["交換牌選択可能状態"]
0200-->0201
0201-->0202
end
0202-->9999
0300["交換したい牌をクリック"]
0301[["牌交換"]]
0302>"状態=選択待機状態"]
0002-->0300
subgraph change_steel["牌交換待機状態"]
0300-->0301
0301-->0302
end
0302-->9999
状態別にプログラムを組むため、前回のプログラムを次のように変更しました。
require 'dxruby'
#ウィンドウサイズ
Window.resize 672,900
#キャプション
Window.caption = "mjpzl"
#バックグラウンド色(濃い緑色)
Window.bgcolor=[63, 0, 63, 0]
#牌生成
hai_type=[
1, 2, 3, 4, 5, 6, 7, 8, 9, #萬子
11,12,13,14,15,16,17,18,19, #筒子
21,22,23,24,25,26,27,28,29, #索子
31,33,35,37, #風牌
41,43,45, #三元牌
99 #裏牌
]
#牌の数は各牌4枚
hais = hai_type*4
#牌をランダムにシャッフル
hais.shuffle!
#牌を14*10に並べる
tiles =Array.new
(0..9).each do |y|
tiles[y]=Array.new
(0..13).each do |x|
#haisの先頭からtilesにひとつずつ代入していく。
tiles[y][x]=hais.shift
end
end
#牌画像
hai_images=Array.new
(1..9).each do |i|
hai_images[ i] = Image.load("./image/p_ms#{i}_1.png")
hai_images[ 10 +i] = Image.load("./image/p_ps#{i}_1.png")
hai_images[ 20 +i] = Image.load("./image/p_ss#{i}_1.png")
end
hai_images[31] = Image.load("./image/p_ji_e_1.png")
hai_images[33] = Image.load("./image/p_ji_s_1.png")
hai_images[35] = Image.load("./image/p_ji_w_1.png")
hai_images[37] = Image.load("./image/p_ji_n_1.png")
hai_images[41] = Image.load("./image/p_no_1.png")
hai_images[43] = Image.load("./image/p_ji_h_1.png")
hai_images[45] = Image.load("./image/p_ji_c_1.png")
hai_images[99] = Image.load("./image/p_bk_1.png")
tile_w = 48 #牌画像の幅
tile_h = 64 #牌画像の高さ
#状態変数
state = "steel" #初期値:選択待機状態
Window.loop do
# ここにゲームの処理を書く
# update
case state #case文で条件分岐
when "steel" #選択待機状態
#選択待機状態の処理を書く
when "base_click" #交換牌選択可能状態
#交換牌選択可能状態の処理を書く
when "change_steel" #牌交換待機状態
#牌交換待機状態の処理を書く
end #ここまでがcase文
# draw
tiles.each_with_index do |rows,y|
rows.each_with_index do |v,x|
Window.draw(tile_w * x, tile_h * y, hai_images[v])
end
end
end
次回は、選択待機状態の処理をつくります。
次回記事は、こちらです。↓
コメント