python?pygame實現(xiàn)打磚塊游戲
本文實例為大家分享了python pygame實現(xiàn)打磚塊游戲的具體代碼,供大家參考,具體內(nèi)容如下
最近在嘗試著寫一個用強(qiáng)化學(xué)習(xí)的方法玩打磚塊的游戲,首先將游戲環(huán)境做些改動,以便產(chǎn)生需要的數(shù)據(jù)
游戲環(huán)境的界面以及代碼如下

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? ? ? ? #定義碰撞標(biāo)識 ? ? 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 ?? ??? ?#定義球拍到圓心最近點(diǎn)與圓心的距離 ? ? 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:? ? ?#球在球拍左、右兩側(cè)中間的碰撞檢測 ? ? ? ? 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? ? ? ? ? #繪制球,設(shè)置反彈觸發(fā)條件?? ? ? ? pygame.draw.circle(game_window,ball_color,(ball_x,ball_y),radius)?? ??? ? ? ? ball_x += move_x ? ? ball_y -= move_y? ?#調(diào)用碰撞檢測函數(shù) ? ? ball_window() ? ? ball_rect() ? ? if distance < radius: ? ? ? ? frequency += 1? ? ? ? ? ?#接球次數(shù)?? ? ? ? if ball_y > 270:? ? ? ?#設(shè)置游戲失敗條件 ? ? ? ? over_sign = 1 ? ? ? def record_brick_state(): ? ? global brick_state ? ? global brick_list ? ? if ball_y == 203: ? ? ? ? brick_state = list(_flatten(brick_list)) ? ?#變?yōu)橐痪S 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()? ? ? #調(diào)用碰撞檢測函數(shù)?? ??? ??? ??? ??? ??? ? ? ? ? ? ? ? ? ? if distanceb < radius:? ? ? ? ? ? ? ? ? ? ? brick_list[i][j] = 0?? ? ? ? ? calculate_score(brick_list)? ? ? ?#設(shè)置游戲勝利條件 ? ? if score == 60: ? ? ? ? win_sign = 1 def ball_brick(): ? ? ? ? global distanceb? ? ? global move_x ? ? global move_y? ? ? ? ?#球與磚塊的碰撞檢測 ? ? collision_sign_bx = 0? ? ? ?#定義碰撞標(biāo)識 ? ? 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 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#定義磚塊到圓心最近點(diǎn)與圓心的距離 ? ? 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:? ? ? ?#球在磚塊左、右兩側(cè)中間的碰撞檢測 ? ? ? ? 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) ?
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python 遠(yuǎn)程開關(guān)機(jī)的方法
這篇文章主要介紹了Python 遠(yuǎn)程開關(guān)機(jī)的方法,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-11-11
python UDF 實現(xiàn)對csv批量md5加密操作
這篇文章主要介紹了python UDF 實現(xiàn)對csv批量md5加密操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Python的Django框架中的select_related函數(shù)對QuerySet 查詢的優(yōu)化
這篇文章主要介紹了Python的Django框架中的select_related函數(shù)對QuerySet查詢的優(yōu)化,以減少數(shù)據(jù)庫的查詢次數(shù)為目的,需要的朋友可以參考下2015-04-04
python使用paramiko實現(xiàn)遠(yuǎn)程拷貝文件的方法
這篇文章主要介紹了python使用paramiko實現(xiàn)遠(yuǎn)程拷貝文件的方法,分析了paramiko庫的安裝以及遠(yuǎn)程下載文件的實現(xiàn)技巧,需要的朋友可以參考下2016-04-04
15款Python編輯器的優(yōu)缺點(diǎn),別再問我“選什么編輯器”啦
這篇文章主要介紹了15款Python編輯器的優(yōu)缺點(diǎn),別再問我“選什么編輯器”啦,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-10-10
python實現(xiàn)監(jiān)控linux性能及進(jìn)程消耗性能的方法
這篇文章主要介紹了python實現(xiàn)監(jiān)控linux性能及進(jìn)程消耗性能的方法,需要的朋友可以參考下2014-07-07

