CoRサンプル集: 【CoR講座用】三目並べ
プレー:127
(人数:40)
クリア:22
評価: 60 (6回)
#=====対戦=====#
scene 'game' do
#変数定義
bg_sprite = nil #背景
mesh_sprite = nil #マス
mark_sprite = nil #〇
disposition_text_sprite = nil
board_data = nil #盤面情報
comparison_board_data = nil #盤面変化判定用配列
turn = nil #ターン
decision = nil #勝敗判定実行判定用
main_music = nil #音楽
locate_sound = nil #配置効果音
win_sound = nil #勝利効果音
lose_sound = nil #引分・敗北効果音
#定数定義
screen_width = 800 #ゲーム画面幅
screen_high = 450 #ゲーム画面高
board_size = 125 #盤面1マス当たりのサイズ
#定数計算
board_left_position = (screen_width / 2 - (board_size / 2 + board_size)).floor #盤面一番左の位置
board_up_position = (screen_high / 2 - (board_size / 2 + board_size)).floor #盤面一番上の位置
#デバッグ
debug_log "ソースファイル読込み完了!"
preload do
#背景素材読込み
image 'メニュー背景画像', id: 318428, frame_size: [225, 400], frame_pattern: 11
image 'マス画像', id: 319591
image '〇画像', id: 202007
image '×画像', id: 202014
#音楽素材読込み
music 'メイン音楽', id: 203732
#効果音素材読込み
sound '配置音', id: 320507
sound '勝利音', id: 120679
sound '敗北音', id: 180251
end
create do
#変数設定
board_data = [0,0,0,0,0,0,0,0,0] #盤面情報 0:空白 1:〇 -1:×
comparison_board_data = board_data.dup #盤面変化判定用配列
turn = 0 #ターン
decision = 0 #勝敗判定実行判定用
#背景画像配置
bg_sprite = put_sprite 'メニュー背景' do
position 0, 450
scale 2.0, 2.0
angle -90
frame_index 0
end
#マス画像配置
mesh_sprite = put_sprite 'マス' do
position 800 / 2, 450 / 2
frame_index 0
end
#音楽作成
main_music = add_music('メイン音楽')
#効果音作成
locate_sound = add_sound('配置音')
win_sound = add_sound('勝利音')
lose_sound = add_sound('敗北音')
#音楽再生
main_music.play
#背景アニメ開始
bg_sprite.start_animation('通常アニメ')
end
update do
comparison_board_data = board_data.dup #配列コピー
if decision % 2 == 0 #勝敗判定実行判断
####プレーヤーor敵ターン####
if turn % 2 == 0
####プレーヤーのターン####
#クリックまたはタップしたか
if pointer.down?
column = ((pointer.x - board_left_position) / board_size).floor #列を求める
paragraph = ((pointer.y - board_up_position) / board_size).floor #段を求める
#列が0~2、段も0~2の範囲か
if (0..2) === column && (0..2) === paragraph
block = column + paragraph * 3 #列・段からマス番号を求める
if board_data[block] == 0 #選択したマスが空白か
board_data[block] = 1
turn += 1 #行動したらターン交代
decision += 1
end
end
end
else
####敵のターン####
wait_time(500) #0.5秒待機
result = nil #×を入れるマス番号
temporary_board = nil #操作用盤面
input_mark = -1 #配置するマーク
required_decision = 2 #欲しい判定結果
#勝てる場所・負けを防ぐ場所探索
j = 0
while 1
9.times do |i| #9回ループ
if board_data[i] == 0 #i番のマスは空か
temporary_board = board_data.dup #操作用盤面に盤面データをコピー
temporary_board[i] = input_mark #×・〇を入れてみる
if win_or_loss(temporary_board) == required_decision #欲しい判定が出るか
result = i #×配置場所確定
break #ループ脱出
end
end
end
if j == 0 && result == nil #負けを防ぐ処理へ
j = 1
input_mark = 1 #配置するマークを〇に
required_decision = 1 #欲しい判定を1に
else
break #ループ脱出
end
end
#ランダム選択
if result == nil
while(board_data[result = rand(9)] != 0) do
end
end
board_data[result] = -1 #盤面情報書き換え
turn += 1 #ターン交代
decision += 1
end
else
####勝敗判定####
disposition = win_or_loss(board_data)
if disposition != 0
#終了処理
wait_time(100)
disposition_text_sprite = put_text '決着' do
position screen_width / 2, screen_high / 2
end
disposition_text_sprite.bold true
case disposition
when 1
disposition_text_sprite.color '#FF0000'
disposition_text_sprite.text '勝利!'
#クリア処理
#音楽停止
main_music.stop
#勝利音再生
win_sound.play
wait_time(2000)
#アクティビティフィード
send_activity_feed("勝利しました!")
game_clear
wait_time(100)
when 2
disposition_text_sprite.color '#0000FF'
disposition_text_sprite.text '敗北'
when 3
disposition_text_sprite.color '#00FF00'
disposition_text_sprite.text '引き分け'
end
#音楽停止
main_music.stop
#敗北音再生
lose_sound.play
wait_time(6000)
#シーン「menu」の開始
change_scene 'menu'
end
decision += 1
end
end
render do
if board_data != comparison_board_data #ターン開始前と現在の盤面が違っていたら
#違うところを探す
9.times do |i| #9回ループ
if board_data[i] != comparison_board_data[i]
mark = board_data[i] == 1 ? '〇' : '×'
#〇×配置
mark_sprite = put_sprite mark do
position board_left_position + i % 3 * board_size, board_up_position + (i / 3).floor * board_size
scale board_size / 150, board_size / 150
frame_index 0
end
#配置音再生
locate_sound.play
end
end
end
end
end
#=====定義=====#
#スプライト
sprite 'メニュー背景' do
image 'メニュー背景画像'
origin :left_top
animation '通常アニメ', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], 20, true
end
sprite 'マス' do
image 'マス画像'
end
sprite '〇' do
image '〇画像'
origin :left_top
end
sprite '×' do
image '×画像'
origin :left_top
end
#テキストスプライト
text '決着' do
origin :center
font_size 100
end
#メソッド
def win_or_loss(board) #勝敗判定メソッド
#戻り値 0:試合継続 1:プレーヤー勝利 2:プレーヤー敗北 3:引き分け
#横3列判定
3.times do |i|
case board[i*3] + board[i*3 + 1] + board[i*3 + 2]
when 3 #〇が揃っている
return 1
when -3 #×が揃っている
return 2
end
end
#縦3列判定
3.times do |i|
case board[i] + board[i+3] + board[i+6]
when 3 #〇が揃っている
return 1
when -3 #×が揃っている
return 2
end
end
#斜め\
case board[0] + board[4] + board[8]
when 3 #〇が揃っている
return 1
when -3 #×が揃っている
return 2
end
#斜め/
case board[2] + board[4] + board[6]
when 3 #〇が揃っている
return 1
when -3 #×が揃っている
return 2
end
#引き分けチェック
if board.include?(0) #空のマスがあるか
return 0 #ある→試合継続
else
return 3 #ない→引き分け
end
end
コード一覧
- game.rb
- start.rb
プレー内容を公開する