用Python写一个天天酷跑

感觉上次写的植物大战僵尸与俄罗斯方块的反应还不错,这次这个文章就更有动力了
这次就写一个天天酷跑吧
在这里插入图片描述
写出来的效果图就是这样了
下面就更新一下全部的代码吧
还是老样子先定义

import pygame,sys
import random

写一下游戏配置

width = 1200            #窗口宽度
height = 508            #窗口高度
size = width, height   
score=None              #分数
myFont=myFont1=None     #字体
surObject=None          #障碍物图片         
surGameOver=None        #游戏结束图片
bg=None                 #背景对象
role=None               #人物对象
object=None             #障碍物对象        
objectList=[]           #障碍物对象数组
clock=None              #时钟
gameState=None          #游戏状态(0,1)表示(游戏中,游戏结束)

写人物

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=4
    #是否生成障碍物
    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("发生了碰撞!")

ok啦,这就是这个天天酷跑的全部代码啦,有问题可以留言,我看到都会回的。

<think>由于天天酷跑一个复杂的游戏项目,包含图形界面、物理引擎、游戏逻辑等多个方面,完全实现需要大量代码和资源。因此,这里我将提供一个简化版的天天酷跑游戏代码框架,使用Pygame库来实现。这个简化版将包含以下基本元素: 1. 玩家角色(一个方块代表)可以跳跃 2. 障碍物(另一个方块)从右侧向左侧移动 3. 碰撞检测 4. 计分系统 注意:这只是一个非常基础的示例,用于展示游戏的基本结构。实际游戏开发需要更复杂的逻辑和资源。 步骤: 1. 初始化pygame 2. 设置窗口大小和标题 3. 创建玩家(一个矩形)和障碍物(另一个矩形) 4. 游戏主循环:处理事件(如退出和跳跃按键),更新玩家和障碍物的位置,检测碰撞,绘制图形。 我们将实现: - 玩家通过按空格键跳跃(简单的跳跃机制,垂直速度变化) - 障碍物不断从右侧生成并向左移动 - 当玩家碰到障碍物时,游戏结束 - 每成功通过一个障碍物,分数加1 代码结构如下:</think>下面是一个简化版的天天酷跑游戏Python实现,使用Pygame库。这个版本包含角色跳跃、障碍物生成和碰撞检测等核心功能: ```python import pygame import random import sys # 初始化pygame pygame.init() # 游戏常量 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 400 GROUND_HEIGHT = 50 GRAVITY = 1 JUMP_STRENGTH = 18 OBSTACLE_SPEED = 5 OBSTACLE_FREQUENCY = 1500 # 毫秒 # 颜色 SKY_BLUE = (135, 206, 235) GROUND_COLOR = (101, 67, 33) PLAYER_COLOR = (220, 20, 60) OBSTACLE_COLOR = (46, 139, 87) # 创建游戏窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("天天酷跑简化版") clock = pygame.time.Clock() # 玩家类 class Player: def __init__(self): self.width = 40 self.height = 60 self.x = 100 self.y = SCREEN_HEIGHT - GROUND_HEIGHT - self.height self.velocity_y = 0 self.is_jumping = False def jump(self): if not self.is_jumping: self.velocity_y = -JUMP_STRENGTH self.is_jumping = True def update(self): # 应用重力 self.velocity_y += GRAVITY self.y += self.velocity_y # 检测落地 if self.y >= SCREEN_HEIGHT - GROUND_HEIGHT - self.height: self.y = SCREEN_HEIGHT - GROUND_HEIGHT - self.height self.is_jumping = False self.velocity_y = 0 def draw(self): pygame.draw.rect(screen, PLAYER_COLOR, (self.x, self.y, self.width, self.height)) # 绘制眼睛 pygame.draw.circle(screen, (255, 255, 255), (self.x + 30, self.y + 15), 8) pygame.draw.circle(screen, (0, 0, 0), (self.x + 30, self.y + 15), 4) # 障碍物类 class Obstacle: def __init__(self): self.width = 30 self.height = random.randint(30, 60) self.x = SCREEN_WIDTH self.y = SCREEN_HEIGHT - GROUND_HEIGHT - self.height def update(self): self.x -= OBSTACLE_SPEED def draw(self): pygame.draw.rect(screen, OBSTACLE_COLOR, (self.x, self.y, self.width, self.height)) def is_off_screen(self): return self.x < -self.width # 游戏主函数 def main(): player = Player() obstacles = [] score = 0 last_obstacle_time = pygame.time.get_ticks() game_over = False font = pygame.font.SysFont(None, 36) while True: current_time = pygame.time.get_ticks() # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE and not game_over: player.jump() if event.key == pygame.K_r and game_over: # 重新开始游戏 return main() if not game_over: # 更新玩家 player.update() # 生成新障碍物 if current_time - last_obstacle_time > OBSTACLE_FREQUENCY: obstacles.append(Obstacle()) last_obstacle_time = current_time # 更新障碍物 for obstacle in obstacles[:]: obstacle.update() # 检测碰撞 if (player.x < obstacle.x + obstacle.width and player.x + player.width > obstacle.x and player.y < obstacle.y + obstacle.height and player.y + player.height > obstacle.y): game_over = True # 移除屏幕外的障碍物并计分 if obstacle.is_off_screen(): obstacles.remove(obstacle) score += 1 # 绘制背景 screen.fill(SKY_BLUE) # 绘制地面 pygame.draw.rect(screen, GROUND_COLOR, (0, SCREEN_HEIGHT - GROUND_HEIGHT, SCREEN_WIDTH, GROUND_HEIGHT)) # 绘制玩家和障碍物 player.draw() for obstacle in obstacles: obstacle.draw() # 显示分数 score_text = font.render(f"分数: {score}", True, (0, 0, 0)) screen.blit(score_text, (20, 20)) # 游戏结束显示 if game_over: game_over_text = font.render("游戏结束! 按R键重新开始", True, (255, 0, 0)) screen.blit(game_over_text, (SCREEN_WIDTH//2 - 150, SCREEN_HEIGHT//2 - 18)) pygame.display.flip() clock.tick(60) if __name__ == "__main__": main() ``` ### 代码功能说明: 1. **游戏初始化**: - 设置窗口大小和物理参数(重力、跳跃强度等) - 定义游戏角色和障碍物的基本属性 2. **玩家角色**: - 使用矩形表示玩家角色 - 空格键触发跳跃(包含重力模拟) - 角色落地检测机制 3. **障碍物系统**: - 随机高度的障碍物从右侧生成 - 障碍物向左移动(速度恒定) - 超出屏幕自动移除并计分 4. **碰撞检测**: - 矩形碰撞检测算法 - 碰撞后游戏结束 5. **游戏流程**: - 分数统计(每通过一个障碍物+1分) - 游戏结束提示和重启功能(按R键) ### 运行要求: 1. 安装Pygame库:`pip install pygame` 2. 运行代码后使用空格键跳跃 3. 游戏结束后按R键重新开始 ### 扩展建议: 1. 添加角色动画和更精美的素材 2. 实现双跳或滑翔技能 3. 添加金币收集系统 4. 增加不同类型的障碍物 5. 实现游戏难度递增(速度随分数增加)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值