人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

Pygame實戰(zhàn)練習之炸彈人學院游戲

發(fā)布日期:2022-01-01 15:51 | 文章來源:站長之家

導語

在現(xiàn)在這個浮躁的年代:小編每次登陸王者榮耀,還有每次登陸刺激戰(zhàn)場Z!

看著里面的聊天界面,各種代打、各種的找cp。小小編覺得,我們已經(jīng)失去了玩游戲的初心。

接下來,小臺將帶領你們走回童年時光,一起領略我們當初玩4399的單純與天真!

還記得小時候小臺每到放學時刻,就會拉著只比我小半歲的小表妹,一塊去親戚家里玩電腦

每一次打開電腦做的第一件事情就是,打開瀏覽器,輸入4399這四個數(shù)字,那個時候覺得hao123真是一個神奇的主頁!

可以讓我打開4399玩各種游戲qwq,尤其是Q版泡泡堂深得我心!

那今天就帶大家回憶一下童年也做一款經(jīng)典的炸彈人的小游戲!

正文

游戲規(guī)則還清楚哈, 我就不多做介紹了不清楚玩法的可以百度下下!

首先準備好相應的素材:【部分如下】

​炸彈人主程序:

import sys
import cfg
import random
import pygame
from modules import *
 
 
'''游戲主程序'''
def main(cfg):
 # 初始化
 pygame.init()
 pygame.mixer.init()
 pygame.mixer.music.load(cfg.BGMPATH)
 pygame.mixer.music.play(-1, 0.0)
 screen = pygame.display.set_mode(cfg.SCREENSIZE)
 pygame.display.set_caption('炸彈人——源碼基地:#959755565#')
 # 開始界面
 Interface(screen, cfg, mode='game_start')
 # 游戲主循環(huán)
 font = pygame.font.SysFont('Consolas', 15)
 for gamemap_path in cfg.GAMEMAPPATHS:
  # -地圖
  map_parser = mapParser(gamemap_path, bg_paths=cfg.BACKGROUNDPATHS, wall_paths=cfg.WALLPATHS, blocksize=cfg.BLOCKSIZE)
  # -水果
  fruit_sprite_group = pygame.sprite.Group()
  used_spaces = []
  for i in range(5):
coordinate = map_parser.randomGetSpace(used_spaces)
used_spaces.append(coordinate)
fruit_sprite_group.add(Fruit(random.choice(cfg.FRUITPATHS), coordinate=coordinate, blocksize=cfg.BLOCKSIZE))
  # -我方Hero
  coordinate = map_parser.randomGetSpace(used_spaces)
  used_spaces.append(coordinate)
  ourhero = Hero(imagepaths=cfg.HEROZELDAPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='ZELDA')
  # -電腦Hero
  aihero_sprite_group = pygame.sprite.Group()
  coordinate = map_parser.randomGetSpace(used_spaces)
  aihero_sprite_group.add(Hero(imagepaths=cfg.HEROBATMANPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='BATMAN'))
  used_spaces.append(coordinate)
  coordinate = map_parser.randomGetSpace(used_spaces)
  aihero_sprite_group.add(Hero(imagepaths=cfg.HERODKPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='DK'))
  used_spaces.append(coordinate)
  # -炸彈bomb
  bomb_sprite_group = pygame.sprite.Group()
  # -用于判斷游戲勝利或者失敗的flag
  is_win_flag = False
  # -主循環(huán)
  screen = pygame.display.set_mode(map_parser.screen_size)
  clock = pygame.time.Clock()
  while True:
dt = clock.tick(cfg.FPS)
for event in pygame.event.get():
 if event.type == pygame.QUIT:
  pygame.quit()
  sys.exit(-1)
 # --↑↓←→鍵控制上下左右, 空格鍵丟炸彈
 elif event.type == pygame.KEYDOWN:
  if event.key == pygame.K_UP:ourhero.move('up')
  elif event.key == pygame.K_DOWN:ourhero.move('down')
  elif event.key == pygame.K_LEFT:ourhero.move('left')
  elif event.key == pygame.K_RIGHT:ourhero.move('right')
  elif event.key == pygame.K_SPACE:if ourhero.bomb_cooling_count <= 0:
bomb_sprite_group.add(ourhero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
screen.fill(cfg.WHITE)
# --電腦Hero隨機行動
for hero in aihero_sprite_group:
 action, flag = hero.randomAction(dt)
 if flag and action == 'dropbomb':
  bomb_sprite_group.add(hero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
# --吃到水果加生命值(只要是Hero, 都能加)
ourhero.eatFruit(fruit_sprite_group)
for hero in aihero_sprite_group:
 hero.eatFruit(fruit_sprite_group)
# --游戲元素都綁定到屏幕上
map_parser.draw(screen)
for bomb in bomb_sprite_group:
 if not bomb.is_being:
  bomb_sprite_group.remove(bomb)
 explode_area = bomb.draw(screen, dt, map_parser)
 if explode_area:
  # --爆炸火焰范圍內(nèi)的Hero生命值將持續(xù)下降
  if ourhero.coordinate in explode_area:ourhero.health_value -= bomb.harm_value
  for hero in aihero_sprite_group:if hero.coordinate in explode_area:
hero.health_value -= bomb.harm_value
fruit_sprite_group.draw(screen)
for hero in aihero_sprite_group:
 hero.draw(screen, dt)
ourhero.draw(screen, dt)
# --左上角顯示生命值
pos_x = showText(screen, font, text=ourhero.hero_name+'(our):'+str(ourhero.health_value), color=cfg.YELLOW, position=[5, 5])
for hero in aihero_sprite_group:
 pos_x, pos_y = pos_x+15, 5
 pos_x = showText(screen, font, text=hero.hero_name+'(ai):'+str(hero.health_value), color=cfg.YELLOW, position=[pos_x, pos_y])
# --我方玩家生命值小于等于0/電腦方玩家生命值均小于等于0則判斷游戲結(jié)束
if ourhero.health_value <= 0:
 is_win_flag = False
 break
for hero in aihero_sprite_group:
 if hero.health_value <= 0:
  aihero_sprite_group.remove(hero)
if len(aihero_sprite_group) == 0:
 is_win_flag = True
 break
pygame.display.update()
clock.tick(cfg.FPS)
  if is_win_flag:
Interface(screen, cfg, mode='game_switch')
  else:
break
 Interface(screen, cfg, mode='game_end')
 
 
'''run'''
if __name__ == '__main__':
 while True:
  main(cfg)

開始的界面如下:

​定義地圖類:

class mapParser():
	def __init__(self, mapfilepath, bg_paths, wall_paths, blocksize, **kwargs):
		self.instances_list = self.__parse(mapfilepath)
		self.bg_paths = bg_paths
		self.wall_paths = wall_paths
		self.blocksize = blocksize
		self.height = len(self.instances_list)
		self.width = len(self.instances_list[0])
		self.screen_size = (blocksize * self.width, blocksize * self.height)
	'''地圖畫到屏幕上'''
	def draw(self, screen):
		for j in range(self.height):
			for i in range(self.width):
				instance = self.instances_list[j][i]
				if instance == 'w':
					elem = Wall(self.wall_paths[0], [i, j], self.blocksize)
				elif instance == 'x':
					elem = Wall(self.wall_paths[1], [i, j], self.blocksize)
				elif instance == 'z':
					elem = Wall(self.wall_paths[2], [i, j], self.blocksize)
				elif instance == '0':
					elem = Background(self.bg_paths[0], [i, j], self.blocksize)
				elif instance == '1':
					elem = Background(self.bg_paths[1], [i, j], self.blocksize)
				elif instance == '2':
					elem = Background(self.bg_paths[2], [i, j], self.blocksize)
				else:
					raise ValueError('instance parse error in mapParser.draw...')
				elem.draw(screen)
	'''隨機獲取一個空地'''
	def randomGetSpace(self, used_spaces=None):
		while True:
			i = random.randint(0, self.width-1)
			j = random.randint(0, self.height-1)
			coordinate = [i, j]
			if used_spaces and coordinate in used_spaces:
				continue
			instance = self.instances_list[j][i]
			if instance in ['0', '1', '2']:
				break
		return coordinate
	'''根據(jù)坐標獲取元素類型'''
	def getElemByCoordinate(self, coordinate):
		return self.instances_list[coordinate[1]][coordinate[0]]
	'''解析.map文件'''
	def __parse(self, mapfilepath):
		instances_list = []
		with open(mapfilepath) as f:
			for line in f.readlines():
				instances_line_list = []
				for c in line:
					if c in ['w', 'x', 'z', '0', '1', '2']:
instances_line_list.append(c)
				instances_list.append(instances_line_list)
		return instances_list

定義必要的一些精靈類:角色,水果等等。

'''墻類'''
class Wall(pygame.sprite.Sprite):
	def __init__(self, imagepath, coordinate, blocksize, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.image = pygame.image.load(imagepath)
		self.image = pygame.transform.scale(self.image, (blocksize, blocksize))
		self.rect = self.image.get_rect()
		self.rect.left, self.rect.top = coordinate[0] * blocksize, coordinate[1] * blocksize
		self.coordinate = coordinate
		self.blocksize = blocksize
	'''畫到屏幕上'''
	def draw(self, screen):
		screen.blit(self.image, self.rect)
		return True
 
 
'''背景類'''
class Background(pygame.sprite.Sprite):
	def __init__(self, imagepath, coordinate, blocksize, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.image = pygame.image.load(imagepath)
		self.image = pygame.transform.scale(self.image, (blocksize, blocksize))
		self.rect = self.image.get_rect()
		self.rect.left, self.rect.top = coordinate[0] * blocksize, coordinate[1] * blocksize
		self.coordinate = coordinate
		self.blocksize = blocksize
	'''畫到屏幕上'''
	def draw(self, screen):
		screen.blit(self.image, self.rect)
		return True
 
 
'''水果類'''
class Fruit(pygame.sprite.Sprite):
	def __init__(self, imagepath, coordinate, blocksize, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.kind = imagepath.split('/')[-1].split('.')[0]
		if self.kind == 'banana':
			self.value = 5
		elif self.kind == 'cherry':
			self.value = 10
		else:
			raise ValueError('Unknow fruit %s...' % self.kind)
		self.image = pygame.image.load(imagepath)
		self.image = pygame.transform.scale(self.image, (blocksize, blocksize))
		self.rect = self.image.get_rect()
		self.rect.left, self.rect.top = coordinate[0] * blocksize, coordinate[1] * blocksize
		self.coordinate = coordinate
		self.blocksize = blocksize
	'''畫到屏幕上'''
	def draw(self, screen):
		screen.blit(self.image, self.rect)
		return True
 
 
'''炸彈類'''
class Bomb(pygame.sprite.Sprite):
	def __init__(self, imagepath, coordinate, blocksize, digitalcolor, explode_imagepath, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.image = pygame.image.load(imagepath)
		self.image = pygame.transform.scale(self.image, (blocksize, blocksize))
		self.explode_imagepath = explode_imagepath
		self.rect = self.image.get_rect()
		# 像素位置
		self.rect.left, self.rect.top = coordinate[0] * blocksize, coordinate[1] * blocksize
		# 坐標(元素塊為單位長度)
		self.coordinate = coordinate
		self.blocksize = blocksize
		# 爆炸倒計時
		self.explode_millisecond = 6000 * 1 - 1
		self.explode_second = int(self.explode_millisecond / 1000)
		self.start_explode = False
		# 爆炸持續(xù)時間
		self.exploding_count = 1000 * 1
		# 炸彈傷害能力
		self.harm_value = 1
		# 該炸彈是否還存在
		self.is_being = True
		self.font = pygame.font.SysFont('Consolas', 20)
		self.digitalcolor = digitalcolor
	'''畫到屏幕上'''
	def draw(self, screen, dt, map_parser):
		if not self.start_explode:
			# 爆炸倒計時
			self.explode_millisecond -= dt
			self.explode_second = int(self.explode_millisecond / 1000)
			if self.explode_millisecond < 0:
				self.start_explode = True
			screen.blit(self.image, self.rect)
			text = self.font.render(str(self.explode_second), True, self.digitalcolor)
			rect = text.get_rect(center=(self.rect.centerx-5, self.rect.centery+5))
			screen.blit(text, rect)
			return False
		else:
			# 爆炸持續(xù)倒計時
			self.exploding_count -= dt
			if self.exploding_count > 0:
				return self.__explode(screen, map_parser)
			else:
				self.is_being = False
				return False
	'''爆炸效果'''
	def __explode(self, screen, map_parser):
		explode_area = self.__calcExplodeArea(map_parser.instances_list)
		for each in explode_area:
			image = pygame.image.load(self.explode_imagepath)
			image = pygame.transform.scale(image, (self.blocksize, self.blocksize))
			rect = image.get_rect()
			rect.left, rect.top = each[0] * self.blocksize, each[1] * self.blocksize
			screen.blit(image, rect)
		return explode_area
	'''計算爆炸區(qū)域'''
	def __calcExplodeArea(self, instances_list):
		explode_area = []
		# 區(qū)域計算規(guī)則為墻可以阻止爆炸擴散, 且爆炸范圍僅在游戲地圖范圍內(nèi)
		for ymin in range(self.coordinate[1], self.coordinate[1]-5, -1):
			if ymin < 0 or instances_list[ymin][self.coordinate[0]] in ['w', 'x', 'z']:
				break
			explode_area.append([self.coordinate[0], ymin])
		for ymax in range(self.coordinate[1]+1, self.coordinate[1]+5):
			if ymax >= len(instances_list) or instances_list[ymax][self.coordinate[0]] in ['w', 'x', 'z']:
				break
			explode_area.append([self.coordinate[0], ymax])
		for xmin in range(self.coordinate[0], self.coordinate[0]-5, -1):
			if xmin < 0 or instances_list[self.coordinate[1]][xmin] in ['w', 'x', 'z']:
				break
			explode_area.append([xmin, self.coordinate[1]])
		for xmax in range(self.coordinate[0]+1, self.coordinate[0]+5):
			if xmax >= len(instances_list[0]) or instances_list[self.coordinate[1]][xmax] in ['w', 'x', 'z']:
				break
			explode_area.append([xmax, self.coordinate[1]])
		return explode_area
 
 
'''角色類'''
class Hero(pygame.sprite.Sprite):
	def __init__(self, imagepaths, coordinate, blocksize, map_parser, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.imagepaths = imagepaths
		self.image = pygame.image.load(imagepaths[-1])
		self.image = pygame.transform.scale(self.image, (blocksize, blocksize))
		self.rect = self.image.get_rect()
		self.rect.left, self.rect.top = coordinate[0] * blocksize, coordinate[1] * blocksize
		self.coordinate = coordinate
		self.blocksize = blocksize
		self.map_parser = map_parser
		self.hero_name = kwargs.get('hero_name')
		# 生命值
		self.health_value = 50
		# 炸彈冷卻時間
		self.bomb_cooling_time = 5000
		self.bomb_cooling_count = 0
		# 隨機移動冷卻時間(僅AI電腦用)
		self.randommove_cooling_time = 100
		self.randommove_cooling_count = 0
	'''角色移動'''
	def move(self, direction):
		self.__updateImage(direction)
		if direction == 'left':
			if self.coordinate[0]-1 < 0 or self.map_parser.getElemByCoordinate([self.coordinate[0]-1, self.coordinate[1]]) in ['w', 'x', 'z']:
				return False
			self.coordinate[0] = self.coordinate[0] - 1
		elif direction == 'right':
			if self.coordinate[0]+1 >= self.map_parser.width or self.map_parser.getElemByCoordinate([self.coordinate[0]+1, self.coordinate[1]]) in ['w', 'x', 'z']:
				return False
			self.coordinate[0] = self.coordinate[0] + 1
		elif direction == 'up':
			if self.coordinate[1]-1 < 0 or self.map_parser.getElemByCoordinate([self.coordinate[0], self.coordinate[1]-1]) in ['w', 'x', 'z']:
				return False
			self.coordinate[1] = self.coordinate[1] - 1
		elif direction == 'down':
			if self.coordinate[1]+1 >= self.map_parser.height or self.map_parser.getElemByCoordinate([self.coordinate[0], self.coordinate[1]+1]) in ['w', 'x', 'z']:
				return False
			self.coordinate[1] = self.coordinate[1] + 1
		else:
			raise ValueError('Unknow direction %s...' % direction)
		self.rect.left, self.rect.top = self.coordinate[0] * self.blocksize, self.coordinate[1] * self.blocksize
		return True
	'''隨機行動(AI電腦用)'''
	def randomAction(self, dt):
		# 冷卻倒計時
		if self.randommove_cooling_count > 0:
			self.randommove_cooling_count -= dt
		action = random.choice(['left', 'left', 'right', 'right', 'up', 'up', 'down', 'down', 'dropbomb'])
		flag = False
		if action in ['left', 'right', 'up', 'down']:
			if self.randommove_cooling_count <= 0:
				flag = True
				self.move(action)
				self.randommove_cooling_count = self.randommove_cooling_time
		elif action in ['dropbomb']:
			if self.bomb_cooling_count <= 0:
				flag = True
				self.bomb_cooling_count = self.bomb_cooling_time
		return action, flag
	'''生成炸彈'''
	def generateBomb(self, imagepath, digitalcolor, explode_imagepath):
		return Bomb(imagepath=imagepath, coordinate=copy.deepcopy(self.coordinate), blocksize=self.blocksize, digitalcolor=digitalcolor, explode_imagepath=explode_imagepath)
	'''畫到屏幕上'''
	def draw(self, screen, dt):
		# 冷卻倒計時
		if self.bomb_cooling_count > 0:
			self.bomb_cooling_count -= dt
		screen.blit(self.image, self.rect)
		return True
	'''吃水果'''
	def eatFruit(self, fruit_sprite_group):
		eaten_fruit = pygame.sprite.spritecollide(self, fruit_sprite_group, True, None)
		for fruit in eaten_fruit:
			self.health_value += fruit.value
	'''更新角色朝向'''
	def __updateImage(self, direction):
		directions = ['left', 'right', 'up', 'down']
		idx = directions.index(direction)
		self.image = pygame.image.load(self.imagepaths[idx])
		self.image = pygame.transform.scale(self.image, (self.blocksize, self.blocksize))

效果如下:

這精致的畫面還可以吧~哈哈哈啊 快夸我快夸我~

總結(jié)

安啦!文章就寫到這里,你們的支持是我最大的動力,記得三連哦~木??!

溫馨提示:不要忘記點贊、關注、評論哦!看我手上的炸彈~

到此這篇關于Pygame實戰(zhàn)練習之炸彈人學院游戲的文章就介紹到這了,更多相關Pygame 炸彈人學院內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部