python 实现简单的吃豆人游戏
1.使用pygame模组2.在material目录下有一些素材3.吃豆人的游戏主体4.吃豆人怪物的AI(未使用深度学习)
主要代码main.py
import pygame, sysfrom pygame.locals import *from unit import user, enemyimport random#constant initializeFPS = 60BLOCK_SIZE = 24WIDTH = 29HEIGHT = 15WINDOW_WIDTH = WIDTH * BLOCK_SIZEWINDOW_HEIGHT = HEIGHT * BLOCK_SIZEMAP_NAME = './material/map.maze'BGM_NAME = './material/bgm.ogg'BLOCK_IMAGE = './material/block.png'FOOD_IMAGE = './material/food.png'GAMEOVER_IMAGE = './material/gameover.png'SERVER_PORT = 30000ENEMY_COUNT = 4OX = 1OY = 1DELAY = 8#pygame initializepygame.init()display = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))clock = pygame.time.Clock()block_image = pygame.image.load(BLOCK_IMAGE)food_image = pygame.image.load(FOOD_IMAGE)gameover_image = pygame.image.load(GAMEOVER_IMAGE)bgm = pygame.mixer.music.load(BGM_NAME)scene = 'game'unit_list = []game_map = []#map initializedef load_map(filename):global game_mapgame_map.clear()file = open(filename, ’r’)for line in file.readlines():game_map.append(list(line.strip()))passpass#set passportdef through(position):x = position[0]y = position[1]in_range = (x >= 0 and x < WIDTH) and (y >= 0 and y < HEIGHT)in_space = (not game_map[y][x] == ’1’)return (in_range and in_space)pass#gameover?def check_gameover(user_pos, enemy_pos):global scenegameover = (enemy_pos[0] == user_pos[0] and enemy_pos[1] == user_pos[1])if gameover:scene = 'gameover'passreturn gameoverpass#gameoverdef gameover():pygame.mixer.music.stop()keys = pygame.key.get_pressed()if keys[K_RETURN]:initialize()passdisplay.fill((0, 0, 0))x = (WINDOW_WIDTH-gameover_image.get_width())/2y = (WINDOW_HEIGHT-gameover_image.get_height())/2display.blit(gameover_image, (x, y))pygame.display.update()pass#unit initializedef initialize_unit():unit_list.clear()ox = random.randint(1, WIDTH - 2)oy = random.randint(1, HEIGHT - 2)while not through((ox, oy)):ox = random.randint(1, WIDTH - 2)oy = random.randint(1, HEIGHT - 2)unit_list.append(user(OX, OY))for i in range(0, ENEMY_COUNT):enemy_color = i % 4ox = random.randint(1, WIDTH - 2)oy = random.randint(1, HEIGHT - 2)while not through((ox, oy)):ox = random.randint(1, WIDTH - 2)oy = random.randint(1, HEIGHT - 2)unit_list.append(enemy(enemy_color, ox, oy))passpass#initializedef initialize():global sceneload_map(MAP_NAME)initialize_unit()scene = 'game'pygame.mixer.music.play(-1)#system updatedef system_update():clock.tick(FPS)for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()pass#update controlcontrol_clock = [0, DELAY]def control_update():#user controlif control_clock[0] > control_clock[1]:user = unit_list[0]keys = pygame.key.get_pressed()passport = Falsepos = user.positionif keys[K_UP]: pos = user.move(through(user.next(0)))elif keys[K_RIGHT]: pos = user.move(through(user.next(1)))elif keys[K_DOWN]:pos = user.move(through(user.next(2)))elif keys[K_LEFT]:pos = user.move(through(user.next(3)))passgame_map[pos[1]][pos[0]] = ’0’#enemy controlu_pos = unit_list[0].positionfor index in range(1, len(unit_list)):enemy = unit_list[index]if check_gameover(u_pos, enemy.position): breakenemy.track(u_pos)passport = through(enemy.next())enemy.move(passport)while not passport:enemy.clockwise()passport = through(enemy.next())enemy.move(passport)passcontrol_clock[0] = 0passelse:control_clock[0] += 1passpass#update screendef screen_update():display.fill((0, 0, 0))for i in range(0, HEIGHT):for j in range(0, WIDTH):x = j * BLOCK_SIZEy = i * BLOCK_SIZEif game_map[i][j] == ’1’:display.blit(block_image, (x, y))elif game_map[i][j] == ’4’:display.blit(food_image, (x, y))passpasspassfor unit in unit_list:unit.update()x = unit.position[0] * BLOCK_SIZEy = unit.position[1] * BLOCK_SIZEdisplay.blit(unit.image, (x, y), unit.image_rect())pygame.display.update()pass#firstinitialize()#main loopwhile True:system_update()if scene == 'game':control_update()screen_update()else:gameover()passpass
unit.py
import pygameimport mathimport randomUSER_IMAGE = './material/user.png'ENEMY_IMAGE = [('./material/enemy%d.png' % i) for i in range(1, 5)]class unit():def __init__(self, filename):super(unit, self).__init__()self.image = pygame.image.load(filename)self.clock = [0, 5]self.direction = 0self.position = [1, 1, 1, 1]self.index = 0self.source_rect = 0passdef update(self):self.animation_update()passdef animation_update(self):self.clock[0] += 1if self.clock[0] > self.clock[1]:if self.index < 4:self.index += 4else:self.index -= 4self.source_rect = self.image_rect()self.clock[0] = 0passpassdef move(self, passport):if passport:pos = self.position[:]self.position[0] = self.position[2]self.position[1] = self.position[3]else:self.position[2] = self.position[0]self.position[3] = self.position[1]pos = self.positionpassreturn pospassdef next(self):self.ahead()return (self.position[2], self.position[3])passdef turn(self, direction):self.direction = direction % 4self.index = self.directionpassdef ahead(self):if self.direction == 0:self.position[3] -= 1elif self.direction == 1:self.position[2] += 1elif self.direction == 2:self.position[3] += 1elif self.direction == 3:self.position[2] -= 1passdef image_rect(self):w = self.image.get_width()h = self.image.get_height()ox = math.floor(w / 4 * (self.index % 4)) oy = math.floor(h / 2 * math.floor(self.index / 4))return pygame.Rect((ox, oy), (24, 24))class user(unit):def __init__(self, x, y):super(user, self).__init__(USER_IMAGE)self.position = [x, y, x, y]passdef next(self, direction):self.turn(direction)self.ahead()return (self.position[2], self.position[3])passclass enemy(unit):def __init__(self, id, x, y):filename = ENEMY_IMAGE[id]super(enemy, self).__init__(filename)self.position = [x, y, x, y]passdef track(self, user_pos):rand_dir = [1,2,3,4]self.turn(random.choice(rand_dir))passdef clockwise(self):self.turn(self.direction + 1)passclass enemy_user(unit):def __init__(self, x, y):filename = ENEMY_IMAGE[0]super(enemy_user, self).__init__(filename)self.position = [x, y, x, y]passdef move(self, x, y):self.position[0] = xself.position[1] = ypass总结:
程序还有许多地方可以完善,如怪物的AI,时间的判定等等,有兴趣的大佬可以加以修改完善。
完整项目下载:https://github.com/tinytsunami/Python-Game
以上就是python 实现简单的吃豆人游戏的详细内容,更多关于python 实现吃豆人游戏的资料请关注好吧啦网其它相关文章!
相关文章: