「復刻版」のPython四迷路生成アルゴリズム(5):達成するためのグラフィック表示

オリジナルを尊重:Pythonの迷路生成アルゴリズム:達成するためのグラフィカルな表示


インフォ迷路グラフィックス
を説明したコード
GameSearch.py
完全なコードを


迷路グラフィック情報


pygameのは、図示のように、迷路を生成するスイッチアルゴリズムにマウスボタンでクリックすると、4つのボタンがあり、迷路アルゴリズムのグラフィカル表示の4種類を用いました。迷路を生成するために、四つの異なるアルゴリズムを表すために、A *経路探索アルゴリズムを添加しながら押して任意のキーは、迷路を生成するために、赤い点は、開始点と終了点は、最初から最後まで取得したA *アルゴリズムを使用して、緑の線です。


コード説明
コードの実装では、4つのファイルを持っています

GameMap.py:保存マップタイプの基本的な情報の迷路、一つのファイルに別の側に導入された迷路アルゴリズムの前でノート。
MazeGenerator.py:これは実装4種類が単一のファイルに、アルゴリズム迷路というコードです。
AStarSearch.py​​:A *アルゴリズムを達成するために、A *アルゴリズムの記事の前にそこに導入されます。
GameSearch.py​​:迷路のグラフィック表示を使用して書かれたpygameのコード
3つの文書の前には、ここにGameSearch.pyのメインスピーカーを言ってきました


GameSearch.py


ラビリンス構成パラメータ、各単位迷路REC_SIZE、REC_WIDTHとREC_HEIGHTのサイズを迷路の幅及び長さは、変更することができるされているが、インストール要件が生成アルゴリズム迷路、それが奇数でなければなりません。

REC_SIZE = 10
REC_WIDTH = 51 # must be odd number
REC_HEIGHT = 51 # must be odd number
BUTTON_HEIGHT = 30
BUTTON_WIDTH = 120
SCREEN_WIDTH = REC_WIDTH * REC_SIZE
SCREEN_HEIGHT = REC_HEIGHT * REC_SIZE + BUTTON_HEIGHT


アルゴリズムのボタンは、__init__関数は、ボタン、色の変化の位置とサイズを設定すると、ボタンのクリックを設定するために、クリック機能をunclickします。

class Button():
	def __init__(self, screen, type, x, y):
		self.screen = screen
		self.width = BUTTON_WIDTH
		self.height = BUTTON_HEIGHT
		self.button_color = (128,128,128)
		self.text_color = [(0,255,0), (255,0,0)]
		self.font = pygame.font.SysFont(None, BUTTON_HEIGHT*2//3)
		
		self.rect = pygame.Rect(0, 0, self.width, self.height)
		self.rect.topleft = (x, y)
		self.type = type
		self.init_msg()
		
	def init_msg(self):
		self.msg_image = self.font.render(generator_types[self.type], True, self.text_color[0], self.button_color)
		self.msg_image_rect = self.msg_image.get_rect()
		self.msg_image_rect.center = self.rect.center
		
	def draw(self):
		self.screen.fill(self.button_color, self.rect)
		self.screen.blit(self.msg_image, self.msg_image_rect)
	
	def click(self, game):
		game.maze_type = self.type
		self.msg_image = self.font.render(generator_types[self.type], True, self.text_color[1], self.button_color)
	
	def unclick(self):
		self.msg_image = self.font.render(generator_types[self.type], True, self.text_color[0], self.button_color)


ゲームのカテゴリには、__init__関数は、ランダムにデフォルトで選択したクラスマップ、プリムのアルゴリズムを初期化し、アルゴリズムのボタンを追加します。generateMaze各機能を行うキー入力操作、ループは、4つの操作(1迷路世代、2.開始を生成し、3 Aを終了*生成された経路とアルゴリズム、4削除迷路)を実行します。check_buttonsは、アルゴリズム迷路アルゴリズムが選択されたボタンに設定されている機能します。

class Game():
	def __init__(self):
		pygame.init()
		self.screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
		self.clock = pygame.time.Clock()
		self.map = Map(REC_WIDTH, REC_HEIGHT)
		self.mode = 0
		self.maze_type = MAZE_GENERATOR_TYPE.RANDOM_PRIM
		self.buttons = []
		self.buttons.append(Button(self.screen, MAZE_GENERATOR_TYPE.RECURSIVE_BACKTRACKER, 0, 0))
		self.buttons.append(Button(self.screen, MAZE_GENERATOR_TYPE.RANDOM_PRIM, BUTTON_WIDTH + 10, 0))
		self.buttons.append(Button(self.screen, MAZE_GENERATOR_TYPE.RECURSIVE_DIVISION, (BUTTON_WIDTH + 10) * 2, 0))
		self.buttons.append(Button(self.screen, MAZE_GENERATOR_TYPE.UNION_FIND_SET, (BUTTON_WIDTH + 10) * 3, 0))
		self.buttons[0].click(self)

	def play(self):
		self.clock.tick(30)
		
		pygame.draw.rect(self.screen, (255, 255, 255), pygame.Rect(0, 0, SCREEN_WIDTH, BUTTON_HEIGHT))
		for button in self.buttons:
			button.draw()

		for y in range(self.map.height):
			for x in range(self.map.width):
				type = self.map.getType(x, y)
				if type == MAP_ENTRY_TYPE.MAP_EMPTY:
					color = (255, 255, 255)
				elif type == MAP_ENTRY_TYPE.MAP_BLOCK:
					color = (0, 0, 0)
				elif type == MAP_ENTRY_TYPE.MAP_TARGET:
					color = (255, 0, 0)
				else:
					color = (0, 255, 0)
				pygame.draw.rect(self.screen, color, pygame.Rect(REC_SIZE*x, REC_SIZE*y+BUTTON_HEIGHT, REC_SIZE, REC_SIZE))
		
	def generateMaze(self):
		if self.mode >= 4:
			self.mode = 0
		if self.mode == 0:
			generateMap(self.map, self.maze_type)
		elif self.mode == 1:
			self.source = self.map.generatePos((1,1),(1, self.map.height-2))
			self.dest = self.map.generatePos((self.map.width-2, self.map.width-2), (1, self.map.height-2))
			self.map.setMap(self.source[0], self.source[1], MAP_ENTRY_TYPE.MAP_TARGET)
			self.map.setMap(self.dest[0], self.dest[1], MAP_ENTRY_TYPE.MAP_TARGET)
		elif self.mode == 2:
			AStarSearch(self.map, self.source, self.dest)
			self.map.setMap(self.source[0], self.source[1], MAP_ENTRY_TYPE.MAP_TARGET)
			self.map.setMap(self.dest[0], self.dest[1], MAP_ENTRY_TYPE.MAP_TARGET)
		else:
			self.map.resetMap(MAP_ENTRY_TYPE.MAP_EMPTY)
		self.mode += 1

def check_buttons(game, mouse_x, mouse_y):
	for button in game.buttons:
		if button.rect.collidepoint(mouse_x, mouse_y):
			button.click(game)
			for tmp in game.buttons:
				if tmp != button:
					tmp.unclick()
			break			

            
 

メインループ、キーボードおよびマウスクリックイベントへのアクセスが、これは主にpygameのコードに関連しています。

game = Game()
while True:
	game.play()
	pygame.display.update()
	
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			pygame.quit()
			exit()
		if event.type == pygame.KEYDOWN:
			game.generateMaze()
			break
		elif event.type == pygame.MOUSEBUTTONDOWN:
			mouse_x, mouse_y = pygame.mouse.get_pos()
			check_buttons(game, mouse_x, mouse_y)

完全なコード

コードgithubのリンクの完全な実装 迷路アルゴリズムのグラフィック表示

コンパイラ環境
python3.7 + pygame1.9

公開された91元の記事 ウォン称賛47 ビュー90000 +

おすすめ

転載: blog.csdn.net/qq_30007885/article/details/104447550