好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python pygame实现打砖块游戏

本文实例为大家分享了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实现打砖块游戏的详细内容...

  阅读:50次