# 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

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 ball_window():
global move_x
global move_y   #球與窗口邊框的碰撞檢測
move_x = -move_x
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          #繪制球，設置反彈觸發條件
ball_x += move_x
ball_y -= move_y   #調用碰撞檢測函數
ball_window()
ball_rect()
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 = ball_x*0.01
ball_state = ball_y*0.01
if ball_y == 211:
ball_state = ball_x*0.01
ball_state = ball_y*0.01
if ball_y == 219:
ball_state = ball_x*0.01
ball_state = 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()      #調用碰撞檢測函數
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
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 !=0:
if ball_state !=0:
if ball_state !=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)  ```