Python Pygame落球游戏
我的天才女友 人气:0引包
引入对应的包,和原来一样写一个打印文字的方法
import sys, random, pygame from pygame.locals import * def print_text(font, x, y, text, color=(255, 255, 255)): img_text = font.render(text, True, color) screen.blit(img_text, (x, y))
初始化配置
初始化游戏,pygame窗口的一些信息,以及游戏中用的的一些参数。
pygame.init() # 定时器 mainClock = pygame.time.Clock() # 设置屏幕和窗口标题 screen = pygame.display.set_mode((600, 500)) pygame.display.set_caption("落球游戏") # 设置字体 font1 = pygame.font.SysFont("方正粗黑宋简体", 24) pygame.mouse.set_visible(False) # 设置颜色变量 white = 255, 255, 255 red = 220, 50, 50 yellow = 230, 230, 50 black = 0, 0, 0 # 生命数 lives = 3 # 分 score = 0 # 游戏开始flg game_over = True # 鼠标位置 mouse_x = mouse_y = 0 pos_x = 300 pos_y = 460 # 球落下的x和y轴坐标 bomb_x = random.randint(0, 500) bomb_y = -50 # 球下落的速度 vel_y = 0.7
捕捉事件
捕捉事件,如果游戏结束按下鼠标,则游戏重新开始, mouse_x, mouse_y捕捉鼠标位置, move_x, move_y获取鼠标的偏移
while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == MOUSEMOTION: mouse_x, mouse_y = event.pos move_x, move_y = event.rel elif event.type == MOUSEBUTTONUP: if game_over: game_over = False lives = 3 score = 0 keys = pygame.key.get_pressed() if keys[K_ESCAPE]: sys.exit()
填充屏幕让球下落
让屏幕填充一个暖色调,如果游戏未开始,屏幕中显示 “点击开始新游戏”, 否则球下落。
如果球大于500,则重置一个新球,生命减去一,如果生命没有了则游戏结束。
这里没有使用元素相碰撞原理,有两个相对的位置,如果球大于挡板的垂直坐标,切球的x坐标大于挡板的开始位置,小于挡板的宽度,则分数添加,重置球的位置。
screen.fill((255, 166, 77)) if game_over: print_text(font1, 100, 200, "点击新游戏") else: bomb_y += vel_y if bomb_y > 500: bomb_x = random.randint(0, 500) bomb_y = -50 lives -= 1 if lives == 0: game_over = True elif bomb_y > pos_y: if bomb_x > pos_x and bomb_x < pos_x + 120: score += 120 bomb_x = random.randint(0, 500) bomb_y = -50
绘制球和挡板,绘制屏幕
根据bomb_x,bomb_y来显示球,并绘制一个阴影
矩形一样
显示生命数和分数,更新屏幕,设置每秒的频率为20
这里明显有很大的问题,因为圆绘制的时候点是圆心,所以比较的时候就会出错,如果你用矩形的右部分去接球心左少部分,显示还是接不到,这里我们不深究,简单的游戏是实现了,优化我放在第二部分。
pygame.draw.circle(screen, black, (bomb_x - 4, int(bomb_y) - 4), 30, 0) pygame.draw.circle(screen, yellow, (bomb_x, int(bomb_y)), 30, 0) pygame.draw.rect(screen, black, (pos_x - 4, pos_y - 4, 120, 40), 0) pygame.draw.rect(screen, red, (pos_x, pos_y, 120, 40), 0) print_text(font1, 0, 0, "生命数: " + str(lives)) print_text(font1, 500, 0, "分数: " + str(score)) pygame.display.update() mainClock.tick(20)
完整代码
import sys, random, pygame from pygame.locals import * def print_text(font, x, y, text, color=(255, 255, 255)): img_text = font.render(text, True, color) screen.blit(img_text, (x, y)) pygame.init() # 定时器 mainClock = pygame.time.Clock() # 设置屏幕和窗口标题 screen = pygame.display.set_mode((600, 500)) pygame.display.set_caption("落球游戏") # 设置字体 font1 = pygame.font.SysFont("方正粗黑宋简体", 24) pygame.mouse.set_visible(False) # 设置颜色变量 white = 255, 255, 255 red = 220, 50, 50 yellow = 230, 230, 50 black = 0, 0, 0 # 生命条数 lives = 3 # 分 score = 0 # 游戏开始flg game_over = True # 鼠标位置 mouse_x = mouse_y = 0 pos_x = 300 pos_y = 460 # 球落下的x和y轴坐标 bomb_x = random.randint(0, 500) bomb_y = -50 # 球下落的速度 vel_y = 0.7 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == MOUSEMOTION: mouse_x, mouse_y = event.pos move_x, move_y = event.rel elif event.type == MOUSEBUTTONUP: if game_over: game_over = False lives = 3 score = 0 keys = pygame.key.get_pressed() if keys[K_ESCAPE]: sys.exit() screen.fill((255, 166, 77)) if game_over: print_text(font1, 100, 200, "点击新游戏") else: bomb_y += vel_y if bomb_y > 500: bomb_x = random.randint(0, 500) bomb_y = -50 lives -= 1 if lives == 0: game_over = True elif bomb_y > pos_y: if bomb_x > pos_x and bomb_x < pos_x + 120: score += 120 bomb_x = random.randint(0, 500) bomb_y = -50 pygame.draw.circle(screen, black, (bomb_x - 4, int(bomb_y) - 4), 30, 0) pygame.draw.circle(screen, yellow, (bomb_x, int(bomb_y)), 30, 0) pos_x = mouse_x if pos_x < 0: pos_x = 0 elif pos_x > 500: pos_x = 500 pygame.draw.rect(screen, black, (pos_x - 4, pos_y - 4, 120, 40), 0) pygame.draw.rect(screen, red, (pos_x, pos_y, 120, 40), 0) print_text(font1, 0, 0, "生命数: " + str(lives)) print_text(font1, 500, 0, "分数: " + str(score)) pygame.display.update() mainClock.tick(20)
加载全部内容