質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

0回答

1202閲覧

プログラムの問題点

akuta

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2016/11/27 06:14

編集2017/02/15 01:31

こんにちは

現在以下のリンク先のサイト様のオセロゲームをRubyで制作しています
交互にゲームを進めひっくり返すところまではいけたのですが
いくつかわからないところがあります

元サイト様です

1, msg_waitがうまく回っていない
ずっと0のままで、試しに初期化の際に数字を代入するとその数字から1だけ引かれてデクリメントされない

2, 何もないところをクリックすると自分の番がスキップされる
何もないマスをクリックすると相手の白コマがおかれる

3, isPassのとこがうまく動いてないのかすべてのマス埋まった後でもresultの評価に入らない
すべてのマスが一色になるまたはマスがすべて埋まっていても評価に入らずプレイ中のまま

4, 本来ProcessMessageでWhileで回しているかわりにWindow.loopで回してるのですがswitchのcase2のところでbreakが来るといきなりプログラムが終わってしまうので違うものでループさせたほうがよいか

長文になってしまい申し訳ありません
下に現在までのプログラムを載せておきます
よろしくお願いします

Ruby

1require 'dxruby' 2 3Window.width = 384 4Window.height = 384 5image = Image.load('back.png') 6image2 = Image.load_tiles('piece.png', 2, 1) 7 8$board = [ 9[0, 0, 0, 0, 0, 0, 0, 0], 10[0, 0, 0, 0, 0, 0, 0, 0], 11[0, 0, 0, 0, 0, 0, 0, 0], 12[0, 0, 0, 0, 0, 0, 0, 0], 13[0, 0, 0, 0, 0, 0, 0, 0], 14[0, 0, 0, 0, 0, 0, 0, 0], 15[0, 0, 0, 0, 0, 0, 0, 0], 16[0, 0, 0, 0, 0, 0, 0, 0], 17] 18 19piece = [0,0] 20back = 0 21$status = 2 #1:プレイ中 2:TURNメッセージ中 3:パスメッセージ中 4:終了 22turn = 1 #1:黒ターン 2:白ターン 23msg_wait = 0 #メッセージ待機時間 24 25$board[3][3] = $board[4][4] = 1 26$board[4][3] = $board[3][4] = 2 27 28Window.loop do 29 #指定した位置にコマを置く 30 def putPiece(x,y,turn,put_flag) 31 sum = 0 32 if $board[y][x] > 0 then return 0 end 33 (-1..1).each do |dy| (-1..1).each do |dx| 34 wx = [0, 0, 0, 0, 0, 0, 0, 0] 35 wy = [0, 0, 0, 0, 0, 0, 0, 0] 36 0.step do |wn| 37 kx = x + dx * (wn + 1) 38 ky = y + dy * (wn + 1) 39 break if kx < 0 || kx > 7 || ky < 0 || ky > 7 || $board[ky][kx] == 0 40 if $board[ky][kx] == turn then 41 if put_flag then (0..wn - 1).each do |i| $board[wy[i]][wx[i]] = turn end end 42 sum += wn 43 break 44 end 45 wx[wn] = kx 46 wy[wn] = ky 47 end 48 end end 49 if sum > 0 && put_flag then $board[y][x] = turn end 50 return sum 51 end 52 53 #パスチェック 54 def isPass(turn) 55 (0..7).each do |y| (0..7).each do |x| 56 if putPiece(x,y,turn,false) then return false end 57 end end 58 return true 59 end 60 61 #思考ルーチン1 プレイヤー 62 def think1(turn) 63 mouse_flag = false 64 if Input.mousePush?(M_LBUTTON) then 65 if mouse_flag == false then 66 mouse_flag = true 67 mx = 0, my = 0 68 mx = Input.mouse_x 69 my = Input.mouse_y 70 if putPiece(mx/48,my/48,turn,true) then return true end 71 end 72 else mouse_flag = false 73 end 74 return false 75 end 76 77 #思考ルーチン2 最もとれるところに置く 78 def think2(turn) 79 max = 0 80 wx = 0 81 wy = 0 82 (0..7).each do |y| (0..7).each do |x| 83 num = putPiece(x,y,turn,false) 84 if max < num || (max == num && rand(2) == 0) then 85 max = num 86 wx = x 87 wy = y 88 end 89 end end 90 putPiece(wx, wy,turn, true) 91 return true; 92 end 93 94 #思考ルーチン3 優先順位の高いところに置く 95 def think3(turn) 96 priority = [ 97 [ 0, 6, 2, 1, 1, 2, 6, 0], 98 [ 6, 6, 5, 4, 4, 5, 6, 6], 99 [ 2, 5, 2, 3, 3, 2, 5, 2], 100 [ 1, 4, 3, 3, 3, 3, 4, 1], 101 [ 1, 4, 3, 3, 3, 3, 4, 1], 102 [ 2, 5, 2, 3, 3, 2, 5, 2], 103 [ 6, 6, 5, 4, 4, 5, 6, 6], 104 [ 0, 6, 2, 1, 1, 2, 6, 0], 105 ] 106 max=0,wx,wy 107 108 for p in 0..6 && max == 0 do 109 (0..7).each do |y| (0..7).each do |x| 110 if priority[y][x] != p then next end 111 num = putPiece(x,y,turn, false) 112 if max < num || ( max == num && rand(2) == 0) then 113 max = num, wx = x, wy = y 114 end 115 end end 116 end 117 putPiece(wx, wy,turn,true) 118 return true 119 end 120 121 #メッセージ 122 def setMsg(turn,type) 123 turn_str = ["BLACK", "WHITE", "DRAW"] 124 type_str = ["TURN", "PASS", "WIN"] 125 msg = turn_str[turn -= 1] 126 if turn != 3 then msg += " " + type_str[type] end 127 msg_wait = 50 128 end 129 130 #勝敗チェック 131 def checkResult() 132 pnum = [0,0] 133 result = 0 134 (0..7).each do |y| (0..7).each do |x| 135 if $board[y][x] > 0 then pnum[$board[y][x] - 1] += 1 end 136 end end 137 if isPass(1) && isPass(2) then 138 if pnum[0] > pnum[1] then result = 1 139 elsif pnum[0] < pnum[1] then result = 2 140 else result = 3 141 end 142 end 143 if result != 0 then setMsg(result, 2) end 144 return result 145 end 146 setMsg(turn, 0) 147 148 #メインループ 149 case $status 150 when 1 151 if isPass(turn) then 152 setMsg(turn, 1) 153 $status = 3 154 else 155 mList = [method(:think1), method(:think2)] 156 if mList[turn - 1].call(turn) then 157 turn = 3 - turn 158 $status = 2 159 setMsg(turn,0) 160 end 161 end 162 if checkResult() != 0 then $status = 4 end 163 when 2 164 if msg_wait > 0 then msg_wait -= 1 165 else 166 $status = 1 167 #break 168 end 169 when 3 170 if msg_wait > 0 then msg_wait -= 1 171 else 172 turn = 3 - turn 173 $status= 2 174 setMsg(turn, 0) 175 end 176 break 177end 178 #描画 179 for y in 0..7 do for x in 0..7 do 180 if $board[y][x] >0 then Window.draw(x* 48,y* 48, image2[$board[y][x] -1],2) end 181 end end 182 Window.draw(0, 0, image,1) #盤面 183 #メッセージボックス表示はresult変数が解決するまでいったん削除 184 break if Input.keyPush?(K_ESCAPE) 185end
DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問