0

0

python pygame怎么实现打砖块游戏

PHPz

PHPz

发布时间:2023-05-25 10:31:05

|

2095人浏览过

|

来源于亿速云

转载

游戏环境的界面以及代码如下

python pygame怎么实现打砖块游戏

Question AI
Question AI

一款基于大模型的免费的AI问答助手、总结器、AI搜索引擎

下载
import sys
sys.path.append(r'E:\anaconda\Lib\site-packages')
import pygame
import sys
import random
import time
import math
from tkinter import _flatten
pygame.init()
pygame.font.init()

brick_length = 25
brick_wide = 15

rect_length = 100
rect_wide = 5

window_length = 400                                                           
window_wide = 250

move_x = 8                                                                   
move_y = 8

radius = 10

score=0
over_sign=0
win_sign=0
frequency=0

ball_color=(240,240,240)

k_counter = 0

state = []

game_window = pygame.display.set_mode((window_length,window_wide))
def rectmove():
    mouse_x , _ = pygame.mouse.get_pos()
    pygame.draw.rect(game_window,(255,255,255),((mouse_x-rect_length//2),(window_wide-rect_wide),rect_length,rect_wide))
 
def ballready():                                                                        
    pygame.draw.circle(game_window,ball_color,(ball_x,ball_y),radius)            #绘制球

def ball_window(): 
    global move_x
    global move_y   #球与窗口边框的碰撞检测
    if ball_x <= radius or ball_x >= (window_length-radius):        
        move_x = -move_x
    if ball_y <= radius:
        move_y = -move_y

def ball_rect():       #球与球拍的碰撞检测    
    collision_sign_x = 0        #定义碰撞标识
    collision_sign_y = 0
    global k_counter
    global move_x
    global move_y
    global distance
    mouse_x , _ = pygame.mouse.get_pos()
    if ball_x < (mouse_x-rect_length//2):
        closestpoint_x = mouse_x-rect_length//2
        collision_sign_x = 1
    elif ball_x > (mouse_x+rect_length//2):
        closestpoint_x = mouse_x+rect_length//2
        collision_sign_x = 2
    else:
        closestpoint_x = ball_x
        collision_sign_x = 3
    if ball_y < (window_wide-rect_wide):
        closestpoint_y = (window_wide-rect_wide)
        collision_sign_y = 1
    elif ball_y > window_wide:
        closestpoint_y = window_wide
        collision_sign_y = 2
    else:
        closestpoint_y = ball_y
        collision_sign_y = 3
        #定义球拍到圆心最近点与圆心的距离
    distance = math.sqrt(math.pow(closestpoint_x-ball_x,2)+math.pow(closestpoint_y-ball_y,2))
        #球在球拍上左、上中、上右3种情况的碰撞检测
    if distance < radius and collision_sign_y == 1 and (collision_sign_x == 1 or collision_sign_x == 2):
        if collision_sign_x == 1 and move_x > 0:
            move_x = - move_x
            move_y = - move_y
        if collision_sign_x == 1 and move_x < 0:
            move_y = - move_y
        if collision_sign_x == 2 and move_x < 0:
            move_x = - move_x
            move_y = - move_y
        if collision_sign_x == 2 and move_x > 0:
            move_y = - move_y
    if distance < radius and collision_sign_y == 1 and collision_sign_x == 3:
        move_y = - move_y    
    if distance < radius and collision_sign_y == 3:     #球在球拍左、右两侧中间的碰撞检测
        move_x = - move_x
        
    k_counter = k_counter + 1

def ballmove(): 
    global ball_x 
    global ball_y    
    global over_sign
    global frequency    
    global brick_list          #绘制球,设置反弹触发条件    
    pygame.draw.circle(game_window,ball_color,(ball_x,ball_y),radius)        
    ball_x += move_x
    ball_y -= move_y   #调用碰撞检测函数
    ball_window()
    ball_rect()
    if distance < radius:
        frequency += 1           #接球次数    
    if ball_y > 270:       #设置游戏失败条件
        over_sign = 1      

def record_brick_state():
    global brick_state
    global brick_list
    if ball_y == 203:
        brick_state = list(_flatten(brick_list))    #变为一维

ball_state = [0,0,0,0,0,0]
def record_ball_state():
    global ball_x
    global ball_y 
    global ball_state
    if ball_y == 203:
        ball_state[0] = ball_x*0.01
        ball_state[1] = ball_y*0.01
    if ball_y == 211:
        ball_state[2] = ball_x*0.01
        ball_state[3] = ball_y*0.01      
    if ball_y == 219:
        ball_state[4] = ball_x*0.01
        ball_state[5] = ball_y*0.01  

def calculate_score(brick_list):
    brick_num = 0
    global score
    for i in range(5):
        for j in range(12):
            brick_num = brick_num + brick_list[i][j]
    score = 60 - brick_num
#    print(score)
    
def brickarrange():
    global brick_length
    global brick_wide
    global score    
    global win_sign
    global brick_x
    global brick_y
    global distanceb
    global ball_x
    global ball_y  
    global brick_list_      #绘制砖块
    for i in range(5):
        for j in range(12):
            brick_x = j*(brick_length+5)
            brick_y = i*(brick_wide+5)+40
            if brick_list[i][j] == 1:                                                                              
                pygame.draw.rect(game_window,(255,255,255),(brick_x,brick_y,brick_length,brick_wide))                                        
                ball_brick()      #调用碰撞检测函数                        
                if distanceb < radius: 
                    brick_list[i][j] = 0      
    calculate_score(brick_list)       #设置游戏胜利条件
    if score == 60:
        win_sign = 1

def ball_brick():    
    global distanceb 
    global move_x
    global move_y         #球与砖块的碰撞检测
    collision_sign_bx = 0       #定义碰撞标识
    collision_sign_by = 0
    if ball_x < brick_x:
        closestpoint_bx = brick_x
        collision_sign_bx = 1
    elif ball_x > brick_x+brick_length:
        closestpoint_bx = brick_x+brick_length
        collision_sign_bx = 2
    else:
        closestpoint_bx = ball_x
        collision_sign_bx = 3

    if ball_y < brick_y:
        closestpoint_by = brick_y
        collision_sign_by = 1
    elif ball_y > brick_y+brick_wide:
        closestpoint_by = brick_y+brick_wide
        collision_sign_by = 2
    else:
        closestpoint_by = ball_y
        collision_sign_by = 3
                                                   #定义砖块到圆心最近点与圆心的距离
    distanceb = math.sqrt(math.pow(closestpoint_bx-ball_x,2)+math.pow(closestpoint_by-ball_y,2))
                                                                                #球在砖块上左、上中、上右3种情况的碰撞检测
    if distanceb < radius and collision_sign_by == 1 and (collision_sign_bx == 1 or collision_sign_bx == 2):
        if collision_sign_bx == 1 and move_x > 0:
            move_x = - move_x
            move_y = - move_y
        if collision_sign_bx == 1 and move_x < 0:
            move_y = - move_y
        if collision_sign_bx == 2 and move_x < 0:
            move_x = - move_x
            move_y = - move_y
        if collision_sign_bx == 2 and move_x > 0:
            move_y = - move_y
    if distanceb < radius and collision_sign_by == 1 and collision_sign_bx == 3:
            move_y = - move_y
                                            #球在砖块下左、下中、下右3种情况的碰撞检测
    if distanceb < radius and collision_sign_by == 2 and (collision_sign_bx == 1 or collision_sign_bx == 2):
        if collision_sign_bx == 1 and move_x > 0:
            move_x = - move_x
            move_y = - move_y
        if collision_sign_bx == 1 and move_x < 0:
            move_y = - move_y
        if collision_sign_bx == 2 and move_x < 0:
            move_x = - move_x
            move_y = - move_y
        if collision_sign_bx == 2 and move_x > 0:
            move_y = - move_y
    if distanceb < radius and collision_sign_by == 2 and collision_sign_bx == 3:
        move_y = - move_y    
    if distanceb < radius and collision_sign_by == 3:       #球在砖块左、右两侧中间的碰撞检测
        move_x = - move_x

while True:
    brick_list = [[1,1,1,1,1,1,1,1,1,1,1,1],
               [1,1,1,1,1,1,1,1,1,1,1,1],
               [1,1,1,1,1,1,1,1,1,1,1,1],
               [1,1,1,1,1,1,1,1,1,1,1,1],
               [1,1,1,1,1,1,1,1,1,1,1,1]]
    score=0
    win_sign=0
    frequency=0
    over_sign=0    
    mouse_x , _= pygame.mouse.get_pos()
    ball_x=mouse_x
    ball_y = window_wide-rect_wide-radius
    while True:
        game_window.fill((111,111,111))
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
        rectmove()  
        ballmove()
        brickarrange()
        record_brick_state()
        record_ball_state()
        if ball_state[1] !=0:
            if ball_state[3] !=0:
                if ball_state[5] !=0:
                    state = brick_state + ball_state
                    ball_state =[0,0,0,0,0,0]
                    print(state)
        if over_sign == 1:
            break
        if win_sign == 1:
            break
        pygame.display.update()
        time.sleep(0.06)

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

6

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

28

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

12

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

35

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

8

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

5

2026.01.15

php图片上传教程汇总
php图片上传教程汇总

本专题整合了php图片上传相关教程,阅读专题下面的文章了解更多详细教程。

2

2026.01.15

phpstorm相关教程大全
phpstorm相关教程大全

本专题整合了phpstorm相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 1万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号