100个python算法超详细讲解:掷骰子

  • Post author:
  • Post category:python


【100个python算法超详细讲解】@



谷歌学术

1.问题描述

骰子是一个有6个面的正方体,每个面分别印有1~6个小圆点代表点

数。假设这个游戏的规则是两个人轮流掷骰子6次,并将每次投掷的点数累

加起来,点数多者获胜,点数相同则为平局。

要求编写程序模拟这个游戏的过程,并求出玩100盘之后谁是最终的获

胜者。

2.问题分析

由于每个人掷骰子所得到的点数是随机的,所以需要借助随机数发生

器,每次产生一个1~6之间的整数,以此模拟玩者掷骰子的点数。

要得到6个不同的随机值,只需要调用Python的random模块提供的

random.randint()函数即可,这里为random.randint(1,6)。

为了计算在每盘中?、乙两人所掷的点数,需要定义两个变量d1和

d2,用于记录每个人投掷点数的累加和。

为了记录每个人的获胜盘数,需要再定义两个变量c1和c2,用于记录

每个人获胜的盘数。

3.程序框架

程序流程图如图7.13所示。

4.完整的程序

根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 掷骰子
import random
import time
if __name__ == "__main__":
# c1和c2分别记录两个人的获胜盘数
c1 , c2 = 0, 0
print("两人开始掷骰子100次:")
for i in range(1, 101): # 100盘
d1 , d2 = 0, 0 # d1和d2分别记录两个人投掷点数的累加和
for j in range(1, 7): # 两个人轮流掷骰子
d1 = d1 + random.randint(1, 6) # 第一个人所掷骰子点数总和
d2 = d2 + random.randint(1, 6) # 第二个人所掷骰子点数总和
if d1 > d2:
c1 += 1 # 累加获胜盘数
else:
if d1 < d2:
c2 += 1
print("等待结果......")
time.sleep(5)
print("100次之后,获胜者是:")
if c1 > c2: # 输出最终获胜者信息
print("第一个人获胜!")
else:
if c1 < c2:
print("第二个人获胜!")
else:
print("两人平局!")

5.运行结果

在PyCharm下运行程序,结果如图7.14所示。

6.补充知识点

在程序中,我们引入了一个新的模块time,并使用了time模块提供的

sleep()函数,该函数是让程序休眠一段时间,这里是5秒。下面我们具体介

绍time模块。

time模块提供了各种与时间相关的函数。下面介绍部分常用的函数。

(1)time.time()→float

time.time()函数返回浮点数的seconds since the epoch。epoch的具体日期

和leap seconds的处理取决于平台。在Windows和大多数UNIX系统上,

epoch是1970年1月1日00:00:00(UTC),并且闰秒不计入seconds since the

epoch。这通常被称为UNIX time。

(2)time.time_ns()→int

time.time_ns()函数的用法与time()相似,但该函数返回是以纳秒为单位

的自epoch以来的整数时间。

(3)time.thread_time()→float

time.thread_time()函数返回当前线程的系统和用户CPU时间之和的值

(以小数秒为单位)。它不包括睡眠期间经过的时间。根据定义,它是特

定于线程的。返回值的参考点未定义,因此只有同一线程中连续调用结果

之间的差异才有效。

(4)time.thread_time_ns()→int

time.thread_time_ns()函数的用法与thread_time()相似,但该函数返回的

是以纳秒为单位的时间。

(5)time.asctime([t])

time.asctime([t])函数用于转换一个元组或struct_time表示的时间,由

gmtime()函数或localtime()函数返回的字符串为’Sun Jun 20 23:21:05 1993’。

如果未提供t,则使用由localtime()函数返回的当前时间。区域信息不被函

数asctime()使用。

(6)time.clock()

在UNIX平台上,time.clock()函数将当前处理器时间返回为以秒为单位

的浮点数。

(7)time.pthread_getcpuclockid(thread_id)

time.pthread_getcpuclockid(thread_id)函数返回指定的thread_id的特定于

线程的CPU时间时钟的clk_id。

(8)time.clock_getres(clk_id)

time.clock_getres(clk_id)函数返回指定时钟clk_id的分辨率(精度)。

(9)time.clock_gettime(clk_id)→float

time.clock_gettime(clk_id)函数返回指定时钟clk_id的时间。

(10)time.clock_gettime_ns(clk_id)→int

time.clock_gettime_ns(clk_id)函数的用法与clock_gettime()相似,但该

函数是以纳秒的单位返回时间的。

(11)time.clock_settime(clk_id,time:float)

time.clock_settime(clk_id,time:float)函数设置指定时钟clk_id的时间。目

前,CLOCK_REALTIME是clk_id唯一可接受的值。

(12)time.clock_settime_ns(clk_id,time:int)

time.clock_settime_ns(clk_id,time:int)函数的用法与clock_settime()相

似,但该函数是以纳秒的形式设置时间的。

(13)time.ctime([secs])

time.ctime([secs])函数将自seconds since the epoch表示的时间转换为表

示本地时间的字符串。如果未提供secs或为None,则使用由time()返回的当

前时间。ctime(secs)相当于asctime(localtime(secs))。区域信息不被ctime()使

用。

(14)time.get_clock_info(name)

time.get_clock_info(name)函数获取有关指定时钟的信息作为命名空间

对象。

(15)time.process_time()→float

time.process_time()函数返回当前进程的系统和用户CPU时间总和的值

(以小数秒为单位)。

(16)time.process_time_ns()→int

time.process_time_ns()函数的用法与process_time()相似,但该函数是以

纳秒的形式返回时间的。

(17)time.sleep(secs)

time.sleep(secs)函数用于暂停执行调用线程达到给定的秒数。参数可以

是浮点数,以指示更精确的睡眠时间。

(18)time.strftime(format[,t])

time.strftime(format[,t])函数用于转换一个元组或struct_time表示的由

gmtime()函数或localtime()函数返回的时间到由format参数指定的字符串。

如果未提供t,则使用由localtime()函数返回的当前时间。format必须是一个

字符串。如果t中的任何字段超出允许范围,则引发ValueError。

strftime(“%a,%d,%b,%Y,%H:%M:%S+0000”,gmtime())

其中0是时间元组中任何位置的合法参数;如果format参数通常是非法

的,则该值被强制改为正确的值。

(19)time.strptime(string[,format])

time.strptime(string[,format])函数根据格式解析表示时间的字符串。返

回值为一个被gmtime()函数或localtime()函数返回的struct_time。

format参数使用与strftime()函数相同的指令,默认为匹配ctime()函数返

回格式的”%a %b %d %H:%M:%S %Y”。

更多关于time模块相关的知识点,请读者自行查阅学习。



版权声明:本文为tysonchiu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。