''' |
作者:mikeKil |
游戏名:躲避方块(英文版) |
注:如果发现BUG或有疑问可以到作者的留言板留言 |
(如果想导入背景音乐可以去掉196~199,670和66~67行的注释) |
''' |
#模块导入 |
import pygame |
import sys |
import random |
import time |
import tkinter as tk |
from tkinter import filedialog, messagebox |
import easygui as gui |
import win32gui |
import win32api |
#pygame初始化 |
pygame.init() |
pygame.mixer.init() |
#隐藏tkinter窗口 |
root = tk.Tk() |
root.withdraw() |
#窗口宽高 |
windowWIDTH = 600 ; windowHEIGHT = 450 |
#颜色加载 |
BLUE = ( 0 , 0 , 255 ) ; LIGHTBLUE = ( 0 , 245 , 255 ) |
WHITE = ( 255 , 255 , 255 ) ; PURPLE = ( 148 , 0 , 211 ) |
LIGHTPURPLE = ( 160 , 32 , 240 ) ; GREEN = ( 50 , 205 , 50 ) |
LIGHTGREEN = ( 0 , 255 , 127 ) ; ORANGE = ( 255 , 140 , 0 ) |
RED = ( 255 , 0 , 0 ) ; PINK = ( 255 , 192 , 203 ) |
LIGHTYELLOW = ( 255 , 222 , 173 ) ; YELLOW = ( 255 , 255 , 0 ) |
colors = [BLUE,WHITE,PURPLE,GREEN,ORANGE,LIGHTYELLOW, |
RED,LIGHTBLUE,LIGHTPURPLE,PINK,LIGHTGREEN,YELLOW] |
#音乐名设置 |
fileName = "The Way I Still Love You" |
#窗口标题 |
window_title = u '躲避方块(英文版) Avoid obstacles(English version)' |
#大号字体和小号字体 |
BASICFONT = pygame.font.Font( 'freesansbold.ttf' , 18 ) |
BASICFONT_M = pygame.font.Font( 'freesansbold.ttf' , 30 ) |
BASICFONT_B = pygame.font.Font( 'freesansbold.ttf' , 55 ) |
#是否继续更新推进 |
IsPlus = True ; IsWrite = True ; IsAgain = True |
#状态 |
STATES = { "START" : 1 , "RUNNING1" : 2 , "GAME_OVER" : 3 , "SETUP" : 4 , "RUNNING2" : 5 } |
state = STATES[ "START" ] |
#方块列表 |
enemies = [] |
Senemies = [] |
#分数列表 |
secondsList = [] |
#开始的时间 |
TIMELATER = 0 |
#上次的时间和等待的时间 |
lastTime = 0 |
interval = 0.7 |
lastTime_m2 = 0 |
interval_m2 = 0.5 |
#窗口加载和标题命名 |
canvas = pygame.display.set_mode((windowWIDTH,windowHEIGHT)) |
pygame.display.set_caption( "躲避方块(英文版) Avoid obstacles(English version)" ) |
#音乐加载并播放音乐 |
# track = pygame.mixer.music.load(filePath) |
# pygame.mixer.music.play() |
#line(Surface, color, start_pos, end_pos, width=1) |
#创建Enemy类 |
class Enemy(): |
def __init__( self ,width,color,steep, type , |
start_posX,start_posY,end_posX,end_posY): |
#宽度 |
self .width = width |
#开始坐标和结束坐标 |
self .start_posX = start_posX |
self .start_posY = start_posY |
self .end_posX = end_posX |
self .end_posY = end_posY |
#颜色,速度,类型等属性 |
self .color = color |
self .steep = steep |
self . type = type |
self .WIDTH = self .start_posX - self .end_posX |
#绘制方法 |
def draw( self ): |
pygame.draw.line(canvas, self .color,( self .start_posX, self .start_posY), |
( self .end_posX, self .end_posY), self .width) |
#移动方法 |
def move( self ): |
if self . type = = 1 : |
self .start_posY + = self .steep |
self .end_posY + = self .steep |
elif self . type = = 2 : |
self .start_posX + = self .steep |
self .end_posX + = self .steep |
elif self . type = = 3 : |
self .start_posY - = self .steep |
self .end_posY - = self .steep |
elif self . type = = 4 : |
self .start_posX - = self .steep |
self .end_posX - = self .steep |
#越界方法 |
def outOfBounds( self ): |
return self .start_posX > 700 or \ |
self .start_posY > 700 or \ |
self .start_posX < - 100 or \ |
self .start_posY < - 100 |
#碰撞方法 |
def hit( self , x, y): |
if self . type = = 1 or self . type = = 3 : |
return x > = self .start_posX and \ |
x < = self .end_posX and \ |
y > = self .start_posY and \ |
y < = self .start_posY + self .width |
elif self . type = = 2 or self . type = = 4 : |
return x > = self .start_posX and \ |
x < = self .start_posX + self .width and \ |
y > = self .start_posY and \ |
y < = self .end_posY |
|
#调用 |
Enemy( 5 ,WHITE, 7 , 1 , 0 , 0 , 40 , 40 ) |
#事件检测方法 |
def handleEvent(): |
global state,TIMELATER,IsPlus,IsWrite,IsAgain |
#循环事件 |
for event in pygame.event.get(): |
#退出 |
if event. type = = pygame.QUIT: |
pygame.quit() |
sys.exit() |
#鼠标左键按下 |
if event. type = = pygame.MOUSEBUTTONDOWN and event.button = = 1 : |
mouseX = event.pos[ 0 ] |
mouseY = event.pos[ 1 ] |
if state = = STATES[ "START" ]: |
#鼠标位置获取 |
if 35 < = mouseX < = 100 and 390 < = mouseY < = 420 : |
state = STATES[ "SETUP" ] |
elif 140 < = mouseX < = 250 and 270 < = mouseY < = 320 : |
#设置开始时间 |
TIMELATER = time.time() |
#状态跳转 |
state = STATES[ "RUNNING1" ] |
elif 340 < = mouseX < = 450 and 270 < = mouseY < = 320 : |
#设置开始时间 |
TIMELATER = time.time() |
#状态跳转 |
state = STATES[ "RUNNING2" ] |
else : |
pass |
elif state = = STATES[ "SETUP" ]: |
if windowWIDTH - 110 < = mouseX < = windowWIDTH - 40 and 35 < = mouseY < = 60 : |
findMusic() |
elif windowWIDTH - 110 < = mouseX < = windowWIDTH - 40 and 65 < = mouseY < = 90 : |
changeInterval() |
elif windowWIDTH - 110 < = mouseX < = windowWIDTH - 40 and 95 < = mouseY < = 130 : |
changeSInterval() |
else : |
#状态跳转 |
state = STATES[ "START" ] |
#鼠标移动,判断出界 |
if event. type = = pygame.MOUSEMOTION: |
mouseX = event.pos[ 0 ] |
mouseY = event.pos[ 1 ] |
#isMouseOut方法 |
if isMouseOut(mouseX, mouseY): |
if state = = STATES[ "RUNNING1" ] or state = = STATES[ "RUNNING2" ]: |
secondsList.append(timeLater()) |
state = STATES[ "GAME_OVER" ] |
#键盘按下 |
if event. type = = pygame.KEYDOWN: |
#Esc键 |
if event.key = = pygame.K_ESCAPE: |
#返回主页 |
if state = = STATES[ "RUNNING1" ] or state = = STATES[ "RUNNING2" ]: |
state = STATES[ "START" ] |
IsAgain = True |
#退出 |
elif state = = STATES[ "START" ] or state = = STATES[ "GAME_OVER" ]: |
pygame.quit() |
sys.exit() |
#R键重开 |
elif event.key = = pygame.K_r: |
if state = = STATES[ "GAME_OVER" ]: |
state = STATES[ "START" ] |
#重新设置 |
IsPlus = True |
IsWrite = True |
IsAgain = True |
|
#音乐检测方法 |
# def handleMusic(): |
# #检查是否正在播放音乐 |
# if pygame.mixer.music.get_busy() == False: |
# pygame.mixer.music.play() |
#工具方法-寻找指定窗口 |
def findTitle(window_title): |
''' |
查找指定标题窗口句柄 |
@param window_title: 标题名 |
@return: 窗口句柄 |
''' |
hWndList = [] |
# 函数功能:该函数枚举所有屏幕上的顶层窗口,办法是先将句柄传给每一个窗口,然后再传送给应用程序定义的回调函数。 |
win32gui.EnumWindows( lambda hWnd, param: param.append(hWnd), hWndList) |
for hwnd in hWndList: |
# 函数功能:该函数获得指定窗口所属的类的类名。 |
# clsname = win32gui.GetClassName(hwnd) |
# 函数功能:该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内 |
title = win32gui.GetWindowText(hwnd) |
if (title = = window_title): |
break |
#返回参数 |
return hwnd |
|
hwnd = findTitle(window_title) |
def Get_coordinates(): #工具方法-获取鼠标坐标 |
#全局设置 |
global pos_x,pos_y |
#获取鼠标坐标 |
p = win32api.GetCursorPos() |
# GetWindowRect 获得整个窗口的范围矩形,窗口的边框、标题栏、滚动条及菜单等都在这个矩形内 |
x,y,w,h = win32gui.GetWindowRect(hwnd) |
# 鼠标坐标减去指定窗口坐标为鼠标在窗口中的坐标值 |
pos_x = p[ 0 ] - x |
pos_y = p[ 1 ] - y |
|
def isActionTime(lastTime, interval): #工具方法-判断时间间隔是否到了 |
if lastTime = = 0 : |
return True |
currentTime = time.time() |
return currentTime - lastTime > = interval |
def isMouseOut(x, y): #工具方法-判断鼠标是否越界 |
if x > = 570 or x < = 30 or y > 430 or y < = 30 : |
return True |
else : |
return False |
|
def findNumValue( list = []): #工具方法-寻找最大的分数值 |
for i in range ( len ( list ) - 1 ): |
for j in range ( len ( list ) - 1 - i): |
if list [j]> list [j + 1 ]: |
temp = list [j] |
list [j] = list [j + 1 ] |
list [j + 1 ] = temp |
#返回参数 |
return list [ len ( list ) - 1 ] |
def findMusic(): #工具方法-打开音乐列表并选择播放音乐 |
global filePath,fileName |
#这里借用了tkinter的filedialog模块 |
#initialdir是指定打开路径,filetypes筛选了MP3,WAV,PCM三个格式的文件 |
filePath = filedialog.askopenfilename(title = "choose a Music" , |
initialdir = "C:/" , |
filetypes = [( "MP3" , "mp3" ), |
( "WAV" , "wav" ), |
( "PCM" , "pcm" )]) |
if len (filePath) ! = 0 : |
#加载音乐并播放 |
track = pygame.mixer.music.load(filePath) |
pygame.mixer.music.play() |
#修改音乐名,split为字符串分割方法 |
fileName = filePath.split( "-" )[ 1 ].split( "." )[ 0 ] |
|
def changeInterval(): #工具方法-修改MODE1的参数 |
global interval |
try : |
#输入参数 |
interval = float (gui.enterbox( "Please input a float about the Interval:\n(>= 0.2 and <= 2.1):" )) |
#参数不合格 |
while interval < 0.2 or interval > = 2.1 : |
if interval > = 2.1 : |
interval = float (gui.enterbox( "The value is too large.\nPlease input a float about the Interval:\n(>= 0.2 and <= 2.1)" )) |
else : |
interval = float (gui.enterbox( "The value is too small.\nPlease input a float about the Interval:\n(>= 0.2 and <= 2.1)" )) |
except : |
#没有输入 |
interval = 0.7 |
|
def changeSInterval(): #工具方法-修改MODE2的参数 |
global interval_m2 |
try : |
#输入参数 |
interval_m2 = float (gui.enterbox( "Please input a float about the Interval:\n(>= 0.3 and <= 1):" )) |
#参数不合格 |
while interval_m2 < 0.3 or interval_m2 > 1 : |
if interval_m2 > 1 : |
interval_m2 = float (gui.enterbox( "The value is too large.\nPlease input a float about the Interval:\n(>= 0.3 and <= 1)" )) |
else : |
interval_m2 = float (gui.enterbox( "The value is too small.\nPlease input a float about the Interval:\n(>= 0.3 and <= 1)" )) |
except : |
#没有输入 |
interval_m2 = 0.5 |
|
def timeLater(): #工具方法-游戏时间获取 |
global TimeLater,TIMELATER |
TimeLater = time.time() |
Time = TimeLater - TIMELATER |
Time = int (Time) |
#返回参数 |
return Time |
def drawLinesBounds(): #边界绘制方法 |
WID_1 = pygame.draw.line(canvas, BLUE, ( 30 , 30 ), (windowWIDTH - 30 , 30 ), 7 ) |
HEI_1 = pygame.draw.line(canvas, BLUE, ( 30 , 30 ), ( 30 , windowHEIGHT - 30 ), 7 ) |
HEI_2 = pygame.draw.line(canvas, BLUE, (windowWIDTH - 30 , windowHEIGHT - 30 ), |
(windowWIDTH - 30 , 30 ), 7 ) |
WID_2 = pygame.draw.line(canvas, BLUE, (windowWIDTH - 30 , |
windowHEIGHT - 30 ), |
( 30 , windowHEIGHT - 30 ), 7 ) |
|
def writeWords(): #文字方法-游戏开始提示 |
pressKeySurf = BASICFONT.render( "Press a mouse in 'MODE' to play." , True , WHITE) |
pressKeyRect = pressKeySurf.get_rect() |
pressKeyRect.topleft = (windowWIDTH - 290 , windowHEIGHT - 20 ) |
canvas.blit(pressKeySurf, pressKeyRect) |
pressKeySurf1 = BASICFONT_M.render( 'MODE 1' , True , WHITE) |
pressKeyRect1 = pressKeySurf1.get_rect() |
pressKeyRect1.topleft = ( 140 , 270 ) |
canvas.blit(pressKeySurf1, pressKeyRect1) |
pressKeySurf2 = BASICFONT_M.render( 'MODE 2' , True , WHITE) |
pressKeyRect2 = pressKeySurf2.get_rect() |
pressKeyRect2.topleft = ( 340 , 270 ) |
canvas.blit(pressKeySurf2, pressKeyRect2) |
|
def writeStart(): #文字方法-START状态游戏界面文字书写 |
global pressKeySurf3 |
#游戏标题 |
pressKeySurf1 = BASICFONT_B.render( 'Avoid obstacles' , True , WHITE) |
pressKeyRect1 = pressKeySurf1.get_rect() |
pressKeyRect1.topleft = ( 90 , 150 ) |
canvas.blit(pressKeySurf1, pressKeyRect1) |
#鼠标位置提示 |
pressKeySurf2 = BASICFONT.render( 'Please move the mouse into the blue box' , |
True , WHITE) |
pressKeyRect2 = pressKeySurf2.get_rect() |
pressKeyRect2.topleft = ( 170 , 220 ) |
canvas.blit(pressKeySurf2, pressKeyRect2) |
#最大分数 |
if len (secondsList) = = 0 : |
pressKeySurf3 = BASICFONT.render( 'Best score:0' , True , WHITE) |
else : |
score = findNumValue(secondsList) |
pressKeySurf3 = BASICFONT.render( 'Best score:' + str (score), True , WHITE) |
pressKeyRect3 = pressKeySurf3.get_rect() |
pressKeyRect3.topleft = ( 90 , 130 ) |
canvas.blit(pressKeySurf3, pressKeyRect3) |
|
def writeTip(): #文字方法-书写RUNNING状态的提示 |
#提示游戏已经开始 |
pressKeySurf1 = BASICFONT.render( 'Game Already Started' , True , WHITE) |
pressKeyRect1 = pressKeySurf1.get_rect() |
pressKeyRect1.topleft = (windowWIDTH - 210 , windowHEIGHT - 20 ) |
canvas.blit(pressKeySurf1, pressKeyRect1) |
#时间 |
pressKeySurf2 = BASICFONT.render( 'Time:' + str (timeLater()), True , WHITE) |
pressKeyRect2 = pressKeySurf2.get_rect() |
pressKeyRect2.topleft = ( 5 , 5 ) |
canvas.blit(pressKeySurf2, pressKeyRect2) |
#等级 |
if timeLater() < = 15 : |
pressKeySurf = BASICFONT.render( 'Grade:Bad' , True , WHITE) |
elif timeLater() < = 25 : |
pressKeySurf = BASICFONT.render( 'Grade:Commonly' , True , WHITE) |
elif timeLater() < = 40 : |
pressKeySurf = BASICFONT.render( 'Grade:Good' , True , LIGHTYELLOW) |
elif timeLater() < = 50 : |
pressKeySurf = BASICFONT.render( 'Grade:Nice' , True , LIGHTYELLOW) |
elif timeLater() < = 60 : |
pressKeySurf = BASICFONT.render( 'Grade:Great!' , True , YELLOW) |
elif timeLater() < = 80 : |
pressKeySurf = BASICFONT.render( 'Grade:Against The Sky!' , True , YELLOW) |
elif timeLater() < = 100 : |
pressKeySurf = BASICFONT.render( 'Grade:Legend!' , True , ORANGE) |
else : |
pressKeySurf = BASICFONT.render( 'Grade:Invincible!!' , True , ORANGE) |
pressKeyRect = pressKeySurf.get_rect() |
pressKeyRect.topleft = ( 125 , 5 ) |
canvas.blit(pressKeySurf, pressKeyRect) |
|
def writeTip_EXIT(): #文字方法-退出提示 |
pressKeySurf1 = BASICFONT.render( 'Press a Esc to exit.' , True , WHITE) |
pressKeyRect1 = pressKeySurf1.get_rect() |
pressKeyRect1.topleft = ( 5 , windowHEIGHT - 20 ) |
canvas.blit(pressKeySurf1, pressKeyRect1) |
|
def writeTip_EXIT_Reopen(): #文字方法-重开和退出提示 |
pressKeySurf1 = BASICFONT.render( 'Press a Esc to exit.' , True , WHITE) |
pressKeyRect1 = pressKeySurf1.get_rect() |
pressKeyRect1.topleft = ( 5 , windowHEIGHT - 20 ) |
canvas.blit(pressKeySurf1, pressKeyRect1) |
#提示按R重开 |
pressKeySurf2 = BASICFONT.render( 'Press a key R to Reopen.' , True , WHITE) |
pressKeyRect2 = pressKeySurf2.get_rect() |
pressKeyRect2.topleft = (windowWIDTH - 230 , windowHEIGHT - 20 ) |
canvas.blit(pressKeySurf2, pressKeyRect2) |
|
def writeLose(): #文字方法-游戏失败提示 |
pressKeySurf2 = BASICFONT_B.render( 'You failed!' , True , WHITE) |
pressKeyRect2 = pressKeySurf2.get_rect() |
pressKeyRect2.topleft = ( 150 , 200 ) |
canvas.blit(pressKeySurf2, pressKeyRect2) |
|
def writeLoseTime(): #文字方法-书写存活时间 |
global IsPlus,c |
if IsPlus: |
content = timeLater() |
if content < = 1 : |
pressKeySurf = BASICFONT.render( 'You survived ' + str (content) + " second" , True , WHITE) |
else : |
pressKeySurf = BASICFONT.render( 'You survived ' + str (content) + " seconds" , True , WHITE) |
pressKeyRect = pressKeySurf.get_rect() |
pressKeyRect.topleft = ( 154 , 180 ) |
canvas.blit(pressKeySurf, pressKeyRect) |
c = content |
IsPlus = False |
else : |
if c < = 1 : |
pressKeySurf = BASICFONT.render( 'You survived ' + str (c) + " second" , True , WHITE) |
else : |
pressKeySurf = BASICFONT.render( 'You survived ' + str (c) + " seconds" , True , WHITE) |
pressKeyRect = pressKeySurf.get_rect() |
pressKeyRect.topleft = ( 150 , 180 ) |
canvas.blit(pressKeySurf, pressKeyRect) |
|
def writeLoseEncourage(): #文字方法-鼓励文字提示 |
pressKeySurf = BASICFONT.render( "Don't give up,keep working hard!" , True , WHITE) |
pressKeyRect = pressKeySurf.get_rect() |
pressKeyRect.topleft = ( 154 , 275 ) |
canvas.blit(pressKeySurf, pressKeyRect) |
|
def writeLoseGrade(): #文字方法-等级文字提示 |
global IsWrite,SpressKeySurf |
if IsWrite: |
if timeLater() < = 15 : |
SpressKeySurf = BASICFONT.render( 'Grade:Bad' , True , WHITE) |
elif timeLater() < = 25 : |
SpressKeySurf = BASICFONT.render( 'Grade:Commonly' , True , WHITE) |
elif timeLater() < = 40 : |
SpressKeySurf = BASICFONT.render( 'Grade:Good' , True , LIGHTYELLOW) |
elif timeLater() < = 50 : |
SpressKeySurf = BASICFONT.render( 'Grade:Nice' , True , LIGHTYELLOW) |
elif timeLater() < = 60 : |
SpressKeySurf = BASICFONT.render( 'Grade:Great!' , True , YELLOW) |
elif timeLater() < = 80 : |
SpressKeySurf = BASICFONT.render( 'Grade:Against The Sky!' , True , YELLOW) |
elif timeLater() < = 100 : |
SpressKeySurf = BASICFONT.render( 'Grade:Legend!' , True , ORANGE) |
else : |
SpressKeySurf = BASICFONT.render( 'Grade:Invincible!!' , True , ORANGE) |
SpressKeyRect = SpressKeySurf.get_rect() |
SpressKeyRect.topleft = ( 154 , 255 ) |
canvas.blit(SpressKeySurf, SpressKeyRect) |
IsWrite = False |
else : |
SpressKeyRect = SpressKeySurf.get_rect() |
SpressKeyRect.topleft = ( 154 , 255 ) |
canvas.blit(SpressKeySurf, SpressKeyRect) |
|
def writeBeyondRecord(): #文字方法-新纪录提示 |
if len (secondsList) > 0 : |
timeNow = timeLater() |
timeAgo = findNumValue(secondsList) |
if timeNow > timeAgo: |
pressKeySurf = BASICFONT.render( "Beyond Record!" , True , ORANGE) |
pressKeyRect = pressKeySurf.get_rect() |
pressKeyRect.topleft = ( 375 , 5 ) |
canvas.blit(pressKeySurf, pressKeyRect) |
|
def writeSet_up(): #文字方法-设置 |
pressKeySurf = BASICFONT.render( "Set Up" , True , WHITE) |
pressKeyRect = pressKeySurf.get_rect() |
pressKeyRect.topleft = ( 38 , windowHEIGHT - 53 ) |
canvas.blit(pressKeySurf, pressKeyRect) |
|
def writeSetContent(): |
pressKeySurf1 = BASICFONT.render( "background music:" + fileName, True , WHITE) |
pressKeyRect1 = pressKeySurf1.get_rect() |
pressKeyRect1.topleft = ( 40 , 40 ) |
canvas.blit(pressKeySurf1, pressKeyRect1) |
surf1change = BASICFONT.render( "Change" , True , WHITE) |
rect1change = surf1change.get_rect() |
rect1change.topleft = (windowWIDTH - 110 , 40 ) |
canvas.blit(surf1change, rect1change) |
pressKeySurf2 = BASICFONT.render( "MODE 1 Block update time:" + str (interval), True , WHITE) |
pressKeyRect2 = pressKeySurf2.get_rect() |
pressKeyRect2.topleft = ( 40 , 70 ) |
canvas.blit(pressKeySurf2, pressKeyRect2) |
surf2change = BASICFONT.render( "Change" , True , WHITE) |
rect2change = surf2change.get_rect() |
rect2change.topleft = (windowWIDTH - 110 , 70 ) |
canvas.blit(surf2change, rect2change) |
pressKeySurf3 = BASICFONT.render( "MODE 2 Block update time:" + str (interval_m2), True , WHITE) |
pressKeyRect3 = pressKeySurf3.get_rect() |
pressKeyRect3.topleft = ( 40 , 100 ) |
canvas.blit(pressKeySurf3, pressKeyRect3) |
surf3change = BASICFONT.render( "Change" , True , WHITE) |
rect3change = surf3change.get_rect() |
rect3change.topleft = (windowWIDTH - 110 , 100 ) |
canvas.blit(surf3change, rect3change) |
|
def deleteComponent(): #组件删除方法 |
for i in range ( len (enemies) - 1 , - 1 , - 1 ): |
x = enemies[i] |
if x.outOfBounds(): |
enemies.remove(x) |
|
def paint(): #MODE1组件绘制方法 |
for i in enemies: |
i.draw() |
|
def Spaint(): #MODE2组件绘制方法 |
for i in Senemies: |
i.draw() |
|
def move(): #MODE1组件移动方法 |
for i in enemies: |
i.move() |
|
def Smove(): #MODE2组件移动方法 |
for i in Senemies: |
i.move() |
|
def enterComponent(): #MODE1组件更新方法 |
global lastTime |
# 判断是否到了产生的时间 |
if not isActionTime(lastTime, interval): |
return |
lastTime = time.time() |
#随机生成属性 |
steep = random.randint( 3 , 10 ) |
type = random.randint( 1 , 4 ) |
width = random.randint( 30 , 40 ) |
color = colors[random.randint( 0 , 11 )] |
#将属性和位置一一插入方块列表 |
if type = = 1 : |
sX = random.randint( 30 , 570 ) |
eX = random.randint( 30 , 570 ) |
while sX > = eX: |
sX = random.randint( 30 , 570 ) |
eX = random.randint( 30 , 570 ) |
enemies.append(Enemy(width,color,steep, type ,sX, - 50 ,eX, - 50 )) |
elif type = = 2 : |
sY = random.randint( 30 , 420 ) |
eY = random.randint( 30 , 420 ) |
while sY > = eY: |
sY = random.randint( 30 , 420 ) |
eY = random.randint( 30 , 420 ) |
enemies.append(Enemy(width,color,steep, type , - 30 ,sY, - 30 ,eY)) |
elif type = = 3 : |
sX = random.randint( 30 , 570 ) |
eX = random.randint( 30 , 570 ) |
while sX > = eX: |
sX = random.randint( 30 , 570 ) |
eX = random.randint( 30 , 570 ) |
enemies.append(Enemy(width,color,steep, type ,sX, 500 ,eX, 500 )) |
elif type = = 4 : |
sY = random.randint( 30 , 420 ) |
eY = random.randint( 30 , 420 ) |
while sY > = eY: |
sY = random.randint( 30 , 420 ) |
eY = random.randint( 30 , 420 ) |
enemies.append(Enemy(width,color,steep, type , 630 ,sY, 630 ,eY)) |
|
def ComponentUpdate(): #MODE2组件更新方法 |
global lastTime_m2,Scolor,IsAgain |
# 判断是否到了产生的时间 |
if not isActionTime(lastTime_m2, interval_m2): |
return |
lastTime_m2 = time.time() |
width = random.randint( 30 , 40 ) |
if timeLater() < = 30 : Space_between = random.randint( 70 , 200 ) |
elif timeLater() < = 40 : Space_between = random.randint( 50 , 150 ) |
elif timeLater() < = 60 : Space_between = random.randint( 35 , 100 ) |
elif timeLater() < = 80 : Space_between = random.randint( 25 , 75 ) |
else : Space_between = random.randint( 25 , 50 ) |
eY = random.randint( 80 , 370 ) |
sY = eY + Space_between |
if IsAgain: |
Scolor = colors[random.randint( 0 , 11 )] |
IsAgain = False |
Senemies.append(Enemy(width,Scolor, 5 , 4 , 630 , 30 , 630 ,eY)) |
Senemies.append(Enemy(width,Scolor, 5 , 4 , 630 ,sY, 630 ,windowHEIGHT - 30 )) |
|
|
#碰撞检测方法 |
def checkHit(x,y): #检测组件与鼠标之间的碰撞 |
global state |
# x,y = pag.position() #返回鼠标的坐标 |
# print(x,y) |
for enemy in enemies: |
if enemy.hit(x , y): |
state = STATES[ "GAME_OVER" ] |
#插入分数值 |
secondsList.append(timeLater()) |
for enemy in Senemies: |
if enemy.hit(x , y): |
state = STATES[ "GAME_OVER" ] |
#插入分数值 |
secondsList.append(timeLater()) |
|
#状态和方法的总控制 |
def contralState(): |
#开始 |
if state = = STATES[ "START" ]: |
#绘制边界 |
drawLinesBounds() |
#书写提示 |
writeTip_EXIT() |
writeWords() |
writeStart() |
writeSet_up() |
#运行 |
elif state = = STATES[ "RUNNING1" ]: |
#绘制边界 |
drawLinesBounds() |
#书写提示 |
writeTip_EXIT() |
writeTip() |
writeBeyondRecord() |
#组件方法 |
enterComponent() |
paint() |
move() |
checkHit(pos_x,pos_y) |
#运行 |
elif state = = STATES[ "RUNNING2" ]: |
#绘制边界 |
drawLinesBounds() |
#书写提示 |
writeTip_EXIT() |
writeTip() |
writeBeyondRecord() |
#组件方法 |
ComponentUpdate() |
Spaint() |
Smove() |
checkHit(pos_x,pos_y) |
#结束 |
elif state = = STATES[ "GAME_OVER" ]: |
#绘制边界 |
drawLinesBounds() |
#书写提示 |
writeTip_EXIT_Reopen() |
writeLose() |
writeLoseTime() |
writeLoseGrade() |
writeLoseEncourage() |
#组件方法(用于清空界面) |
move() |
Smove() |
#设置 |
elif state = = STATES[ "SETUP" ]: |
#绘制边界 |
drawLinesBounds() |
writeSetContent() |
|
def MAINLOOP(): |
#实时获取鼠标坐标 |
Get_coordinates() |
#事件监测方法 |
handleEvent() |
#音乐监测方法 |
#handleMusic() |
#绘制黑色背景 |
canvas.fill(( 0 , 0 , 0 )) |
#状态方法调用 |
contralState() |
#屏幕更新和刷新 |
pygame.display.update() |
#等待0.01秒后再进行下一次循环 |
pygame.time.delay( 15 ) |
|
#循环调用控制运行 |
while True : |
MAINLOOP() |