摘要:
编写了一个掷骰子的程序,主要通过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=0def move(self):self.SpinStatus+=1if self.SpinStatus==3:self.SpinStatus=0

首先加载一张骰子的图片,diceRect描述了骰子矩形的位置(根据窗口大小设定在窗口的正中间)diceSpin是骰子转动时的三张截图,轮流播放这三张图片,即可产生转动的效果。diceStop是骰子停止转动后的六种状态。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,600screen = pygame.display.set_mode(size)clock = pygame.time.Clock()BoTTon=BoTTon()Dice=Dice()background = pygame.image.load("background.jpg")stop=Falsestart=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=Truestop=Falseif event.type == pygame.MOUSEBUTTONDOWN and 200 <= event.pos[0] <= 400 and 8 <= event.pos[1] <= 121:stop = Truestart=FalseDice.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游戏编程。

用python编写一个掷骰子的小程序相关推荐

  1. 用python编写一个处理报文的小程序

    最近用python编写了一个处理报文的小程序,最后保存成.txt格式. 主要内容非常简单,介绍如下: 1.报文内容如下所示,比较乱,因为要输入到matalab中进行仿真验证,因此,需要将里面的'\n' ...

  2. 用python编写一个猜年龄的小程序-用Python来写一个男女相亲小程序|码农的情人节...

    功能: 你输入你的性别,年龄,生日,我程序就给匹配一下你喜欢的类型,下面我们具体来讲讲怎么用Python写 第一部分:用户输入部分 1.获取用户的输入:我们用raw_input() args =raw ...

  3. 用python编写一个猜年龄的小程序-知道了这个,你也能写出 Python 趣味小程序

    原标题:知道了这个,你也能写出 Python 趣味小程序 前两天在 51CTO 看见某篇推荐博文,大概是一个 豆子比较感兴趣,在知乎和 github 上搜索了相关的源代码,发现原来实现起来非常的简单, ...

  4. 【六一特别文章】Python编写一个六一儿童节问答小游戏及趣味比赛

    随着六一儿童节的到来,我们可以为孩子们编写一个有趣的小游戏,让他们在游戏中学习有关六一儿童节的知识.本文将介绍如何用Python编写一个六一儿童节问答小游戏及趣味比赛. 首先,我们需要准备一些有关六一 ...

  5. python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例

    Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...

  6. 能不能用python开发qq_用Python写一个模拟qq聊天小程序的代码实例

    用Python写一个模拟qq聊天小程序的代码实例 发布时间:2020-09-09 07:49:29

  7. 用Python写一个模拟qq聊天小程序的代码实例

    前言 今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 Python 超简单的聊天 ...

  8. python美元汇率兑换程序代码_还可以这样玩?用Python完成一个在线汇率转换小程序...

    原标题:还可以这样玩?用Python完成一个在线汇率转换小程序 大家好,小数在这里给大家拜个早年啦 今天给大家分享的是用Python完成一个在线汇率转换小程序,是基于一个持续更新的汇率网站实现的,让我 ...

  9. python编写一个软件-软件代做:利用Python编写一个行业专用的小计算器

    前言:本文讲述的是如何利用python编程制作一个适用于指定行业的计算器,方便计算结果,涵盖的知识点由Python编写GUI界面程序,利用爬虫采集实时的汇率数据,将Python文件打包成可以单独运行的 ...

最新文章

  1. LeetCode实战:整数反转
  2. 对象级别锁 vs 类级别锁 – Java
  3. excel导入mysql语句_求助:用SQL语句从Excel将数据导入到SQL数据库
  4. 设计模式之-观察者模式(Observer Design Pattern)
  5. Pytorch自定义Dataset和DataLoader去除不存在和空的数据
  6. 基于PyTorch重写sklearn,《现代大数据算法》
  7. Django-你想知道的都在这里
  8. 如何维持手机电池寿命_手机电池不耐用,都怪这些充电坏毛病
  9. java删除数组里的两个_java – 如何从两个数组列表中删除常用值
  10. 4----apache主配置文件模板和基于域名虚拟主机配置文件模板
  11. 洛谷 P2578 [ZJOI2005]九数码游戏【bfs+康托展开】
  12. python笔记2-冒泡排序
  13. [Python]将Excel文件中的数据导入MySQL
  14. 太牛了! GitHub大牛呕心沥血整理的5000页Java学习手册文档
  15. 使用GDI来绘制简易验证码
  16. android系统程序卸载,怎样卸载Android系统程序
  17. python 把京东订单,推送到测试环境,提供便利
  18. Compose版来啦!仿自如裸眼3D效果
  19. c# 操作word光标
  20. python 的 return 详解

热门文章

  1. 视频如何用软件制作字幕?推荐这款专业性强的软件
  2. Python:六、字典dict,元组tuple与集合set的使用
  3. PIXYZ Studio Workflow
  4. MySQL数据库面试题(2021最新版)
  5. 上海web前端培训选哪家?怎么选?
  6. 使用skyeye运行《Linux设备驱动开发详解》的实例
  7. Manacher(马拉车算法)
  8. 关于重装完系统以后引导出错导致电脑无法开机的问题(File:\EFI\Microsoft\Boot\BCD,Error code:0xc000000f)
  9. (js)模板字符串中使用循环遍历数据:
  10. 腊八遇上大寒,要过年啦!