添加了新的功能
大家在测试代码的时候注意下图片在你电脑中的实际地址,你需要修改下,我的地址是
‘spiders/back_img.png’ ,请注意你的实际情况,图片地址代码在第99行
self.back_image = pygame.image.load(‘spiders/back_img.png’)
'''打地鼠游戏v1.3'''
'''
1.在表盘下面显示当前时间
2.给表盘添加图片背景
'''
# 导包导库导模块
import pygame, sys
from pygame import *
from math import sin, cos, radians
from datetime import datetime
# 游戏初始化
pygame.init()
# 常量
SCREENWIDTH = 800
SCREENHEIGHT = 800
SCREENSIZE = (SCREENWIDTH, SCREENHEIGHT)
CAPTION = '浣熊打地鼠v1.3'
# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
LIGHT_BLUE = (0, 125, 255)
# 创建主逻辑类
class MainGame(object):
'创建主逻辑类,包括窗口,游戏开始与结束的方法和事件的获取与相应'
# 创建主窗口
window = pygame.display.set_mode(SCREENSIZE)
# 设置标题
pygame.display.set_caption(CAPTION)
def __init__(self):
'初始成员变量'
pass
def response_event(self):
'提供事件获取与响应的方法'
# 获取事件列表
for event in pygame.event.get():
# 窗口右上角退出方法
if event.type == QUIT:
self.end_game()
# 获取键盘按键
keys = pygame.key.get_pressed()
# 按ESC键退出游戏
if keys[K_ESCAPE]:
self.end_game()
def start_game(self):
'''游戏主循环'''
while True:
# 用黑色刷新窗口(暂时这样做)
mainGame.window.fill(BLACK)
# 获取处理事件
self.response_event()
# 加载钟表外观
clock.display()
# 保持窗口刷新
pygame.display.update()
def end_game(self):
'''游戏结束的方法'''
pygame.quit()
sys.exit()
# 创建倒计时钟表类
class Clock(object):
'创建钟表类,包括表针的移动和显示时间等方法'
# 创建电子表字体
clockFont = pygame.font.Font(None, 40)
def __init__(self):
# 钟表圆心的位置
self.clock_x = 100
self.clock_y = 100
self.pos = (self.clock_x, self.clock_y)
# 钟表的半径
self.radius = 80
# 钟表的轮廓宽度
self.circle_width = 10
# 创建起始终止坐标
self.start_x = 0
self.start_y = 0
self.end_x = 0
self.end_y = 0
# 刻度的宽度
self.line_width = 5
# 刻度坐标位置列表
self.pos_list = []
# 在初始化时计算列表中的坐标
self.calculate_pos()
# 秒针,分针和时针的长度
self.second_len = 50
self.minute_len = 45
self.hour_len = 30
# 背景图片
self.back_image = pygame.image.load('spiders/back_img.png')
def calculate_pos(self):
'''刻度的分布'''
# 设置起始角度
degree = 0
# 设置内圆半径
in_radius = 60
# 设置外圆半径
out_radius = 70
# 计算12次,得到每个起始和中止点的坐标
for i in range(12):
self.start_x = self.clock_x + in_radius * cos(radians(degree))
self.start_y = self.clock_x + in_radius * sin(radians(degree))
self.end_x = self.clock_x + out_radius * cos(radians(degree))
self.end_y = self.clock_x + out_radius * sin(radians(degree))
degree += 30
# 获得坐标列表
self.pos_list.append([(self.start_x, self.start_y), (self.end_x, self.end_y)])
# 返回值是坐标列表
return self.pos_list
def calculate_hand_pos(self, degree, hand_len):
'计算表针的末位置'
hand_x = self.clock_x + hand_len * cos(radians(degree))
hand_y = self.clock_y + hand_len * sin(radians(degree))
hand_pos = (hand_x, hand_y)
return hand_pos
def set_time(self):
'设置电子表的时间'
h = datetime.today().time().hour
m = datetime.today().time().minute
s = datetime.today().time().second
time = '{chapter1:02.0f}:{chapter2:02.0f}:{chapter3:02.0f}'.format(
chapter1=h,
chapter2=m,
chapter3=s)
return time
def display(self):
'''展示表盘的方法'''
# 贴上背景图
mainGame.window.blit(self.back_image, (25, 25))
# 绘制表盘
pygame.draw.circle(mainGame.window, LIGHT_BLUE, self.pos, self.radius, self.circle_width)
# 绘制表盘上的刻度
for pos in self.pos_list:
pygame.draw.line(mainGame.window, LIGHT_BLUE, pos[0], pos[1], self.line_width)
# 绘制表的轴
pygame.draw.circle(mainGame.window, LIGHT_BLUE, self.pos, 5)
# 计算秒针末位置
second_degree = 6 * datetime.today().time().second - 90
second_pos = self.calculate_hand_pos(second_degree, self.second_len)
# 计算分针末位置
minute_degree = 6 * datetime.today().time().minute - 90
minute_pos = self.calculate_hand_pos(minute_degree, self.minute_len)
# 计算时针末位置
hour_degree = 30 * datetime.today().time().hour - 90 + minute_degree / 12
hour_pos = self.calculate_hand_pos(hour_degree, self.hour_len)
# 绘制秒针,分针和时针
pygame.draw.line(mainGame.window, LIGHT_BLUE, self.pos, second_pos, self.line_width)
pygame.draw.line(mainGame.window, LIGHT_BLUE, self.pos, minute_pos, self.line_width)
pygame.draw.line(mainGame.window, LIGHT_BLUE, self.pos, hour_pos, self.line_width)
# 创建电子表的图片
time = self.set_time()
elec_clock_image = Clock.clockFont.render(time, True, LIGHT_BLUE)
mainGame.window.blit(elec_clock_image, (40, 200))
if __name__ == "__main__":
# 创建主逻辑的实例
mainGame = MainGame()
# 创建钟表的实例对象
clock = Clock()
# 开始游戏
mainGame.start_game()