From 05f16aa6a6c33634a8b29a42f98651e9a241286c Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 17:30:45 +0900 Subject: [PATCH 01/31] s/Exception/StandardError/ --- mswp.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mswp.rb b/mswp.rb index 69a283f..e7818a4 100644 --- a/mswp.rb +++ b/mswp.rb @@ -53,10 +53,10 @@ def isDoubted end end - class GameOverException < Exception + class GameOverException < StandardError end - class GameClearException < Exception + class GameClearException < StandardError end def initialize(length, nr_mines) From 534a3a8068b83f0d98a07903dfe443349e130d74 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:08:58 +0900 Subject: [PATCH 02/31] s/@map/@field/g --- mswp.rb | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mswp.rb b/mswp.rb index e7818a4..7eae287 100644 --- a/mswp.rb +++ b/mswp.rb @@ -60,13 +60,13 @@ class GameClearException < StandardError end def initialize(length, nr_mines) - @map = MDArray.new(length) + @field = MDArray.new(length) @nr_mines = nr_mines - if @nr_mines >= @map.size + if @nr_mines >= @field.size raise ArgumentError.new end - @map.fill { |i| Cell.new } + @field.fill { |i| Cell.new } @active = false end @@ -75,7 +75,7 @@ def isTouched(pos) return end - @map[pos].isTouched + @field[pos].isTouched end def touch(pos) @@ -83,7 +83,7 @@ def touch(pos) setup(pos) end - cell = @map[pos] + cell = @field[pos] if cell.isFlagged || cell.isTouched return end @@ -109,7 +109,7 @@ def toggleFlag(pos) return end - cell = @map[pos] + cell = @field[pos] if cell.isTouched return end @@ -128,7 +128,7 @@ def toggleDoubt(pos) return end - cell = @map[pos] + cell = @field[pos] if cell.isTouched return end @@ -148,12 +148,12 @@ def touchNeighbors(pos) return end - cell = @map[pos] + cell = @field[pos] if ! cell.isTouched return end - nr_flagged_cells = @map.neighbor8_with_index(pos).inject(0) { |sum, (neighbor, i)| + nr_flagged_cells = @field.neighbor8_with_index(pos).inject(0) { |sum, (neighbor, i)| sum + (neighbor.isFlagged ? 1 : 0) } if nr_flagged_cells != cell.getNumberOfNeighborMines @@ -168,19 +168,19 @@ def flagNeighbors(pos) return end - cell = @map[pos] + cell = @field[pos] if ! cell.isTouched return end - nr_untouched_cells = @map.neighbor8_with_index(pos).inject(0) { |sum, (neighbor, i)| + nr_untouched_cells = @field.neighbor8_with_index(pos).inject(0) { |sum, (neighbor, i)| sum + (neighbor.isTouched ? 0 : 1) } if nr_untouched_cells != cell.getNumberOfNeighborMines return end - @map.neighbor8_with_index(pos).each { |(neighbor, i)| + @field.neighbor8_with_index(pos).each { |(neighbor, i)| if ! (neighbor.isTouched || neighbor.isFlagged) neighbor.flag @nr_flagged_cells += 1 @@ -189,13 +189,13 @@ def flagNeighbors(pos) end def neighbors(pos) - @map.neighbor8_with_index(pos).map { |(neighbor, i)| + @field.neighbor8_with_index(pos).map { |(neighbor, i)| [Marshal.load(Marshal.dump(neighbor)).freeze, i] } end def each - @map.each_with_index { |cell, pos| + @field.each_with_index { |cell, pos| yield(Marshal.load(Marshal.dump(cell)).freeze, pos) } end @@ -206,25 +206,25 @@ def each def setup(pos) # 地雷の配置 - (@map.all - [@map[pos]] - (@nr_mines <= @map.size - 3 ** @map.dimension ? - @map.neighbor8_with_index(pos).map { |(cell, i)| cell } : - [])).sort_by { rand }[0...@nr_mines].each { |cell| cell.mine } + (@field.all - [@field[pos]] - (@nr_mines <= @field.size - 3 ** @field.dimension ? + @field.neighbor8_with_index(pos).map { |(cell, i)| cell } : + [])).sort_by { rand }[0...@nr_mines].each { |cell| cell.mine } # 近傍地雷数の計算 - @map.each_with_index { |cell, i| + @field.each_with_index { |cell, i| if ! cell.isMined - cell.setNumberOfNeighborMines(@map.neighbor8_with_index(i).inject(0) { |sum, (neighbor, j)| + cell.setNumberOfNeighborMines(@field.neighbor8_with_index(i).inject(0) { |sum, (neighbor, j)| sum += neighbor.isMined ? 1 : 0 }) end } - @nr_untouched_cells = @map.size + @nr_untouched_cells = @field.size @nr_flagged_cells = 0 @active = true end def __touchNeighbors(pos) - @map.neighbor8_with_index(pos).each { |(cell, i)| + @field.neighbor8_with_index(pos).each { |(cell, i)| touch(i) } end From 00513bdd1549842f1f87af9778f4532c50bef1d6 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:31:18 +0900 Subject: [PATCH 03/31] =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89?= =?UTF-8?q?=E5=90=8D=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 7912439..c8f95b9 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -27,7 +27,7 @@ def move(dim, delta) MAP_HYPER_DEPTH = ARGV[3].to_i NR_MINES = ARGV[4].to_i -def printField(ms, cur) +def print_field(ms, cur) ms.each { |cell, pos| offset = ((pos == cur.pos) ? 10 : (pos.each_index.inject(true) { |tmp, i| @@ -111,7 +111,7 @@ def printField(ms, cur) begin while true - printField($ms, $cur) + print_field($ms, $cur) case Curses.getch when ?q @@ -155,14 +155,14 @@ def printField(ms, cur) end rescue MSwp::GameOverException th.kill - printField($ms, $cur) + print_field($ms, $cur) Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Over...') Curses.refresh while Curses.getch != ?q; end rescue MSwp::GameClearException th.kill - printField($ms, $cur) + print_field($ms, $cur) Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Clear!!') Curses.refresh From a82b0458717705d496f135081424b8c06de563dc Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:37:27 +0900 Subject: [PATCH 04/31] =?UTF-8?q?=E3=81=8F=E3=81=A3=E3=81=9D=E3=81=8D?= =?UTF-8?q?=E3=82=82=E3=81=84=E3=82=B0=E3=83=AD=E3=83=BC=E3=83=90=E3=83=AB?= =?UTF-8?q?=E5=A4=89=E6=95=B0=E3=82=92=E6=92=B2=E6=BB=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index c8f95b9..82ff356 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -94,8 +94,8 @@ def print_field(ms, cur) Curses.noecho Curses.curs_set(0) -$ms = MSwp.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH], NR_MINES) -$cur = Cursor.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH]) +ms = MSwp.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH], NR_MINES) +cur = Cursor.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH]) th = Thread.new { count = 0 @@ -111,58 +111,58 @@ def print_field(ms, cur) begin while true - print_field($ms, $cur) + print_field(ms, cur) case Curses.getch when ?q break when ?h - $cur.move(3, -1) + cur.move(3, -1) when ?l - $cur.move(3, 1) + cur.move(3, 1) when ?k - $cur.move(2, -1) + cur.move(2, -1) when ?j - $cur.move(2, 1) + cur.move(2, 1) when ?H - $cur.move(1, -1) + cur.move(1, -1) when ?L - $cur.move(1, 1) + cur.move(1, 1) when ?K - $cur.move(0, -1) + cur.move(0, -1) when ?J - $cur.move(0, 1) + cur.move(0, 1) when ?\s - if $ms.isTouched($cur.pos) - $ms.touchNeighbors($cur.pos) + if ms.isTouched(cur.pos) + ms.touchNeighbors(cur.pos) else - $ms.touch($cur.pos) + ms.touch(cur.pos) end when ?f - if $ms.isTouched($cur.pos) - $ms.flagNeighbors($cur.pos) + if ms.isTouched(cur.pos) + ms.flagNeighbors(cur.pos) else - $ms.toggleFlag($cur.pos) + ms.toggleFlag(cur.pos) end when ?? - $ms.toggleDoubt($cur.pos) + ms.toggleDoubt(cur.pos) end - # if $ms.isTouched($cur.pos) - # $ms.flagNeighbors($cur.pos) - # $ms.touchNeighbors($cur.pos) + # if ms.isTouched(cur.pos) + # ms.flagNeighbors(cur.pos) + # ms.touchNeighbors(cur.pos) # end end rescue MSwp::GameOverException th.kill - print_field($ms, $cur) + print_field(ms, cur) Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Over...') Curses.refresh while Curses.getch != ?q; end rescue MSwp::GameClearException th.kill - print_field($ms, $cur) + print_field(ms, cur) Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Clear!!') Curses.refresh From 69cdb48aed6d1d91de1c3ba39fdca67edfdc0776 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:39:49 +0900 Subject: [PATCH 05/31] s/&&/and/g --- mswp_curses.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 82ff356..2e40f2a 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -31,12 +31,12 @@ def print_field(ms, cur) ms.each { |cell, pos| offset = ((pos == cur.pos) ? 10 : (pos.each_index.inject(true) { |tmp, i| - (tmp && (pos[i] - cur.pos[i]).abs <= 1) + (tmp and (pos[i] - cur.pos[i]).abs <= 1) } ? 5 : 0)) Curses.setpos(pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2, 2 * pos[3] + (MAP_WIDTH + 1) * 2 * pos[1]) - if ms.active && ! cell.isTouched + if ms.active and ! cell.isTouched if cell.isFlagged Curses.attron(Curses.color_pair(3 + offset)) Curses.addstr(" !") From b323971bcf53a0943f02ff7db1bced9945876341 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:42:50 +0900 Subject: [PATCH 06/31] =?UTF-8?q?=E3=81=8F=E3=81=9D=E7=85=A9=E3=82=8F?= =?UTF-8?q?=E3=81=97=E3=81=84=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92?= =?UTF-8?q?=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 2e40f2a..163c3e7 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -36,7 +36,8 @@ def print_field(ms, cur) 5 : 0)) Curses.setpos(pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2, 2 * pos[3] + (MAP_WIDTH + 1) * 2 * pos[1]) - if ms.active and ! cell.isTouched + + if ms.active if cell.isFlagged Curses.attron(Curses.color_pair(3 + offset)) Curses.addstr(" !") @@ -45,6 +46,12 @@ def print_field(ms, cur) Curses.attron(Curses.color_pair(4 + offset)) Curses.addstr(" ?") Curses.attroff(Curses::A_COLOR) + elsif cell.isTouched + Curses.attron(Curses.color_pair(1 + offset)) + Curses.addstr((cell.getNumberOfNeighborMines == 0) ? + " ." : + sprintf('%2d', cell.getNumberOfNeighborMines)) + Curses.attroff(Curses::A_COLOR) else Curses.attron(Curses.color_pair(2 + offset)) Curses.addstr(" ") From 10e2510ccd869b54a3916ae9d1b7336c08fb78c7 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:44:51 +0900 Subject: [PATCH 07/31] =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E3=81=8A=E3=81=8B?= =?UTF-8?q?=E3=81=97=E3=81=84=E3=81=A0=E3=82=8DJK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 163c3e7..e832889 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -28,6 +28,12 @@ def move(dim, delta) NR_MINES = ARGV[4].to_i def print_field(ms, cur) + Curses.setpos(0, 0) + str = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" + Curses.attron(Curses.color_pair(2)) + Curses.addstr(str << " " * (Curses.cols - str.length)) + Curses.attroff(Curses::A_COLOR) + ms.each { |cell, pos| offset = ((pos == cur.pos) ? 10 : (pos.each_index.inject(true) { |tmp, i| @@ -72,12 +78,6 @@ def print_field(ms, cur) end } - Curses.setpos(0, 0) - str = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" - Curses.attron(Curses.color_pair(2)) - Curses.addstr(str << " " * (Curses.cols - str.length)) - Curses.attroff(Curses::A_COLOR) - Curses.refresh end From 486ba51c377ab002b50c36bbb6e2b9d86f53c86a Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:46:19 +0900 Subject: [PATCH 08/31] =?UTF-8?q?header=E7=94=9F=E6=88=90=E9=83=A8?= =?UTF-8?q?=E5=88=86=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index e832889..66acccb 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -29,9 +29,10 @@ def move(dim, delta) def print_field(ms, cur) Curses.setpos(0, 0) - str = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" + header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" + header << " " * (Curses.cols - header.length) Curses.attron(Curses.color_pair(2)) - Curses.addstr(str << " " * (Curses.cols - str.length)) + Curses.addstr(header) Curses.attroff(Curses::A_COLOR) ms.each { |cell, pos| From f487c9753db53e6041916e4625a60355d5848c50 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 18:49:42 +0900 Subject: [PATCH 09/31] {} -> do --- mswp_curses.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 66acccb..c089ca8 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -35,7 +35,7 @@ def print_field(ms, cur) Curses.addstr(header) Curses.attroff(Curses::A_COLOR) - ms.each { |cell, pos| + ms.each do |cell, pos| offset = ((pos == cur.pos) ? 10 : (pos.each_index.inject(true) { |tmp, i| (tmp and (pos[i] - cur.pos[i]).abs <= 1) @@ -77,7 +77,7 @@ def print_field(ms, cur) Curses.attroff(Curses::A_COLOR) end end - } + end Curses.refresh end @@ -105,7 +105,7 @@ def print_field(ms, cur) ms = MSwp.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH], NR_MINES) cur = Cursor.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH]) -th = Thread.new { +th = Thread.new do count = 0 while true Curses.setpos(1, 0) @@ -115,7 +115,7 @@ def print_field(ms, cur) sleep 1 count += 1 end -} +end begin while true From e2087ad18fb2a906e1a347013f91f107337878eb Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 19:03:17 +0900 Subject: [PATCH 10/31] =?UTF-8?q?curses=E3=81=AE=E3=81=8F=E3=81=9D?= =?UTF-8?q?=E3=81=8D=E3=82=82=E3=81=84=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92?= =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 71 +++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 38 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index c089ca8..3f3424a 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -27,56 +27,51 @@ def move(dim, delta) MAP_HYPER_DEPTH = ARGV[3].to_i NR_MINES = ARGV[4].to_i +def curses_print(str, y, x, attrs) + Curses.setpos(y, x) + Curses.attron(attrs) + Curses.addstr(str) + Curses.attroff(attrs) +end + def print_field(ms, cur) - Curses.setpos(0, 0) header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" header << " " * (Curses.cols - header.length) - Curses.attron(Curses.color_pair(2)) - Curses.addstr(header) - Curses.attroff(Curses::A_COLOR) + curses_print header, 0, 0, Curses.color_pair(2) ms.each do |cell, pos| + y = pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2 + x = 2 * pos[3] + (MAP_WIDTH + 1) * 2 * pos[1] + offset = ((pos == cur.pos) ? 10 : (pos.each_index.inject(true) { |tmp, i| (tmp and (pos[i] - cur.pos[i]).abs <= 1) } ? 5 : 0)) - Curses.setpos(pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2, 2 * pos[3] + (MAP_WIDTH + 1) * 2 * pos[1]) - - if ms.active - if cell.isFlagged - Curses.attron(Curses.color_pair(3 + offset)) - Curses.addstr(" !") - Curses.attroff(Curses::A_COLOR) - elsif cell.isDoubted - Curses.attron(Curses.color_pair(4 + offset)) - Curses.addstr(" ?") - Curses.attroff(Curses::A_COLOR) - elsif cell.isTouched - Curses.attron(Curses.color_pair(1 + offset)) - Curses.addstr((cell.getNumberOfNeighborMines == 0) ? + str, attrs = if ms.active + if cell.isFlagged + [" !", Curses.color_pair(3 + offset)] + elsif cell.isDoubted + [" ?", Curses.color_pair(4 + offset)] + elsif cell.isTouched + [(cell.getNumberOfNeighborMines == 0) ? " ." : - sprintf('%2d', cell.getNumberOfNeighborMines)) - Curses.attroff(Curses::A_COLOR) - else - Curses.attron(Curses.color_pair(2 + offset)) - Curses.addstr(" ") - Curses.attroff(Curses::A_COLOR) - end - else - if cell.isMined - Curses.attron(Curses.color_pair(5 + offset)) - Curses.addstr(" *") - Curses.attroff(Curses::A_COLOR) - else - Curses.attron(Curses.color_pair(1 + offset)) - Curses.addstr((cell.getNumberOfNeighborMines == 0) ? - " ." : - sprintf('%2d', cell.getNumberOfNeighborMines)) - Curses.attroff(Curses::A_COLOR) - end - end + sprintf('%2d', cell.getNumberOfNeighborMines), Curses.color_pair(1 + offset)] + else + [" ", Curses.color_pair(2 + offset)] + end + else + if cell.isMined + [" *", Curses.color_pair(5 + offset)] + else + [(cell.getNumberOfNeighborMines == 0) ? + " ." : + sprintf('%2d', cell.getNumberOfNeighborMines), Curses.color_pair(1 + offset)] + end + end + + curses_print str, y, x, attrs end Curses.refresh From a12cf654bfc6e167483fee5aaf14468e44595e77 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 19:09:00 +0900 Subject: [PATCH 11/31] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=BC=94=E7=AE=97?= =?UTF-8?q?=E5=AD=90=E3=82=92=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 3f3424a..020d949 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -43,11 +43,13 @@ def print_field(ms, cur) y = pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2 x = 2 * pos[3] + (MAP_WIDTH + 1) * 2 * pos[1] - offset = ((pos == cur.pos) ? - 10 : (pos.each_index.inject(true) { |tmp, i| - (tmp and (pos[i] - cur.pos[i]).abs <= 1) - } ? - 5 : 0)) + offset = if pos == cur.pos + 10 + elsif pos.each_index.inject(true) { |t, i| (t and (pos[i] - cur.pos[i]).abs <= 1) } + 5 + else + 0 + end str, attrs = if ms.active if cell.isFlagged From 411c9583d20a6e0f7fb7d7fe1f1f79f2b3449b21 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 19:19:51 +0900 Subject: [PATCH 12/31] =?UTF-8?q?elsif=E3=81=8D=E3=82=82=E3=81=84=E3=81=AE?= =?UTF-8?q?=E3=81=A7case=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 020d949..d4d09a6 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -43,20 +43,22 @@ def print_field(ms, cur) y = pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2 x = 2 * pos[3] + (MAP_WIDTH + 1) * 2 * pos[1] - offset = if pos == cur.pos + offset = case + when pos == cur.pos 10 - elsif pos.each_index.inject(true) { |t, i| (t and (pos[i] - cur.pos[i]).abs <= 1) } + when pos.each_index.inject(true) { |t, i| (t and (pos[i] - cur.pos[i]).abs <= 1) } 5 else 0 end str, attrs = if ms.active - if cell.isFlagged + case + when cell.isFlagged [" !", Curses.color_pair(3 + offset)] - elsif cell.isDoubted + when cell.isDoubted [" ?", Curses.color_pair(4 + offset)] - elsif cell.isTouched + when cell.isTouched [(cell.getNumberOfNeighborMines == 0) ? " ." : sprintf('%2d', cell.getNumberOfNeighborMines), Curses.color_pair(1 + offset)] @@ -64,7 +66,8 @@ def print_field(ms, cur) [" ", Curses.color_pair(2 + offset)] end else - if cell.isMined + case + when cell.isMined [" *", Curses.color_pair(5 + offset)] else [(cell.getNumberOfNeighborMines == 0) ? From 7e8accd3ec35eace91c5c2899e72d34659d35882 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 19:21:44 +0900 Subject: [PATCH 13/31] =?UTF-8?q?header=E3=81=BE=E3=82=8F=E3=82=8A?= =?UTF-8?q?=E3=82=92=E5=86=8D=E5=BA=A6=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index d4d09a6..558fa93 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -36,8 +36,8 @@ def curses_print(str, y, x, attrs) def print_field(ms, cur) header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" - header << " " * (Curses.cols - header.length) - curses_print header, 0, 0, Curses.color_pair(2) + curses_print header + " " * (Curses.cols - header.length), + 0, 0, Curses.color_pair(2) ms.each do |cell, pos| y = pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2 From 5e65c32765900c3878e8536208b60e8d076c60b9 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 21:15:23 +0900 Subject: [PATCH 14/31] =?UTF-8?q?sprintf=E3=81=AE=E3=81=82=E3=81=9F?= =?UTF-8?q?=E3=82=8A=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 558fa93..1327f69 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -60,8 +60,8 @@ def print_field(ms, cur) [" ?", Curses.color_pair(4 + offset)] when cell.isTouched [(cell.getNumberOfNeighborMines == 0) ? - " ." : - sprintf('%2d', cell.getNumberOfNeighborMines), Curses.color_pair(1 + offset)] + " ." : '%2d' % cell.getNumberOfNeighborMines, + Curses.color_pair(1 + offset)] else [" ", Curses.color_pair(2 + offset)] end @@ -71,8 +71,8 @@ def print_field(ms, cur) [" *", Curses.color_pair(5 + offset)] else [(cell.getNumberOfNeighborMines == 0) ? - " ." : - sprintf('%2d', cell.getNumberOfNeighborMines), Curses.color_pair(1 + offset)] + " ." : '%2d' % cell.getNumberOfNeighborMines, + Curses.color_pair(1 + offset)] end end From da35c78832cd66eaa963236443d563b8b94844d6 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 21:16:15 +0900 Subject: [PATCH 15/31] =?UTF-8?q?''=20=E3=81=AB=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 1327f69..d812b18 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -55,23 +55,23 @@ def print_field(ms, cur) str, attrs = if ms.active case when cell.isFlagged - [" !", Curses.color_pair(3 + offset)] + [' !', Curses.color_pair(3 + offset)] when cell.isDoubted - [" ?", Curses.color_pair(4 + offset)] + [' ?', Curses.color_pair(4 + offset)] when cell.isTouched [(cell.getNumberOfNeighborMines == 0) ? - " ." : '%2d' % cell.getNumberOfNeighborMines, + ' .' : '%2d' % cell.getNumberOfNeighborMines, Curses.color_pair(1 + offset)] else - [" ", Curses.color_pair(2 + offset)] + [' ', Curses.color_pair(2 + offset)] end else case when cell.isMined - [" *", Curses.color_pair(5 + offset)] + [' *', Curses.color_pair(5 + offset)] else [(cell.getNumberOfNeighborMines == 0) ? - " ." : '%2d' % cell.getNumberOfNeighborMines, + ' .' : '%2d' % cell.getNumberOfNeighborMines, Curses.color_pair(1 + offset)] end end From 2d4bcb64206f940305ccb5892bde5bdf06c2229e Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 21:28:44 +0900 Subject: [PATCH 16/31] =?UTF-8?q?=E5=AE=9A=E6=95=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index d812b18..2095716 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -34,14 +34,19 @@ def curses_print(str, y, x, attrs) Curses.attroff(attrs) end +CellWidth = 2 +CellHeight = 1 +HeaderHeight = 2 +MarginBtwDim = 1 + def print_field(ms, cur) header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" curses_print header + " " * (Curses.cols - header.length), 0, 0, Curses.color_pair(2) ms.each do |cell, pos| - y = pos[2] + (MAP_HEIGHT + 1) * pos[0] + 2 - x = 2 * pos[3] + (MAP_WIDTH + 1) * 2 * pos[1] + y = CellHeight * pos[2] + (MAP_HEIGHT + MarginBtwDim) * CellHeight * pos[0] + HeaderHeight + x = CellWidth * pos[3] + (MAP_WIDTH + MarginBtwDim) * CellWidth * pos[1] offset = case when pos == cur.pos From 54e0feb63890ff5ad9b58bba8838be3cd87a55f1 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 21:41:04 +0900 Subject: [PATCH 17/31] =?UTF-8?q?=E5=9B=A0=E6=95=B0=E5=88=86=E8=A7=A3?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=81=BF=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 2095716..7aa991b 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -45,8 +45,8 @@ def print_field(ms, cur) 0, 0, Curses.color_pair(2) ms.each do |cell, pos| - y = CellHeight * pos[2] + (MAP_HEIGHT + MarginBtwDim) * CellHeight * pos[0] + HeaderHeight - x = CellWidth * pos[3] + (MAP_WIDTH + MarginBtwDim) * CellWidth * pos[1] + y = CellHeight * ((MAP_HEIGHT + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight + x = CellWidth * ((MAP_WIDTH + MarginBtwDim) * pos[1] + pos[3]) offset = case when pos == cur.pos From b7b101f7a8da1f2f39e488eeb1eecd9d4ec74ba7 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 22:00:24 +0900 Subject: [PATCH 18/31] s/offset/color_offset/g --- mswp_curses.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 7aa991b..9068496 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -48,36 +48,36 @@ def print_field(ms, cur) y = CellHeight * ((MAP_HEIGHT + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight x = CellWidth * ((MAP_WIDTH + MarginBtwDim) * pos[1] + pos[3]) - offset = case - when pos == cur.pos - 10 - when pos.each_index.inject(true) { |t, i| (t and (pos[i] - cur.pos[i]).abs <= 1) } - 5 - else - 0 - end + color_offset = case + when pos == cur.pos + 10 + when pos.each_index.inject(true) { |t, i| (t and (pos[i] - cur.pos[i]).abs <= 1) } + 5 + else + 0 + end str, attrs = if ms.active case when cell.isFlagged - [' !', Curses.color_pair(3 + offset)] + [' !', Curses.color_pair(3 + color_offset)] when cell.isDoubted - [' ?', Curses.color_pair(4 + offset)] + [' ?', Curses.color_pair(4 + color_offset)] when cell.isTouched [(cell.getNumberOfNeighborMines == 0) ? ' .' : '%2d' % cell.getNumberOfNeighborMines, - Curses.color_pair(1 + offset)] + Curses.color_pair(1 + color_offset)] else - [' ', Curses.color_pair(2 + offset)] + [' ', Curses.color_pair(2 + color_offset)] end else case when cell.isMined - [' *', Curses.color_pair(5 + offset)] + [' *', Curses.color_pair(5 + color_offset)] else [(cell.getNumberOfNeighborMines == 0) ? ' .' : '%2d' % cell.getNumberOfNeighborMines, - Curses.color_pair(1 + offset)] + Curses.color_pair(1 + color_offset)] end end From 2cb286440f78f4361bb1e2f647088ff1abd45117 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 22:21:42 +0900 Subject: [PATCH 19/31] =?UTF-8?q?=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8?= =?UTF-8?q?=E3=81=8D=E3=82=82=E3=81=84=E3=81=91=E3=81=A9=E3=81=BE=E3=81=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 9068496..9b89ffe 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -58,12 +58,12 @@ def print_field(ms, cur) end str, attrs = if ms.active - case - when cell.isFlagged + case cell + when :isFlagged.to_proc [' !', Curses.color_pair(3 + color_offset)] - when cell.isDoubted + when :isDoubted.to_proc [' ?', Curses.color_pair(4 + color_offset)] - when cell.isTouched + when :isTouched.to_proc [(cell.getNumberOfNeighborMines == 0) ? ' .' : '%2d' % cell.getNumberOfNeighborMines, Curses.color_pair(1 + color_offset)] @@ -71,8 +71,8 @@ def print_field(ms, cur) [' ', Curses.color_pair(2 + color_offset)] end else - case - when cell.isMined + case cell + when :isMined.to_proc [' *', Curses.color_pair(5 + color_offset)] else [(cell.getNumberOfNeighborMines == 0) ? From 36d5414330ff8036ecf90f6d9b088e763216332a Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 22:27:59 +0900 Subject: [PATCH 20/31] =?UTF-8?q?=E3=82=AB=E3=83=BC=E3=82=BD=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E8=BF=91=E5=82=8D=E5=88=A4=E5=AE=9A=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 9b89ffe..715e42a 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -51,7 +51,7 @@ def print_field(ms, cur) color_offset = case when pos == cur.pos 10 - when pos.each_index.inject(true) { |t, i| (t and (pos[i] - cur.pos[i]).abs <= 1) } + when pos.zip(cur.pos).all? { |p, c| (p - c).abs <= 1 } 5 else 0 From 880a5338f31bf8eaddc5c062036ffe2d60fa1663 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 22:38:25 +0900 Subject: [PATCH 21/31] =?UTF-8?q?=E3=83=AC=E3=83=B3=E3=83=80=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=B0=E6=A9=9F=E8=83=BD=E3=82=92Class=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 162 ++++++++++++++++++++++++++----------------------- 1 file changed, 87 insertions(+), 75 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 715e42a..89a5ea2 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -27,85 +27,97 @@ def move(dim, delta) MAP_HYPER_DEPTH = ARGV[3].to_i NR_MINES = ARGV[4].to_i -def curses_print(str, y, x, attrs) - Curses.setpos(y, x) - Curses.attron(attrs) - Curses.addstr(str) - Curses.attroff(attrs) -end +class CursesRenderer + CellWidth = 2 + CellHeight = 1 + HeaderHeight = 2 + MarginBtwDim = 1 + + def initialize + Curses.init_screen + Curses.start_color + Curses.init_pair(1, Curses::COLOR_WHITE, Curses::COLOR_BLACK) + Curses.init_pair(2, Curses::COLOR_BLACK, Curses::COLOR_WHITE) + Curses.init_pair(3, Curses::COLOR_RED, Curses::COLOR_WHITE) + Curses.init_pair(4, Curses::COLOR_BLUE, Curses::COLOR_WHITE) + Curses.init_pair(5, Curses::COLOR_BLACK, Curses::COLOR_RED) + Curses.init_pair(6, Curses::COLOR_WHITE, Curses::COLOR_BLUE) + Curses.init_pair(7, Curses::COLOR_BLACK, Curses::COLOR_CYAN) + Curses.init_pair(8, Curses::COLOR_RED, Curses::COLOR_CYAN) + Curses.init_pair(9, Curses::COLOR_BLUE, Curses::COLOR_CYAN) + Curses.init_pair(10, Curses::COLOR_BLACK, Curses::COLOR_RED) + Curses.init_pair(11, Curses::COLOR_WHITE, Curses::COLOR_GREEN) + Curses.init_pair(12, Curses::COLOR_BLACK, Curses::COLOR_YELLOW) + Curses.init_pair(13, Curses::COLOR_RED, Curses::COLOR_YELLOW) + Curses.init_pair(14, Curses::COLOR_BLUE, Curses::COLOR_YELLOW) + Curses.init_pair(15, Curses::COLOR_RED, Curses::COLOR_BLACK) + Curses.noecho + Curses.curs_set(0) + end -CellWidth = 2 -CellHeight = 1 -HeaderHeight = 2 -MarginBtwDim = 1 - -def print_field(ms, cur) - header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" - curses_print header + " " * (Curses.cols - header.length), - 0, 0, Curses.color_pair(2) - - ms.each do |cell, pos| - y = CellHeight * ((MAP_HEIGHT + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight - x = CellWidth * ((MAP_WIDTH + MarginBtwDim) * pos[1] + pos[3]) - - color_offset = case - when pos == cur.pos - 10 - when pos.zip(cur.pos).all? { |p, c| (p - c).abs <= 1 } - 5 - else - 0 - end - - str, attrs = if ms.active - case cell - when :isFlagged.to_proc - [' !', Curses.color_pair(3 + color_offset)] - when :isDoubted.to_proc - [' ?', Curses.color_pair(4 + color_offset)] - when :isTouched.to_proc - [(cell.getNumberOfNeighborMines == 0) ? - ' .' : '%2d' % cell.getNumberOfNeighborMines, - Curses.color_pair(1 + color_offset)] - else - [' ', Curses.color_pair(2 + color_offset)] - end - else - case cell - when :isMined.to_proc - [' *', Curses.color_pair(5 + color_offset)] + def cleanup + Curses.close_screen + end + + def print_field(ms, cur) + header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" + curses_print header + " " * (Curses.cols - header.length), + 0, 0, Curses.color_pair(2) + + ms.each do |cell, pos| + y = CellHeight * ((MAP_HEIGHT + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight + x = CellWidth * ((MAP_WIDTH + MarginBtwDim) * pos[1] + pos[3]) + + color_offset = case + when pos == cur.pos + 10 + when pos.zip(cur.pos).all? { |p, c| (p - c).abs <= 1 } + 5 + else + 0 + end + + str, attrs = if ms.active + case cell + when :isFlagged.to_proc + [' !', Curses.color_pair(3 + color_offset)] + when :isDoubted.to_proc + [' ?', Curses.color_pair(4 + color_offset)] + when :isTouched.to_proc + [(cell.getNumberOfNeighborMines == 0) ? + ' .' : '%2d' % cell.getNumberOfNeighborMines, + Curses.color_pair(1 + color_offset)] + else + [' ', Curses.color_pair(2 + color_offset)] + end else - [(cell.getNumberOfNeighborMines == 0) ? - ' .' : '%2d' % cell.getNumberOfNeighborMines, - Curses.color_pair(1 + color_offset)] + case cell + when :isMined.to_proc + [' *', Curses.color_pair(5 + color_offset)] + else + [(cell.getNumberOfNeighborMines == 0) ? + ' .' : '%2d' % cell.getNumberOfNeighborMines, + Curses.color_pair(1 + color_offset)] + end end - end - curses_print str, y, x, attrs + curses_print str, y, x, attrs + end + + Curses.refresh end - Curses.refresh + private + + def curses_print(str, y, x, attrs) + Curses.setpos(y, x) + Curses.attron(attrs) + Curses.addstr(str) + Curses.attroff(attrs) + end end -Curses.init_screen -Curses.start_color -Curses.init_pair(1, Curses::COLOR_WHITE, Curses::COLOR_BLACK) -Curses.init_pair(2, Curses::COLOR_BLACK, Curses::COLOR_WHITE) -Curses.init_pair(3, Curses::COLOR_RED, Curses::COLOR_WHITE) -Curses.init_pair(4, Curses::COLOR_BLUE, Curses::COLOR_WHITE) -Curses.init_pair(5, Curses::COLOR_BLACK, Curses::COLOR_RED) -Curses.init_pair(6, Curses::COLOR_WHITE, Curses::COLOR_BLUE) -Curses.init_pair(7, Curses::COLOR_BLACK, Curses::COLOR_CYAN) -Curses.init_pair(8, Curses::COLOR_RED, Curses::COLOR_CYAN) -Curses.init_pair(9, Curses::COLOR_BLUE, Curses::COLOR_CYAN) -Curses.init_pair(10, Curses::COLOR_BLACK, Curses::COLOR_RED) -Curses.init_pair(11, Curses::COLOR_WHITE, Curses::COLOR_GREEN) -Curses.init_pair(12, Curses::COLOR_BLACK, Curses::COLOR_YELLOW) -Curses.init_pair(13, Curses::COLOR_RED, Curses::COLOR_YELLOW) -Curses.init_pair(14, Curses::COLOR_BLUE, Curses::COLOR_YELLOW) -Curses.init_pair(15, Curses::COLOR_RED, Curses::COLOR_BLACK) -Curses.noecho -Curses.curs_set(0) +renderer = CursesRenderer.new ms = MSwp.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH], NR_MINES) cur = Cursor.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH]) @@ -124,7 +136,7 @@ def print_field(ms, cur) begin while true - print_field(ms, cur) + renderer.print_field(ms, cur) case Curses.getch when ?q @@ -168,18 +180,18 @@ def print_field(ms, cur) end rescue MSwp::GameOverException th.kill - print_field(ms, cur) + renderer.print_field(ms, cur) Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Over...') Curses.refresh while Curses.getch != ?q; end rescue MSwp::GameClearException th.kill - print_field(ms, cur) + renderer.print_field(ms, cur) Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Clear!!') Curses.refresh while Curses.getch != ?q; end end -Curses.close_screen +renderer.cleanup From a1e35ade04946d67129213d739e378a4b953b00d Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:22:18 +0900 Subject: [PATCH 22/31] =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 89a5ea2..d94b1cc 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -107,6 +107,24 @@ def print_field(ms, cur) Curses.refresh end + def print_time(min, sec) + Curses.setpos(1, 0) + Curses.addstr(sprintf('TIME: %02d:%02d', min, sec)) + Curses.refresh + end + + def print_gameover + Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) + Curses.addstr('Game Over...') + Curses.refresh + end + + def print_gameclear + Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) + Curses.addstr('Game Clear!!') + Curses.refresh + end + private def curses_print(str, y, x, attrs) @@ -125,9 +143,7 @@ def curses_print(str, y, x, attrs) th = Thread.new do count = 0 while true - Curses.setpos(1, 0) - Curses.addstr(sprintf('TIME: %02d:%02d', count / 60, count % 60)) - Curses.refresh + renderer.print_time(count / 60, count % 60) sleep 1 count += 1 @@ -181,16 +197,12 @@ def curses_print(str, y, x, attrs) rescue MSwp::GameOverException th.kill renderer.print_field(ms, cur) - Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) - Curses.addstr('Game Over...') - Curses.refresh + renderer.print_gameover while Curses.getch != ?q; end rescue MSwp::GameClearException th.kill renderer.print_field(ms, cur) - Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) - Curses.addstr('Game Clear!!') - Curses.refresh + renderer.print_gameclear while Curses.getch != ?q; end end From 486560fd79505f88db646084d19c0afcf0401ed8 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:30:15 +0900 Subject: [PATCH 23/31] =?UTF-8?q?=E5=AE=9A=E6=95=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index d94b1cc..8341f27 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -114,13 +114,13 @@ def print_time(min, sec) end def print_gameover - Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) + Curses.setpos(CellHeight * (MAP_HEIGHT + MarginBtwDim) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Over...') Curses.refresh end def print_gameclear - Curses.setpos((MAP_HEIGHT + 1) * MAP_HYPER_DEPTH + 2, 0) + Curses.setpos(CellHeight * (MAP_HEIGHT + MarginBtwDim) * MAP_HYPER_DEPTH + 2, 0) Curses.addstr('Game Clear!!') Curses.refresh end From 43ded5363c3f2877aafb22c764bf8a5bf08aa789 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:31:07 +0900 Subject: [PATCH 24/31] while true -> loop --- mswp_curses.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 8341f27..02ae078 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -142,7 +142,7 @@ def curses_print(str, y, x, attrs) th = Thread.new do count = 0 - while true + loop do renderer.print_time(count / 60, count % 60) sleep 1 From 68bd43c5a5d8c377c66c6ae4a4cdc731ab76fc87 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:32:53 +0900 Subject: [PATCH 25/31] =?UTF-8?q?game=20over=20/=20clear=E3=81=AE=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E5=85=B1=E9=80=9A=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 02ae078..9af2625 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -194,15 +194,17 @@ def curses_print(str, y, x, attrs) # ms.touchNeighbors(cur.pos) # end end -rescue MSwp::GameOverException - th.kill - renderer.print_field(ms, cur) - renderer.print_gameover - while Curses.getch != ?q; end -rescue MSwp::GameClearException +rescue MSwp::GameOverException, MSwp::GameClearException => e th.kill + renderer.print_field(ms, cur) - renderer.print_gameclear + case e + when MSwp::GameOverException + renderer.print_gameover + when MSwp::GameClearException + renderer.print_gameclear + end + while Curses.getch != ?q; end end From 127fabf3b0b26ef0593d222c191495f18e1fbd85 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:35:18 +0900 Subject: [PATCH 26/31] rename variable --- mswp_curses.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 9af2625..20c66b5 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -140,7 +140,7 @@ def curses_print(str, y, x, attrs) ms = MSwp.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH], NR_MINES) cur = Cursor.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH]) -th = Thread.new do +counter_thread = Thread.new do count = 0 loop do renderer.print_time(count / 60, count % 60) @@ -195,7 +195,7 @@ def curses_print(str, y, x, attrs) # end end rescue MSwp::GameOverException, MSwp::GameClearException => e - th.kill + counter_thread.kill renderer.print_field(ms, cur) case e From 0a61ae463ef53fe4fb2b551ac399f249615bbcdb Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:39:08 +0900 Subject: [PATCH 27/31] rename constants --- mswp_curses.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 20c66b5..bfa38a5 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -21,11 +21,11 @@ def move(dim, delta) attr_reader :pos end -MAP_WIDTH = ARGV[0].to_i -MAP_HEIGHT = ARGV[1].to_i -MAP_DEPTH = ARGV[2].to_i -MAP_HYPER_DEPTH = ARGV[3].to_i -NR_MINES = ARGV[4].to_i +FieldWidth = ARGV[0].to_i +FieldHeight = ARGV[1].to_i +FieldDepth = ARGV[2].to_i +FieldHyperDepth = ARGV[3].to_i +NumberOfMines = ARGV[4].to_i class CursesRenderer CellWidth = 2 @@ -65,8 +65,8 @@ def print_field(ms, cur) 0, 0, Curses.color_pair(2) ms.each do |cell, pos| - y = CellHeight * ((MAP_HEIGHT + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight - x = CellWidth * ((MAP_WIDTH + MarginBtwDim) * pos[1] + pos[3]) + y = CellHeight * ((FieldHeight + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight + x = CellWidth * ((FieldWidth + MarginBtwDim) * pos[1] + pos[3]) color_offset = case when pos == cur.pos @@ -114,13 +114,13 @@ def print_time(min, sec) end def print_gameover - Curses.setpos(CellHeight * (MAP_HEIGHT + MarginBtwDim) * MAP_HYPER_DEPTH + 2, 0) + Curses.setpos(CellHeight * (FieldHeight + MarginBtwDim) * FieldHyperDepth + 2, 0) Curses.addstr('Game Over...') Curses.refresh end def print_gameclear - Curses.setpos(CellHeight * (MAP_HEIGHT + MarginBtwDim) * MAP_HYPER_DEPTH + 2, 0) + Curses.setpos(CellHeight * (FieldHeight + MarginBtwDim) * FieldHyperDepth + 2, 0) Curses.addstr('Game Clear!!') Curses.refresh end @@ -137,8 +137,8 @@ def curses_print(str, y, x, attrs) renderer = CursesRenderer.new -ms = MSwp.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH], NR_MINES) -cur = Cursor.new([MAP_HYPER_DEPTH, MAP_DEPTH, MAP_HEIGHT, MAP_WIDTH]) +ms = MSwp.new([FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth], NumberOfMines) +cur = Cursor.new([FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth]) counter_thread = Thread.new do count = 0 From 810faa8cecd2a9254ea728f3b8924e510a0c3ae3 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:42:42 +0900 Subject: [PATCH 28/31] =?UTF-8?q?print=5Ffield=E3=83=A1=E3=82=BD=E3=83=83?= =?UTF-8?q?=E3=83=89=E3=81=AE=E5=9E=8B=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index bfa38a5..3874cbc 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -59,8 +59,8 @@ def cleanup Curses.close_screen end - def print_field(ms, cur) - header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur.pos.reverse.join(', ')})" + def print_field(ms, cur_pos) + header = "Mines: #{ms.nr_mines}, Flagged: #{ms.nr_flagged_cells}, Untouched: #{ms.nr_untouched_cells}, Position: (#{cur_pos.reverse.join(', ')})" curses_print header + " " * (Curses.cols - header.length), 0, 0, Curses.color_pair(2) @@ -69,9 +69,9 @@ def print_field(ms, cur) x = CellWidth * ((FieldWidth + MarginBtwDim) * pos[1] + pos[3]) color_offset = case - when pos == cur.pos + when pos == cur_pos 10 - when pos.zip(cur.pos).all? { |p, c| (p - c).abs <= 1 } + when pos.zip(cur_pos).all? { |p, c| (p - c).abs <= 1 } 5 else 0 @@ -152,7 +152,7 @@ def curses_print(str, y, x, attrs) begin while true - renderer.print_field(ms, cur) + renderer.print_field(ms, cur.pos) case Curses.getch when ?q @@ -197,7 +197,7 @@ def curses_print(str, y, x, attrs) rescue MSwp::GameOverException, MSwp::GameClearException => e counter_thread.kill - renderer.print_field(ms, cur) + renderer.print_field(ms, cur.pos) case e when MSwp::GameOverException renderer.print_gameover From 1a7448b18b5e51e1070ed50a87a4ddb6f77211d3 Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:51:15 +0900 Subject: [PATCH 29/31] =?UTF-8?q?=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index 3874cbc..de3ce0f 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -33,7 +33,12 @@ class CursesRenderer HeaderHeight = 2 MarginBtwDim = 1 - def initialize + def initialize(field_hyper_depth, field_depth, field_height, field_width) + @field_hyper_depth = field_hyper_depth + @field_depth = field_depth + @field_height = field_height + @field_width = field_width + Curses.init_screen Curses.start_color Curses.init_pair(1, Curses::COLOR_WHITE, Curses::COLOR_BLACK) @@ -65,8 +70,8 @@ def print_field(ms, cur_pos) 0, 0, Curses.color_pair(2) ms.each do |cell, pos| - y = CellHeight * ((FieldHeight + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight - x = CellWidth * ((FieldWidth + MarginBtwDim) * pos[1] + pos[3]) + y = CellHeight * ((@field_height + MarginBtwDim) * pos[0] + pos[2]) + HeaderHeight + x = CellWidth * ((@field_width + MarginBtwDim) * pos[1] + pos[3]) color_offset = case when pos == cur_pos @@ -114,13 +119,13 @@ def print_time(min, sec) end def print_gameover - Curses.setpos(CellHeight * (FieldHeight + MarginBtwDim) * FieldHyperDepth + 2, 0) + Curses.setpos(CellHeight * (@field_height + MarginBtwDim) * @field_hyper_depth + 2, 0) Curses.addstr('Game Over...') Curses.refresh end def print_gameclear - Curses.setpos(CellHeight * (FieldHeight + MarginBtwDim) * FieldHyperDepth + 2, 0) + Curses.setpos(CellHeight * (@field_height + MarginBtwDim) * @field_hyper_depth + 2, 0) Curses.addstr('Game Clear!!') Curses.refresh end @@ -135,7 +140,7 @@ def curses_print(str, y, x, attrs) end end -renderer = CursesRenderer.new +renderer = CursesRenderer.new(FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth) ms = MSwp.new([FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth], NumberOfMines) cur = Cursor.new([FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth]) From d9d7d008e72409d02abd3a36ebea19d997c8e81f Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Sun, 17 Jan 2016 23:52:21 +0900 Subject: [PATCH 30/31] =?UTF-8?q?=E5=AE=9A=E6=95=B0=E5=AE=9A=E7=BE=A9?= =?UTF-8?q?=E3=81=AE=E4=BD=8D=E7=BD=AE=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index de3ce0f..be38acc 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -21,12 +21,6 @@ def move(dim, delta) attr_reader :pos end -FieldWidth = ARGV[0].to_i -FieldHeight = ARGV[1].to_i -FieldDepth = ARGV[2].to_i -FieldHyperDepth = ARGV[3].to_i -NumberOfMines = ARGV[4].to_i - class CursesRenderer CellWidth = 2 CellHeight = 1 @@ -140,6 +134,12 @@ def curses_print(str, y, x, attrs) end end +FieldWidth = ARGV[0].to_i +FieldHeight = ARGV[1].to_i +FieldDepth = ARGV[2].to_i +FieldHyperDepth = ARGV[3].to_i +NumberOfMines = ARGV[4].to_i + renderer = CursesRenderer.new(FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth) ms = MSwp.new([FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth], NumberOfMines) From b358449f7b1c14213e0abef9e038af03bd86cbaa Mon Sep 17 00:00:00 2001 From: Ysk Y Date: Mon, 18 Jan 2016 00:04:36 +0900 Subject: [PATCH 31/31] =?UTF-8?q?Cursor=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mswp_curses.rb | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/mswp_curses.rb b/mswp_curses.rb index be38acc..4d70fe8 100755 --- a/mswp_curses.rb +++ b/mswp_curses.rb @@ -2,23 +2,25 @@ # -*- coding: utf-8 -*- require 'curses' +require 'matrix' require './mswp.rb' class Cursor - def initialize(length) - @length = length.freeze - @pos = Array.new(length.length, 0) - end + def initialize(size) + @size = size.freeze - def move(dim, delta) - if ! ((0...@length[dim]) === @pos[dim] + delta) - return - end + dim = size.size + @pos = Vector[*([0] * dim)] + end - @pos[dim] += delta + def move(delta) + new_pos = @pos + delta + @pos = new_pos.zip(@size).all? { |p, s| (0...s).include? p } ? new_pos : @pos end - attr_reader :pos + def pos + @pos.to_a + end end class CursesRenderer @@ -143,7 +145,7 @@ def curses_print(str, y, x, attrs) renderer = CursesRenderer.new(FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth) ms = MSwp.new([FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth], NumberOfMines) -cur = Cursor.new([FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth]) +cur = Cursor.new(Vector[FieldHyperDepth, FieldDepth, FieldHeight, FieldWidth]) counter_thread = Thread.new do count = 0 @@ -163,21 +165,21 @@ def curses_print(str, y, x, attrs) when ?q break when ?h - cur.move(3, -1) + cur.move(Vector[0, 0, 0, -1]) when ?l - cur.move(3, 1) + cur.move(Vector[0, 0, 0, 1]) when ?k - cur.move(2, -1) + cur.move(Vector[0, 0, -1, 0]) when ?j - cur.move(2, 1) + cur.move(Vector[0, 0, 1, 0]) when ?H - cur.move(1, -1) + cur.move(Vector[0, -1, 0, 0]) when ?L - cur.move(1, 1) + cur.move(Vector[0, 1, 0, 0]) when ?K - cur.move(0, -1) + cur.move(Vector[-1, 0, 0, 0]) when ?J - cur.move(0, 1) + cur.move(Vector[1, 0, 0, 0]) when ?\s if ms.isTouched(cur.pos) ms.touchNeighbors(cur.pos)