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

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

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

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

Q&A

0回答

651閲覧

Rubyでテトリス、ブロック移動の条件

mypyn11

総合スコア7

Ruby

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

0グッド

0クリップ

投稿2018/05/17 03:26

rubyでテトリスを作成しています。

このソースコードですが、このままだとブロックが永遠に落ちてきてゲームオーバーにできません。

ブロックが一番上まで積み上がった際に次のブロック生成を止めたいのですが、どこを書き換えればいいでしょうか?

Ruby

1``` 2class Tetris 3 attr 4 :block # [color,[[y,x]] 5 :board # [[color]] 6 def initialize(y,x) 7 @block = rand_block 8 @board = Array.new(y) { Array.new(x) { 0 } } 9 end 10 11 12 Blocks = [ 13 [[0,0],[1,0],[2,0],[3,0]], 14 [[0,0],[0,1],[0,2],[1,1]], 15 [[0,0],[1,0],[2,0],[0,1]], 16 [[0,0],[0,1],[1,1],[2,1]], 17 [[0,0],[1,0],[1,1],[2,1]], 18 [[0,1],[1,1],[1,0],[2,0]], 19 [[0,0],[0,1],[1,0],[1,1]], 20 ] 21 22 def rand_block 23 [rand(1..7), Blocks[rand(Blocks.size)]] 24 end 25 26 def move?(bs) 27 bs.all? do |y,x| 28 @board.size > y && 0 <= y ? 29 @board[y].size > x && 0 <= x ? 30 @board[y][x] == 0 : 31 false : 32 false 33 34 end 35 end 36 37 def rotate 38 39 r = Math::PI / 2 40 41 cy = (@block[1].map { |a| a[0] }.reduce(:+) / @block[1].size) 42 cx = (@block[1].map { |a| a[1] }.reduce(:+) / @block[1].size) 43 bs = @block[1].map do |y,x| 44 [ 45 (cy + (x - cx) * Math.sin(r) + (y - cy) * Math.cos(r)).round, 46 (cx + (x - cx) * Math.cos(r) - (y - cy) * Math.sin(r)).round 47 ] 48 end 49 50 if move?(bs) 51 @block[1] = bs 52 end 53 end 54 55 # 下に動かした時 56 def down 57 bs = @block[1].map { |y,x| [y + 1, x] } 58 if move?(bs) 59 @block[1] = bs 60 end 61 end 62 63 # 右に動かした時 64 def right 65 bs = @block[1].map { |y,x| [y, x + 1] } 66 if move?(bs) 67 @block[1] = bs 68 end 69 end 70 71 # 左に動かした時 72 def left 73 bs = @block[1].map { |y,x| [y, x - 1] } 74 if move?(bs) 75 @block[1] = bs 76 end 77 end 78 79 # 時間で落ちる 80 def fall 81 bs = @block[1].map { |y,x| [y+1,x] } 82 if move?(bs) 83 @block[1] = bs 84 else 85 @block[1].each do |y,x| 86 @board[y][x] = @block[0] 87 end 88 end 89 @block = rand_block 90 end 91 92 # 列が揃ったら消去する 93 def delete 94 for y in 0 .. @board.size - 1 95 if @board[y].all? { |c| c != 0 } 96 for yy in 0 .. y - 1 97 @board[yy].each.with_index do |c,x| 98 @board[y - yy][x] = @board[y - yy - 1][x] 99 end 100 end 101 end 102 end 103 end 104 105 106 require "curses" 107 C = Curses 108 109 def controller(c) 110 case c 111 when "w" 112 rotate 113 when "s" 114 down 115 when "d" 116 right 117 when "a" 118 left 119 when "q" 120 C.close_screen 121 exit 122 else 123 nil 124 end 125 end 126 127 def display_init 128 C.init_screen 129 C.start_color 130 C.use_default_colors 131 C.noecho 132 C.curs_set(0) 133 134 [ 135 C::COLOR_BLACK, 136 C::COLOR_RED, 137 C::COLOR_GREEN, 138 C::COLOR_YELLOW, 139 C::COLOR_BLUE, 140 C::COLOR_MAGENTA, 141 C::COLOR_CYAN, 142 C::COLOR_WHITE, 143 ].each.with_index do |c,i| 144 C.init_pair(i, C::COLOR_WHITE, c) 145 end 146 end 147 148 def display 149 C.clear 150 C.addstr("--" * (@board[0].size + 2)) 151 C.addstr("\n") 152 for y in 0 .. @board.size - 1 153 C.addstr("|") 154 for x in 0 .. @board[y].size - 1 155 c = @block[1].any? { |a| a == [y,x] } ? @block[0] : @board[y][x] 156 C.attron(C.color_pair(c)) 157 C.addstr(" ") 158 C.attroff(C.color_pair(c)) 159 end 160 C.addstr("|") 161 C.addstr("\n") 162 end 163 C.addstr("--" * (@board[0].size + 2)) 164 C.addstr("\n") 165 C.refresh 166 end 167 168#GAMEOVER 169 170 171 172 def run 173 display_init 174 175 m = Mutex.new 176 Thread.new do 177 loop do 178 m.synchronize do 179 fall 180 delete 181 display 182 end 183 sleep 1 184 end 185 end 186 187 loop do 188 controller(C.getch.to_s) 189 m.synchronize do 190 delete 191 display 192 end 193 end 194 end 195end 196 197 198Tetris.new(20,20).run 199 200``` 201ご指導よろしくお願い致します。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問