python pygame怎么实现打砖块游戏
游戏环境的界面以及代码如下
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 pygame怎么实现打砖块游戏的详细内容,更多请关注其它相关文章!
相关文章