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)  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python Pygame实战在打砖块游戏的实现

    目录 导语 开发工具 环境搭建 效果展示 原理简介 导语 想起来好久没更这个系列的文章了,周末过来补一波好了.本期我们将利用python制作一个打砖块小游戏,废话不多说,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 效果展示 在cmd窗口运行Game18.py文件即可. 效果如下: 视频链接 原理简介 游戏规则(摘自维基百科): 打砖块是一

  • python实现打砖块游戏

    本文实例为大家分享了Python实现打砖块游戏的具体代码,供大家参考,具体内容如下 #导入模块 import pygame from pygame.locals import * import sys,random,time,math class GameWindow(object): '''创建游戏窗口类''' def __init__(self,*args,**kw): self.window_length = 600 self.window_wide = 500 #绘制游戏窗口,设置窗口尺

  • Python Pygame实战之打砖块小游戏

    目录 导语 一.准备中 1)游戏规则: 2)环境安装 二.开始敲代码 1)配置文件 2)定义一些类 3)定义开始.结束界面 4)定义游戏 5)主函数与运行界面 三.效果展示 导语 嘿!前不久刚刚给大家过一款反弹球的小游戏嘛! 不知道大家还记得不?不记得可以看下往期的内容呢,在上一期的基础上升级了这款打砖块的小游戏,界面的话也挺简单的,经典配色原汁原味哈哈哈. 大家好,我是木木子,一个上的编程下的厅堂的女码农!今天带大家编写一款经典的打砖块儿小游戏! 小科普: 打砖块最早是由雅达利公司开发的一款独

  • Python实现打砖块小游戏代码实例

    这次用Python实现的是一个接球打砖块的小游戏,需要导入pygame模块,有以下两条经验总结: 1.多父类的继承2.碰撞检测的数学模型 知识点稍后再说,我们先看看游戏的效果和实现: 一.游戏效果 二.游戏代码 #导入模块 import pygame from pygame.locals import * import sys,random,time,math class GameWindow(object): '''创建游戏窗口类''' def __init__(self,*args,**kw

  • 用python实现打砖块小游戏

    本文实例为大家分享了python实现打砖块小游戏的具体代码,供大家参考,具体内容如下 开发益智的打砖块小游戏,你可以试一下能打几块 import pygame,sys,time,random from pygame.locals import *        # from static_params import *   #引入所有静态参数 from GameClass import * pygame.init()   #初始化游戏 mainclock = pygame.time.Clock(

  • 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 imp

  • Python Pygame实战之打砖块游戏的实现

    目录 导语 开发工具 环境搭建 效果展示 原理简介 导语 想起来好久没更这个系列的文章了,周末过来补一波好了.本期我们将利用python制作一个打砖块小游戏,废话不多说,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 效果展示 在cmd窗口运行Game18.py文件即可. 效果如下: 视频链接 原理简介 游戏规则(摘自维基百科): 打砖块是一

  • python pygame模块编写飞机大战

    本文实例为大家分享了python pygame模块编写飞机大战的具体代码,供大家参考,具体内容如下 该程序没有使用精灵组,而是用列表存储对象来替代精灵组的动画效果.用矩形对象的重叠来判断相撞事件.该程序可以流畅运行,注释较为详细,希望可以帮助大家. import pygame from pygame.locals import * from sys import exit import time import random # 创建子弹类,把子弹的图片转化为图像对象,设定固定的移动速度 clas

  • python+pygame实现坦克大战

    本文实例为大家分享了python+pygame实现坦克大战的具体代码,供大家参考,具体内容如下 一.首先导入pygame库 二.源码分享 #coding=utf-8 import pygame import time import random from pygame.sprite import Sprite SCREEN_WIDTH=800 SCREEN_HEIGHT=500 BG_COLOR=pygame.Color(0,0,0) TEXT_COLOR=pygame.Color(255,0,

  • python+pygame简单画板实现代码实例

    疑问:pygame已经过时了吗? 过没过时不知道,反正这玩意官方已经快四年没有更新了.用的人还是蛮多的(相对于其他同类项目),不过大家都是用来写写小东西玩一玩,没有人用这个做商业项目.pygame其实就是SDL的python绑定,SDL又是基于OpenGL,所以也有人用pygame+pyOpenGL做3D演示什么的.真的要写游戏的话pygame的封装比较底层,不太够用,很多东西都要自己实现(当然自由度也高).文档也不太好,好在前人留下了很多文章.拿来练手倒是很不错的选择,可以用来实践很多2D游戏

  • python pygame实现球球大作战

    本文实例为大家分享了python pygame球球大作战的具体代码,供大家参考,具体内容如下 球球大作战:(大球吃小球,代码如下:) from random import randint,randrange import pygame from math import sqrt,pi class Ball(object): def __init__(self, center, color, radius, sx, sy): self._center = center self._color =

  • Python pygame绘制文字制作滚动文字过程解析

    这篇文章主要介绍了Python pygame绘制文字制作滚动文字过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字体常用的不是很多,在pygame中大多用于提示文字,或者记录分数等事件. 字体绘制基本分为以下几个步骤: 初始化字体模块 pygame.init() 创建一个字体对象 可以从文件或者系统内字体选取 pygame.font.SysFont('幼圆',50) 绘制文本对象. a.render("测试字体",True,(

  • python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)

    python+pygame实现坦克大战小游戏-可以自定义子弹速度: 运行环境–python3.7.pycharm: 源码需要请:点赞留言邮箱: 正常版子弹速度: 普通速度版 加速版子弹速度: 子弹加速版 另外还有多种道具,支持两人一起玩.main()方法如下: def main(): pygame.init() pygame.mixer.init() resolution = 630, 630 screen = pygame.display.set_mode(resolution) pygame

随机推荐