用python编写一个掷骰子的小程序

摘要:
编写了一个掷骰子的程序,主要通过pygame模块实现了以下几点功能:1.每次点击开始键时,骰子都会转动起来。2.每次开始后点击停止键时,骰子停止并且随机停在1~6的某一个数字上。3.按下结束键,退出程序。成品结果请观看编写一个掷骰子的小程序结果演示视频。
在这里插入图片描述
第一节:
介绍
程序在PyCharm软件上编写,PyCharm为我们提供了很多python模块,并且可以很方便的对所需要的模块进行下载安装及使用。首先程序要界面上应该出现开始、停止、结束这三个按钮,当鼠标点击这些按钮时会出现对应的事件(用event type实现)。然后,要做到骰子旋转的效果,需要3张骰子在转动时的截图,利用人的视觉停留,制作出旋转的效果。最后按下停止键时,骰子需要停在1~6某一数字上,将用(random函数实现),所以需要骰子1~6的图片作为结果。
在这里插入图片描述
上图是完成程序所需要的图片文件,其中start、
stop、exit对应开始、停止、结束,三个按钮。
assets:(1~3)是骰子转动中的三张截图,图片来源于微
信骰子表情包截图。dice_(1~6)对应着骰子停止转动时
的6种状态。background是整个程序的背景。并且,为了保证画面的美观,将每类图片的大小预先调至一样大。

第二节:
pygame概述
pygame是跨平台的python模块,专为电子游戏设计(包含图像、声音),创建在SDL基础上,允许实时电子游戏研发而不被低级语言(如汇编语言)束缚。基于这一设想,所有需要的游戏功能和理念(主要图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言(如python)提供。

第三节:
搭建整体框架
首先引入程序所需要的三个模块。

import pygame
import random
import sys

为了在界面上显示三个按钮定义一个按钮类(class BoTTon)。

class BoTTon:
    def __init__(self):
        self.start=pygame.image.load("start_1.JPG")
        self.stop=pygame.image.load("stop_1.JPG")
        self.end=pygame.image.load("exit_1.JPG")
        self.startRect=self.start.get_rect().move(0,0)
        self.stopRect=self.stop.get_rect().move(200,8)
        self.endRect=self.end.get_rect().move(400,0)

pygame.image.load函数可以加载图片,picture.getrect().move(x,y)可以对所加载图片的矩形区域进行移动,用于之后用图片对矩形区域进行填充操作。所以开始、停止、结束的三个按钮对应于startRect,stopRect,endRect三个矩形区域。

对骰子进行定义,编辑一个骰子类(class Dice)。

class Dice:
    def __init__(self):
        self.dice = pygame.image.load("assets:3.JPG")
        self.diceRect = self.dice.get_rect().move(225, 225)
        self.diceSpin=[pygame.image.load("assets:3.jpg"),
                         pygame.image.load("assets:2.jpg"),
                         pygame.image.load("assets:1.jpg")]
        self.diceStop=[pygame.image.load("dice_1.jpg"),
                       pygame.image.load("dice_2.jpg"),
                       pygame.image.load("dice_3.jpg"),
                       pygame.image.load("dice_4.jpg"),
                       pygame.image.load("dice_5.jpg"),
                       pygame.image.load("dice_6.jpg")]
        self.StopStatus=random.randint(0,5)
        self.SpinStatus=0
    def move(self):
        self.SpinStatus+=1
        if self.SpinStatus==3:
            self.SpinStatus=0

首先加载一张骰子的图片,diceRect描述了骰子矩形的位置(根据窗口大小设定在窗口的正中间)diceSpin是骰子转动时的三张截图,轮流播放这三张图片,即可产生转动的效果。diceSpin是骰子停止转动后的六种状态。Spinstatus和StopStatus则描述了骰子当前的状态。move函数,是让骰子转动起来的函数,意指按顺序轮流播放旋转时的三张图片,达到骰子转动效果的美观。

对背景一进行定义

def creatmap1():
    screen.fill((0, 0, 0))
    screen.blit(background, (0, 0))
    screen.blit(BoTTon.start, BoTTon.startRect)
    screen.blit(BoTTon.stop, BoTTon.stopRect)
    screen.blit(BoTTon.end, BoTTon.endRect)
    if not stop and not start:
        pygame.display.update()

背景一即最开始的程序界面,用background填充窗口,并用screen.blit函数将开始、停止、结束三张图片填充到对应的位置if语句确保在既没有开始也没有停止的时候刷新窗口(即保持窗口)。

对背景二进行定义

def creatmap2():
    screen.fill((0,0,0))
    screen.blit(background,(0,0))
    screen.blit(BoTTon.start, BoTTon.startRect)
    screen.blit(BoTTon.stop, BoTTon.stopRect)
    screen.blit(BoTTon.end, BoTTon.endRect)
    screen.blit(Dice.diceSpin[Dice.SpinStatus],Dice.diceRect)
    Dice.move()
    if not stop and start:
        pygame.display.update()

背景二即骰子转动时的程序界面,仍然保持开始、停止、结束三个按钮,并将骰子转动时图片填入对应的矩形区域内,调用Dice.move函数让骰子转动起来。用if语句确保,在骰子开始转动,并且没有停止的情况下,保持窗口刷新。

对背景三进行定义

def creatmap3():
    screen.fill((0,0,0))
    screen.blit(background,(0,0))
    screen.blit(BoTTon.start, BoTTon.startRect)
    screen.blit(BoTTon.stop, BoTTon.stopRect)
    screen.blit(BoTTon.end, BoTTon.endRect)
    screen.blit(Dice.diceStop[Dice.StopStatus],Dice.diceRect)
    if stop and not start:
        pygame.display.update()

背景三即骰子停止转动时的系统界面,仍然保持开始、停止、结束三个按钮,并将骰子停止时的图片填入对应的矩形区域内。用if语句确保,在骰子停止转动,并且没有开始的情况下,窗口保持刷新。

第四节
实现小程序
在第一节中,我们提出了整个程序应该具有什么样的功能,并且做了一些前期准备。在第二节中,我们简单介绍了一下pygame模块帮助读者更好的理解程序的运行机制。在第三节中,我们用代码搭建了完备的整体框架比如按钮,骰子和骰子的状态。本节,我们将用代码实现小程序。

主程序:

if __name__=='__main__':
    pygame.init()
    size=width,height=600,600
    screen = pygame.display.set_mode(size)
    clock = pygame.time.Clock()
    BoTTon=BoTTon()
    Dice=Dice()
    background = pygame.image.load("background.jpg")
    stop=False
    start=False

首先用pygame.display.set_mode(size)产生窗口,定义pygame时钟(即循环频率)生成BoTTon类和Dice类的实例,设定开始和结束均为False(即最初界面)。

    while True:
        clock.tick(20)
        for event in pygame.event.get():
            if event.type==pygame.QUIT \
                    or (event.type == pygame.MOUSEBUTTONDOWN \
                    and 0 <= event.pos[1] <= 113 \
                    and 400 <= event.pos[0] <= 600):
                sys.exit()

开始循环,为视觉美观(避免骰子转动的过快)将clock.tick参数设置为20,当事件类型为退出窗口和点击结束按钮时,结束程序。

  if event.type == pygame.MOUSEBUTTONDOWN and 0 <= event.pos[0] <= 200 and 0 <= event.pos[1] <= 113:
                start=True
                stop=False
            if event.type == pygame.MOUSEBUTTONDOWN and 200 <= event.pos[0] <= 400 and 8 <= event.pos[1] <= 121:
                stop = True
                start=False
                Dice.StopStatus=random.randint(0,5)

当鼠标点击开始时,start变为True,stop变为False,当鼠标点击停止时,start变为False,stop变为True,并且对下一次骰子的停止状态StopStatus进行赋值,因要满足随机的条件,所以调用random.randint函数在1~6中随机生成一个整数。

        if not start and not stop:
            creatmap1()
        if start and not stop:
            creatmap2()
        if not start and stop:
            creatmap3()

    pygame.quit()

最后依据每种情况调用不同的背景函数即开始界面为背景一,骰子转动界面为背景二,骰子停止界面为背景三。

第五节
总结与未来
本次程序的不足之处在于代码不够简洁,有很多赘述。

亮点在于,每次点击停止时会随机生成下一次骰子的结果,体现骰子的随机性。

未来可以对程序进行优化,增加记录每次结果的功能,来验证大量试验后,每个结果产生的概率依概率收敛为1/6,不过个人感觉通过人为产生大量数据其实很没有必要,可以直接用matlab进行产生数据,并绘制图像,要比用python方便的多。

参考文献
张宏亮责任编辑 吉林大学出版社 《零基础学Python》第十三章 pygame游戏编程。

发布了1 篇原创文章 · 获赞 1 · 访问量 186

猜你喜欢

转载自blog.csdn.net/weixin_46373994/article/details/104441657