Project1

标题: 做了一个五子棋的小游戏,不知道什么问题 [打印本页]

作者: 有丘直方    时间: 2017-1-14 12:13
标题: 做了一个五子棋的小游戏,不知道什么问题
  1. # 常量
  2. module Con
  3.   Size = 480
  4.   White = Color.new(255, 255, 255)
  5.   Black = Color.new(0, 0, 0)
  6.   Gray = Color.new(127, 127, 127)
  7. end
  8. Graphics.resize_screen(Con::Size, Con::Size) # 画面大小
  9. Graphics.frame_rate = 30                     # 帧速率
  10. # 棋盘
  11. class Checkerboard < Sprite
  12.   attr_reader(:size)
  13.   def initialize(size = 15)
  14.     super()
  15.     bitmap = Bitmap.new(Con::Size, Con::Size)
  16.     rect = Rect.new(0, 20, Con::Size, Con::Size)
  17.     bitmap.fill_rect(rect, Con::Gray)
  18.     for i in 1..size
  19.       rect = Rect.new(Con::Size/(size+1), Con::Size/(size+1)*i, Con::Size-Con::Size/(size+1)*2, 1)
  20.       bitmap.fill_rect(rect, Con::Black)
  21.     end
  22.     for i in 1..size
  23.       rect = Rect.new(Con::Size/(size+1)*i, Con::Size/(size+1), 1, Con::Size-Con::Size/(size+1)*2)
  24.       bitmap.fill_rect(rect, Con::Black)
  25.     end
  26.     for i in 1..3
  27.       rect = Rect.new(Con::Size/4*i-1, Con::Size/4*(4-i)-1, 2, 2)
  28.       bitmap.fill_rect(rect, Con::Black)
  29.       rect = Rect.new(Con::Size/4*(4-i)-1, Con::Size/4*i-1, 2, 2)
  30.       bitmap.fill_rect(rect, Con::Black)
  31.     end
  32.     @size = size
  33.     @bitmap = bitmap
  34.   end
  35.   def dispose
  36.     @bitmap.dispose
  37.     super
  38.   end
  39. end
  40. # 下棋
  41. class Playing
  42.   # 主逻辑
  43.   def main
  44.     start
  45.     loop { update }
  46.   end
  47.   # 开始处理
  48.   def start
  49.     Mouse.activate
  50.     @board = Checkerboard.new                    # 棋盘
  51.     @piece = Sprite.new                          # 棋子
  52.     @piece.z = 1
  53.     @piece.bitmap = Bitmap.new(Con::Size, Con::Size)
  54.     @table = Table.new(@board.size, @board.size) # 棋局
  55.     for i in [email protected]
  56.       for j in [email protected]
  57.         @table[i, j] = 0
  58.       end
  59.     end
  60.     @history = [@table]                          # 历史棋局
  61.     [url=home.php?mod=space&uid=8407]@black[/url] = true                                # 下棋方
  62.   end
  63.   # 更新
  64.   def update
  65.     Graphics.update
  66.     Mouse.update
  67.     table = @table
  68.     if Mouse.trigger?(:L)    # 落子
  69.       @table[Mouse.x/(Con::Size/@board.size),Mouse.y/(Con::Size/@board.size)] = (@black ? 1 : 2)
  70.       @history << @table
  71.       @black = !@black
  72.     elsif Mouse.trigger?(:R) # 悔棋
  73.       @history.pop
  74.       @table = @history[-1]
  75.       @black = !@black
  76.     end
  77.     # 更新棋子
  78.     if @table != table
  79.       for i in [email protected]
  80.         for j in [email protected]
  81.           rect = Rect.new(Con::Size/(@board.size+1)*i-2, Con::Size/(@board.size+1)*j-2, 4, 4)
  82.           case @table[i, j]
  83.           when 0
  84.             @piece.bitmap.clear_rect(rect)
  85.           when 1
  86.             @piece.bitmap.fill_rect(rect, Con::Black)
  87.           when 2
  88.             @piece.bitmap.fill_rect(rect, Con::White)
  89.           end
  90.         end
  91.       end
  92.     end
  93.   end
  94. end
  95. Playing.new.main
复制代码
用了Sion大神的鼠标系统(VA鼠标脚本 6/9 更新 v2.32 by Sion)以及鼠标系统中用到的Cache模块,此外没有任何别的脚本被用到。
开始测试之后,画面全黑,除了鼠标可见可动;单击右键发生NoMethodError,脚本82行,nil没有'[]'方法。不知是为什么,特此请教。
作者: Mr.Jin    时间: 2017-1-15 00:25
本帖最后由 Mr.Jin 于 2017-1-15 00:30 编辑

你这个小游戏写的问题还比较多,列几个吧…

首先你这个写法,会开一个叫bitmap的临时变量,
那肯定起不到画棋盘的作用,不黑屏才怪
应前加self.

悔棋这部分首先要加个判断嘛,然后pop用法也不对

还有 你要存历史纪录 应该把table做一个副本 直接存引用是没用的

metz.zip (1.02 KB, 下载次数: 93)

最后,给你简单改了改,望能做出一个完整的五子棋游戏




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1