Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # --------------------------------------
- # Genenate Level
- # --------------------------------------
- class Game_Party < Game_Unit
- attr_reader :maze_layer_1
- attr_reader :maze_layer_2
- attr_reader :maze_layer_3
- alias jojo741963_maze_party_init initialize unless $@
- def initialize
- @maze_layer_1 = []
- @maze_layer_2 = []
- @maze_layer_3 = []
- jojo741963_maze_party_init
- end
- #---------------------------------------------------------
- # layer_1 - สถานะเขาวงกต 0 ผ่านไม่ได้ 1 ผ่านได้
- # layer_2 - เก็บค่าทางเชื่อมต่อ (Door) ว่ามีทางเชื่อมกี่ทาง
- # layer_3 - เก็บค่ารทิศที่เชื่อมต่อกับห้องนั้น [0,0,0,0]
- #---------------------------------------------------------
- def start_genenate_maze
- @max_m = 5
- @max_n = 5
- @path = 15
- @new_xy = [0,0]
- initialize_maze
- create_first_room
- genenate_path(@path)
- end
- #---------------------------------------------------------
- def initialize_maze(m = 5, n = 5)
- @maze_layer_1 = []
- for i in 0...m
- @maze_layer_1.push(Array.new(n) {|i| 0 })
- end
- @maze_layer_2 = []
- for i in 0...m
- @maze_layer_2.push(Array.new(n) {|i| 0 })
- end
- @maze_layer_3 = []
- for i in 0...(m*n)
- @maze_layer_3.push(Array.new(3) {|i| 0 })
- end
- #msgbox(@maze_layer_1)
- #msgbox(@maze_layer_1[0][1])
- end
- #---------------------------------------------------------
- def create_first_room
- @MAZE_x = rand(@max_m)
- @MAZE_y = rand(@max_n)
- @maze_layer_1[@MAZE_x][@MAZE_y] = 5
- #@maze_layer_2[@MAZE_x][@MAZE_y] = genenate_door(@MAZE_x,@MAZE_y)
- printmaze
- #next x , y
- @new_xy = find_next_room_dir(@MAZE_x, @MAZE_y)
- @MAZE_x = @new_xy[0]
- @MAZE_y = @new_xy[1]
- puts ("new @MAZE_x is "+@MAZE_x.to_s + " and new @MAZE_y is" + @MAZE_y.to_s )
- end
- #---------------------------------------------------------
- def genenate_path(path = 15)
- @path = path
- while(@path > 1)
- newpath = false
- if @maze_layer_1[@MAZE_x][@MAZE_y] == 0
- @maze_layer_1[@MAZE_x][@MAZE_y] = 1
- #@maze_layer_2[@MAZE_x][@MAZE_y] = genenate_door(@MAZE_x,@MAZE_y)
- @path -= 1
- newpath = true
- #msgbox(@maze_layer_1)
- printmaze
- end
- if newpath && cal_empty_room_around(@MAZE_x,@MAZE_y) > 1
- # รอบ ๆ ห้องนั้น ยังมีห้องว่างอยู่
- @new_xy = find_next_room_dir(@MAZE_x, @MAZE_y)
- @MAZE_x = @new_xy[0]
- @MAZE_y = @new_xy[1]
- #msgbox(@maze_layer_1)
- puts ("new @MAZE_x is "+@MAZE_x.to_s + " and new @MAZE_y is" + @MAZE_y.to_s )
- else
- puts ("no room around! find new room" )
- a = 0
- while(a == 1)
- @MAZE_x = rand(5)
- @MAZE_y = rand(5)
- a = 1 if @maze_layer_1[@MAZE_x][@MAZE_y] == 1 && cal_empty_room_around(@MAZE_x,@MAZE_y) > 1
- end
- @new_xy = find_next_room_dir(@MAZE_x, @MAZE_y)
- @MAZE_x = @new_xy[0]
- @MAZE_y = @new_xy[1]
- puts ("new @MAZE_x is "+@MAZE_x.to_s + " and new @MAZE_y is" + @MAZE_y.to_s )
- end
- end
- msgbox(@maze_layer_1)
- end
- #---------------------------------------------------------
- def genenate_door(x,y)
- #@path
- door = 0
- loop do
- if @path == 1 # กรณีที่เหลืออีกห้องเดียว
- door = 1
- end
- if @path == 2 # กรณีที่เหลืออีก 2 ห้อง
- if rand(100) > 50
- door = 1
- else
- door = 2
- end
- end
- #@path > 2 , กรณีที่เหลือห้องมากกว่า 2
- # 15% - 1 , 50% - 2 , 20% - 3 , 15% - 4
- r = rand(100) + 1
- if r <= 15
- door = 1
- elsif r <= 65
- door = 2
- elsif r <= 85
- door = 3
- else
- door = 4
- end
- if door > cal_empty_room_around(x,y)
- return
- end
- break
- end
- return door
- end
- #---------------------------------------------------------
- def random_dir
- case rand(4)
- when 0 then dir = 2
- when 1 then dir = 4
- when 2 then dir = 6
- when 3 then dir = 8
- end
- return dir
- end
- #---------------------------------------------------------
- def find_next_room_dir(x,y)
- while(true)
- r = random_dir
- puts ("random_dir : " + random_dir.to_s)
- if can_room_exist?(x,y,random_dir)
- puts "OK this room can be new path"
- break
- end
- puts "not this room"
- end
- case r
- when 2 then x += 1
- when 4 then y -= 1
- when 6 then y += 1
- when 8 then x -= 1
- end
- puts [x,y].to_s
- return [x,y]
- end
- #---------------------------------------------------------
- def cal_empty_room_around(x,y)
- empty = 4
- # เช็คห้องข้าง ๆ
- for i in [1,2,3,4]
- dir = 2 if i == 1
- dir = 4 if i == 2
- dir = 6 if i == 3
- dir = 8 if i == 4
- if not can_room_exist?(x,y,i)
- empty -= 1
- end
- end
- return empty
- end
- #---------------------------------------------------------
- def can_room_exist?(x,y,dir)
- return false if y == 0 && dir == 4
- return false if y == (@max_n-1) && dir == 6
- return false if x == 0 && dir == 8
- return false if x == (@max_m-1) && dir == 2
- case dir
- when 2
- return false if (@maze_layer_1[x+1][y]) == nil or (@maze_layer_1[x+1][y]).to_int > 0
- when 4
- return false if (@maze_layer_1[x][y-1]) == nil or (@maze_layer_1[x][y-1]).to_int > 0
- when 6
- return false if (@maze_layer_1[x][y+1]) == nil or (@maze_layer_1[x][y+1]).to_int > 0
- when 8
- return false if (@maze_layer_1[x-1][y]) == nil or (@maze_layer_1[x-1][y]).to_int > 0
- end
- return true
- end
- #---------------------------------------------------------
- end
- def printmaze
- puts ("@MAZE_x : "+@MAZE_x.to_s + " @MAZE_y : " + @MAZE_y.to_s )
- msgbox ($game_party.maze_layer_1[0].to_s+"\n"+$game_party.maze_layer_1[1].to_s+"\n"+$game_party.maze_layer_1[2].to_s+"\n"+$game_party.maze_layer_1[3].to_s+"\n"+$game_party.maze_layer_1[4].to_s+"\n")
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement