|
|
- import random, sys, copy, os, pygame
- from pygame.locals import *
-
- def addElement(self, elem_type, col, row):
- if elem_type == 'wall':
- self.walls.append(elementSprite('wall.png', col, row, cfg))
- elif elem_type == 'box':
- self.boxes.append(elementSprite('box.png', col, row, cfg))
- elif elem_type == 'target':
- self.targets.append(elementSprite('target.png', col, row, cfg))
- def startInterface(screen, cfg):
- screen.fill(cfg.BACKGROUNDCOLOR)
- clock = pygame.time.Clock()
- while True:
- button_1 = Button(screen, (95, 150), '开始游戏', cfg)
- button_2 = Button(screen, (95, 305), '退出游戏', cfg)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
- if event.type == pygame.MOUSEBUTTONDOWN:
- if button_1.collidepoint(pygame.mouse.get_pos()):
- return
- elif button_2.collidepoint(pygame.mouse.get_pos()):
- pygame.quit()
- sys.exit(0)
- clock.tick(60)
- pygame.display.update()
-
- def endInterface(screen, cfg):
- screen.fill(cfg.BACKGROUNDCOLOR)
- clock = pygame.time.Clock()
- font_path = os.path.join(cfg.FONTDIR, 'simkai.ttf')
- text = '机智如你~恭喜通关!'
- font = pygame.font.Font(font_path, 30)
- text_render = font.render(text, 1, (255, 255, 255))
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
- screen.blit(text_render, (120, 200))
- clock.tick(60)
- pygame.display.update()
- class gameInterface():
- def __init__(self, screen):
- self.screen = screen
- self.levels_path = cfg.LEVELDIR
- self.initGame()
- def loadLevel(self, game_level):
- with open(os.path.join(self.levels_path, game_level), 'r') as f:
- lines = f.readlines()
- # 游戏地图
- self.game_map = gameMap(max([len(line) for line in lines]) - 1, len(lines))
- # 游戏surface
- height = cfg.BLOCKSIZE * self.game_map.num_rows
- width = cfg.BLOCKSIZE * self.game_map.num_cols
- self.game_surface = pygame.Surface((width, height))
- self.game_surface.fill(cfg.BACKGROUNDCOLOR)
- self.game_surface_blank = self.game_surface.copy()
- for row, elems in enumerate(lines):
- for col, elem in enumerate(elems):
- if elem == 'p':
- self.player = pusherSprite(col, row, cfg)
- elif elem == '*':
- self.game_map.addElement('wall', col, row)
- elif elem == '#':
- self.game_map.addElement('box', col, row)
- elif elem == 'o':
- self.game_map.addElement('target', col, row)
- def scroll(self):
- x, y = self.player.rect.center
- width = self.game_surface.get_rect().w
- height = self.game_surface.get_rect().h
- if (x + cfg.SCREENSIZE[0] // 2) > cfg.SCREENSIZE[0]:
- if -1 * self.scroll_x + cfg.SCREENSIZE[0] < width:
- self.scroll_x -= 2
- elif (x + cfg.SCREENSIZE[0] // 2) > 0:
- if self.scroll_x < 0:
- self.scroll_x += 2
- if (y + cfg.SCREENSIZE[1] // 2) > cfg.SCREENSIZE[1]:
- if -1 * self.scroll_y + cfg.SCREENSIZE[1] < height:
- self.scroll_y -= 2
- elif (y + 250) > 0:
- if self.scroll_y < 0:
- self.scroll_y += 2
- class pusherSprite(pygame.sprite.Sprite):
- def __init__(self, col, row, cfg):
- pygame.sprite.Sprite.__init__(self)
- self.image_path = os.path.join(cfg.IMAGESDIR, 'player.png')
- self.image = pygame.image.load(self.image_path).convert()
- color = self.image.get_at((0, 0))
- self.image.set_colorkey(color, pygame.RLEACCEL)
- self.rect = self.image.get_rect()
- self.col = col
- self.row = row
- '''移动'''
- def move(self, direction, is_test=False):
- # 测试模式代表模拟移动
- if is_test:
- if direction == 'up':
- return self.col, self.row - 1
- elif direction == 'down':
- return self.col, self.row + 1
- elif direction == 'left':
- return self.col - 1, self.row
- elif direction == 'right':
- return self.col + 1, self.row
- else:
- if direction == 'up':
- self.row -= 1
- elif direction == 'down':
- self.row += 1
- elif direction == 'left':
- self.col -= 1
- elif direction == 'right':
- self.col += 1
- '''将人物画到游戏界面上'''
- def draw(self, screen):
- self.rect.x = self.rect.width * self.col
- self.rect.y = self.rect.height * self.row
- screen.blit(self.image, self.rect)
-
-
- '''游戏元素精灵类'''
- class elementSprite(pygame.sprite.Sprite):
- def __init__(self, sprite_name, col, row, cfg):
- pygame.sprite.Sprite.__init__(self)
- # 导入box.png/target.png/wall.png
- self.image_path = os.path.join(cfg.IMAGESDIR, sprite_name)
- self.image = pygame.image.load(self.image_path).convert()
- color = self.image.get_at((0, 0))
- self.image.set_colorkey(color, pygame.RLEACCEL)
- self.rect = self.image.get_rect()
- # 元素精灵类型
- self.sprite_type = sprite_name.split('.')[0]
- # 元素精灵的位置
- self.col = col
- self.row = row
- '''将游戏元素画到游戏界面上'''
- def draw(self, screen):
- self.rect.x = self.rect.width * self.col
- self.rect.y = self.rect.height * self.row
- screen.blit(self.image, self.rect)
- '''移动游戏元素'''
- def move(self, direction, is_test=False):
- if self.sprite_type == 'box':
- # 测试模式代表模拟移动
- if is_test:
- if direction == 'up':
- return self.col, self.row - 1
- elif direction == 'down':
- return self.col, self.row + 1
- elif direction == 'left':
- return self.col - 1, self.row
- elif direction == 'right':
- return self.col + 1, self.row
- else:
- if direction == 'up':
- self.row -= 1
- elif direction == 'down':
- self.row += 1
- elif direction == 'left':
- self.col -= 1
- elif direction == 'right':
- self.col += 1
- def runGame(screen, game_level):
- clock = pygame.time.Clock()
- game_interface = gameInterface(screen)
- game_interface.loadLevel(game_level)
- font_path = os.path.join(cfg.FONTDIR, 'simkai.ttf')
- text = '按R键重新开始本关'
- font = pygame.font.Font(font_path, 15)
- text_render = font.render(text, 1, (255, 255, 255))
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit(0)
- elif event.type == pygame.KEYDOWN:
- if event.key == pygame.K_LEFT:
- next_pos = game_interface.player.move('left', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('left')
- else:
- box = game_interface.game_map.getBox(*next_pos)
- if box:
- next_pos = box.move('left', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('left')
- box.move('left')
- break
- if event.key == pygame.K_RIGHT:
- next_pos = game_interface.player.move('right', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('right')
- else:
- box = game_interface.game_map.getBox(*next_pos)
- if box:
- next_pos = box.move('right', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('right')
- box.move('right')
- break
- if event.key == pygame.K_DOWN:
- next_pos = game_interface.player.move('down', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('down')
- else:
- box = game_interface.game_map.getBox(*next_pos)
- if box:
- next_pos = box.move('down', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('down')
- box.move('down')
- break
- if event.key == pygame.K_UP:
- next_pos = game_interface.player.move('up', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('up')
- else:
- box = game_interface.game_map.getBox(*next_pos)
- if box:
- next_pos = box.move('up', is_test=True)
- if game_interface.game_map.isValidPos(*next_pos):
- game_interface.player.move('up')
- box.move('up')
- break
- if event.key == pygame.K_r:
- game_interface.initGame()
- game_interface.loadLevel(game_level)
- game_interface.draw(game_interface.player, game_interface.game_map)
- if game_interface.game_map.levelCompleted():
- return
- screen.blit(text_render, (5, 5))
- pygame.display.flip()
- clock.tick(100)
- def levelCompleted(self):
- for box in self.boxes:
- is_match = False
- for target in self.targets:
- if box.col == target.col and box.row == target.row:
- is_match = True
- break
- if not is_match:
- return False
- return True
- pygame.init()
- # 设置窗口大小
- # 游戏主循环
- # 其他游戏逻辑代码...
- # 更新屏幕
复制代码 |
|