简易打砖块游戏源代码

你好,请进入Q群:225792826,免费下载本站最新提供的视频教程原创源码资料,从2020年2月20号到3月底,成为本站会员只要原价的3折,即2980元*0.3 = 894元 ,向微信scratch8付款即可成为本站会员。即可拥有本站所有原创资源,并提供技术支持。如本消息修改,以最后时间的为准。


这是一个完整的打砖块小游戏,有封面.小球类从ball模块导入,砖块类从brick模块导入。
下面是部分代码预览:

"""
   打砖块小游戏.py
   按方向箭头或用鼠标指针拖曳拦板去接小球,按回车键开始游戏.
   brick.py和ball.py模块在下面。
"""

from ball import * 
from brick import *
from time import sleep
from random import randint,choice
       
def start_game(screen,writer ):
    """生成拦板,绑定按键,小球和砖块,让小球不断移动。"""
    
    screen.onkeypress(move_to_right,"Right")# 绑定右方向箭头
    screen.onkeypress(move_to_left,"Left")  # 绑定左方向箭头
    board.ondrag(lambda x,y:board.setx(x))  # 绑定拖动事件

    all_balls = [Ball() for i in range(2)]  # 生成两个球
    rows  = 4
    cols = 6
    Brick.amounts = rows * cols             # 类变量,砖块所有数量
    startpos = (-120,160)                   # 所有砖块的起点坐标

          
def main():
    """新建屏幕,显示标题,按回车键开始游戏"""
    title = "打砖块小游戏"
    width,height = 480,360
    screen = Screen()                        # 新建屏幕
    screen.delay(0)                          # 延时为0
    screen.bgcolor("black")                  # 背景为黑
    screen.title(title)                      # 标题为title
    screen.setup(width,height)               # 设定宽高

    screen.listen()                          # 监听屏幕(设置焦点) 
    screen.mainloop()                        # 进入主循环
    
if __name__ == "__main__":

    main() 
  

 
如需要查看完整源代码,请扫码付款:

VIP免费查看

已有0人支付

"""
   打砖块小游戏.py
   按方向箭头或用鼠标指针拖曳拦板去接小球,按回车键开始游戏.
   brick.py和ball.py模块在下面。
"""

from ball import * 
from brick import *
from time import sleep
from random import randint,choice
       
def start_game(screen,writer ):
    """生成拦板,绑定按键,小球和砖块,让小球不断移动。"""
    writer.clear()                       # 按回车键后清除所写的标题
    screen.onkeypress(None,"Return")     # 取消回车键事件绑定
    screen.bgcolor("white")              # 重设背景色为白
    height = screen.window_height()      # 得到屏幕高度
    board  = Turtle(shape = 'square')    # 新建形状为square的方形体
    board.shapesize(1,10)                # 长方形的长度为200x20像素     
    board.penup()                        # 抬笔
    board.color("blue")                  # 设颜色
    board.sety(50-height/2)              # 把拦板y坐标定位
    def move_to_right():
        board.setx(board.xcor() + 10)    # x坐标右移10个单位        
    def move_to_left():
        board.setx(board.xcor() - 10)    # x坐标左移10个单位        
    
    screen.onkeypress(move_to_right,"Right")# 绑定右方向箭头
    screen.onkeypress(move_to_left,"Left")  # 绑定左方向箭头
    board.ondrag(lambda x,y:board.setx(x))  # 绑定拖动事件

    all_balls = [Ball() for i in range(2)]  # 生成两个球
    rows  = 4
    cols = 6
    Brick.amounts = rows * cols             # 类变量,砖块所有数量
    startpos = (-120,160)                   # 所有砖块的起点坐标
    for r in range(rows):                   # 一行一行的排砖块
        for c in range(cols):               # 一行之中的每一块砖
            x = startpos[0] + c * 50        # 设定x坐标
            y = startpos[1] - r * 40        # 设定y坐标
            Brick('magenta',(x,y),all_balls)# 生成砖块   
    while True:
        for ball in all_balls:
            if ball.isvisible():ball.move(board)
            screen.update()
            sleep(0.01)
          
def main():
    """新建屏幕,显示标题,按回车键开始游戏"""
    title = "打砖块小游戏"
    width,height = 480,360
    screen = Screen()                        # 新建屏幕
    screen.delay(0)                          # 延时为0
    screen.bgcolor("black")                  # 背景为黑
    screen.title(title)                      # 标题为title
    screen.setup(width,height)               # 设定宽高
    
    w = Turtle(visible=False)                # 用来写标题的海龟
    w.color("cyan")                          # 颜色为青色
    w.penup()                                # 抬笔
    w.write(title,align='center',font=("楷体",32,"normal"))
    w.sety(-100)                             # 下移100个单位
    w.color("gray")                          # 颜色为灰色
    w.write("按回车键开始",align='center',font=("黑体",12,"normal"))   

    # 绑定回车到匿名函数
    screen.onkeypress(lambda:start_game(screen,w),"Return") 
    screen.listen()                          # 监听屏幕(设置焦点) 
    screen.mainloop()                        # 进入主循环
    
if __name__ == "__main__":

    main() 
  

brick.py模块的源代码:

"""
   brick.py
   本程序定义Brick类,每个砖块都能访问所有小球。
   当一个砖块实例化后,它会不断地遍历小球以便检测有没有碰到小球。
   
"""

from turtle import *

class Brick(Turtle):
    counter = 0             # 类变量,统计消失的砖块数量
    def __init__(self,color,position,balls):
        """color:颜色,position:坐标,balls:所有球"""
        Turtle.__init__(self,shape='square',visible=False)
        self.penup()                              # 抬笔
        self.goto(position)                       # 定位
        self.color(color)                         # 颜色
        self.balls = balls                        # 所有的小球
        self.shapesize(1,2)                       # 变形
        p = self.get_shapepoly()                  # 得到顶点坐标
        self.width = p[1][1] - p[3][1]            # 宽度
        self.height = p[0][0] - p[2][0]           # 高度
        self.left = self.xcor() - self.width//2   # 重定义left
        self.right = self.xcor() + self.width//2  # 重定义right
        self.top = self.ycor() + self.height//2   # 砖块最顶y坐标
        self.bottom = self.ycor() - self.height//2# 砖块最底y坐标
        self.balls_index = 0                      # 所有球的索引号
        self.balls_amounts = len(balls)           # 所有球的数量
        self.st()                                 # 显示
        self.bump_check()
        
    def bump_check(self):
        """轮换对每个小球进行碰撞检测"""
        if self.isvisible():                      # 如果自己是可见的
            ball = self.balls[self.balls_index]   # 从索引号取一个球
            ball_left = ball.xcor() - 10          # 弹球最左x坐标
            ball_right = ball.xcor() + 10         # 弹球最右x坐标
            ball_top = ball.ycor() + 10           # 弹球最上y坐标
            ball_bottom = ball.ycor() - 10        # 弹球最下y坐标
            c1 = ball_right < self.left   # 弹球最右x小于砖块最左x
            c2 = ball_left > self.right   # 弹球最左x大于砖块最右x
            c3 = ball_top < self.bottom   # 弹球最上y小于砖块最底y
            c4 = ball_bottom  > self.top  # 弹球最底y大于砖块最顶y
            separated = c1 or c2 or c3 or c4 # 有一个成立则碰不到
            if not separated :               # 如果碰到了
                self.ht()                    # 隐藏自己
                ball.dy = -ball.dy           # 球的垂直速度取反
                Brick.counter +=1            # 类变量计数器加1
                # 数量相等,则游戏结束
                if Brick.counter == Brick.amounts :   
                   info = "游戏成功结束!"
                   ziti = (None,24,'normal')
                   tmper = Turtle(visible=False)
                   tmper.write(info,align='center',font=ziti)
                   bye_bye = lambda x,y:tmper.screen.bye()
                   tmper.screen.onclick(bye_bye)
            self.balls_index +=1          # 下一个球
            self.balls_index = self.balls_index % self.balls_amounts
            self.screen.ontimer(self.bump_check,10)

if __name__ == "__main__":

    pass  


ball.py模块的源代码:

"""
   ball.py
   此模块定义Ball类。
   小球碰到边缘和拦板都会反弹。
"""
from turtle import *
from random import *

class Ball(Turtle):    
    def __init__(self):
        """初始化方法"""
        Turtle.__init__(self,shape='circle')
        self.penup()                            # 抬笔
        self.color("red")                       # 颜色
        sd = [-6,-5,-4,-3,-2,-1,1,2,3,4,5,6]
        self.dx = choice(sd)                    # 水平速度
        self.dy = choice(sd)                    # 垂直速度
        self.sw = self.screen.window_width()    # 屏幕宽度
        self.sh = self.screen.window_height()   # 屏幕高度

    def move(self,board):
        """移动方法"""
        x = self.xcor() + self.dx     # 水平方向移动
        y = self.ycor() + self.dy     # 垂直方向移动
        self.goto(x,y)
        # 超过屏幕左右边界,水平速度取反
        if abs(x) > self.sw//2 : self.dx = -self.dx
        
        # 超过屏幕上边界,垂直速度取反
        if y > self.sh//2: self.dy = -self.dy        
        if y < -self.sh//2: self.ht() # 超过下边界就隐藏
        if self.bump(board):
            self.dy = -self.dy        # 碰到拦板y速度反向

    def bump(self,board):
        """碰到拦板,(板子的长度是200)"""
        x = self.xcor()            # 球中心点的x坐标
        y = self.ycor() - 10       # 球的半径是10,
        left = board.xcor() - 100  # 拦板最左边x坐标
        right = board.xcor() + 100 # 拦板最右边x坐标
        top = board.ycor()  + 10   # 拦板最顶y坐标
        bottom = board.ycor() - 10 # 拦板最顶y坐标
        return x < right and x > left and y < top and y > bottom

if __name__ == "__main__":

    pass

本站所有作品,教程等皆为原创,盗版必究。一旦付款,表示同意本站知识付费原则:数字商品,不支持退款。亦可直接向微信号scratch8付款购买。QQ群免费教学群:225792826 (提供真实姓名可入群)
李兴球的博客_Python创意编程技术前沿 » 简易打砖块游戏源代码

学本领,探索更大的世界!

李兴球博客 风火轮编程主页