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
コード一覧
投稿者:Material 185033 3 mini 光楼(114) 対象Lv1 公開日:2017年07月02日 18:10:35
プレー内容を公開する

違反を通報する

コメントする

コメントするには、ログインする必要があります。

コメント一覧

コメントはありません。

プレー履歴

全てのプレー履歴を見る

新着レビュー

全てのレビュー

フォロー/シェア

ブログ/Wiki/掲示板で共有する

Rmake内(ブログ/Wiki/掲示板)に貼り付ける場合は以下のタグを利用してください。

リンク

プレイヤー

外部ホームページに貼り付ける

外部ホームページに貼り付ける場合は以下のタグを利用してください。