本文实例为大家分享了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实现打砖块游戏的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did92773