You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

314 lines
9.6 KiB

'''
游戏介绍
按空格键进行游戏可以二段跳游戏失败后按空格键重新开始
'''
import pygame, sys
import random
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
'''def check_login(username, password):
# 这里只是简单地检查用户名和密码是否为预设值
# 实际应用中,您可能需要连接数据库或其他服务进行验证
if username == "周凯" and password == "12345678":
return True
else:
return False
def login():
username = entry_username.get()
password = entry_password.get()
if check_login(username, password):
messagebox.showinfo("登录成功", "欢迎, " + username + "!")
start_game()
else:
messagebox.showerror("登录失败", "用户名或密码错误")
def start_game():
# 这里是游戏的代码
# 例如,一个简单的猜数字游戏
messagebox.showinfo("游戏开始", "现在游戏开始了!")'''
width = 1200 # 设置窗口宽度为1200
height = 508 # 设置窗口高度为508
size = width, height # 创建一个元组,表示窗口的尺寸
score = None # 设置分数
myFont = myFont1 = None # 设置字体
surObject = None # 设置障碍物图片变量
surGameOver = None # 设置游戏结束图片变量
bg = None # 设置背景对象
role = None # 设置设置人物对象
object = None # 设置障碍物对象
objectList = [] # 设置障碍物对象列表
clock = None # 设置时钟对象
gameState = None # 设置游戏状态01表示游戏中游戏结束
"""
定义游戏角色类
"""
class Role:
def __init__(self, surface=None, y=None):
# 人物类的构造函数,初始化人物对象的属性
self.surface = surface
self.y = y
self.w = (surface.get_width()) / 12
self.h = surface.get_height() / 2
self.currentFrame = -1
self.state = 0 # 0代表跑步状态1代表跳跃状态,2代表连续跳跃
self.g = 1 # 重力加速度
self.vy = 0 # y轴速度
self.vy_start = -20 # 起跳开始速度
def getRect(self):
# 返回人物对象的矩形区域
return (0, self.y + 12, self.w, self.h)
"""
定义障碍物类
"""
class Object:
def __init__(self, surface, x=0, y=0):
# 障碍物类的构造函数,初始化障碍物对象的属性
self.surface = surface
self.x = x
self.y = y
self.w = surface.get_width()
self.h = surface.get_height()
self.currentFrame = random.randint(0, 6)
self.w = 100
self.h = 100
def getRect(self):
# 返回障碍物对象的矩形区域
return (self.x, self.y, self.w, self.h)
def collision(self, rect1, rect2):
# 判断两个矩形区域是否发生碰撞
if (rect2[0] >= rect1[2] - 20) or (rect1[0] + 40 >= rect2[2]) or (rect1[1] + rect1[3] < rect2[1] + 20) or (
rect2[1] + rect2[3] < rect1[1] + 20):
return False
return True
"""
定义背景类
"""
class Bg:
def __init__(self, surface):
# 背景类的构造函数,初始化背景对象的属性
self.surface = surface
self.dx = -10
self.w = surface.get_width()
self.rect = surface.get_rect()
"""
初始化游戏函数包括加载图片创建对象等操作
"""
def initGame():
global bg, role, clock, gameState, surObject, surGameOver, score, myFont, myFont1, objectList
# 分数初始化
score = 0
# 初始化
objectList = []
# 加载字体
myFont = pygame.font.Font("./freesansbold.ttf", 32)
myFont1 = pygame.font.Font("./freesansbold.ttf", 64)
# 创建时钟对象 (可以控制游戏循环频率)
clock = pygame.time.Clock()
# 初始化游戏状态
gameState = 0
# 游戏背景
surBg = pygame.image.load("image/bg.bmp").convert_alpha()
bg = Bg(surBg)
# 结束画面
surGameOver = pygame.image.load("image/gameover.bmp").convert_alpha()
# 人物图片
surRole = pygame.image.load("image/role.png").convert_alpha()
role = Role(surRole, 508 - 85)
# 障碍物图片
surObject = pygame.image.load("image/object.png").convert_alpha()
# 生成障碍物的函数
def addObject():
global surObject, object, objectList, object
rate = 2
# 是否生成障碍物
if not random.randint(0, 300) < rate:
return
y = random.choice([height - 100, height - 200, height - 300, height - 400])
object = Object(surObject, width + 40, y)
objectList.append(object)
"""
更新游戏逻辑函数包括处理键盘事件移动角色和障碍物等操作
"""
def updateLogic():
global gameState, score
# 键盘事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
# 空格键跳跃
if gameState == 0:
if event.key == pygame.K_SPACE:
if role.state == 0:
role.state = 1
role.vy = role.vy_start
elif role.state == 1:
role.state = 2
role.vy = role.vy_start
elif gameState == 1:
if event.key == pygame.K_SPACE:
# 重新开始游戏
initGame()
if gameState == 0:
# 背景的移动
bg.dx += 10
if bg.dx == 1200:
bg.dx = 0
# 人物的移动
if role.state == 0:
role.currentFrame += 1
if role.currentFrame == 12:
role.currentFrame = 0
else:
role.y += role.vy
role.vy += role.g
if role.y >= 508 - 85:
role.y = 508 - 85
role.state = 0
# 障碍物的移动
addObject()
for object in objectList:
object.x -= 10 # 障碍物移动
# 障碍物超出屏幕,移除障碍物
if object.x + object.w <= 0:
objectList.remove(object)
score += 10 # 避开障碍物加10分
print("移除了一个目标")
# 碰撞检测
if object.collision(role.getRect(), object.getRect()):
if (object.currentFrame == 6):
objectList.remove(object)
score += 100 # 吃金币加100分
print(score)
print("吃了一个金币")
else:
gameState = 1 # 游戏失败
print("发生了碰撞!")
"""
更新游戏视图函数贴图背景角色和障碍物等
"""
def updateView(screen):
screen.blit(bg.surface, [-bg.dx, 0])
screen.blit(bg.surface, [1200 - bg.dx, 0])
# 分数的贴图
textSur = myFont.render("score:%d" % score, True, (128, 128, 128))
screen.blit(textSur, (500, 20))
del textSur
# 人物的贴图
screen.blit(role.surface, [0, role.y], [int(role.currentFrame) * role.w, 0, role.w, role.h])
# 障碍物的贴图
for object in objectList:
screen.blit(object.surface, [object.x, object.y],
[int(object.currentFrame) * object.w, 0, object.w, object.h])
"""
定义游戏运行结束页面的函数
"""
def judgeState(screen):
global gameState
if gameState == 0:
updateView(screen)
return
elif gameState == 1:
screen.blit(surGameOver, [0, 0])
textSur = myFont1.render("GameOver Score:%d" % score, True, (255, 0, 0))
screen.blit(textSur, (width / 2 - 350, height / 2 + 150))
"""
定义主运行函数
"""
def main():
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('周凯')
initGame()
screen.blit(bg.surface, [0, 0])
while True:
# 设置时钟频率
clock.tick(60)
judgeState(screen)
updateLogic()
pygame.display.flip()
# 运行主运行函数
main()
''''# 创建登录窗口
window_login = tk.Tk()
window_login.title("登录")
window_login.geometry("400x300") # 设置窗口大小
# 加载背景图片
background_image = Image.open("image/1.jpeg") # 替换为您的图片路径
background_image = background_image.resize((400, 300), Image.Resampling.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)
# 创建一个画布来显示背景图片
canvas = tk.Canvas(window_login, width=400, height=300)
canvas.pack(fill="both", expand=True)
canvas.create_image(0, 0, image=background_image, anchor="nw")
# 创建一个框架来容纳登录表单
frame_login = tk.Frame(window_login, bg="#ffffff") # 设置框架背景为半透明
frame_login.place(relx=0.5, rely=0.5, anchor="center")
label_username = tk.Label(frame_login, text="用户名:", bg="#ffffff")
label_username.grid(row=0, column=0, sticky="e", padx=5, pady=5)
entry_username = tk.Entry(frame_login)
entry_username.grid(row=0, column=1, padx=5, pady=5)
label_password = tk.Label(frame_login, text="密码:", bg="#ffffff")
label_password.grid(row=1, column=0, sticky="e", padx=5, pady=5)
entry_password = tk.Entry(frame_login, show="*")
entry_password.grid(row=1, column=1, padx=5, pady=5)
button_login = tk.Button(frame_login, text="登录", command=login, bg="#4CAF50", fg="white")
button_login.grid(row=2, column=0, columnspan=2, padx=5, pady=10)
window_login.mainloop()'''