PYTHON第三次实验"/>
PYTHON第三次实验
PYTHON第三次实验
实验3.1 设计和实现尼姆游戏(人机对战)
一、实验目的
- 理解尼姆游戏规则
- 了解多个函数的定义与调用
- 理解并熟练运行while循环
- 理解带else子句的循环结构执行流程
- 理解循环语句的break语句的作用
- 了解使用循环和异常处理结构对用户输入进行约束的用法
- 养成时刻注意各级代码缩进级别的习惯
二、实验内容
尼姆游戏是一个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
在聪明模式中,计算机每次拿走一定数量的物品使得堆的大小是2的幂次方减1—也就是2,7,15,31,63等。如果有一定数量的剩余物品,计算就随机拿走一些。
编写程序,模拟聪明版及非聪明版的尼姆游戏。并进行两种的比较及分析。给出聪明版比非聪明版的胜算结论。
三、实验步骤
(1)需要知道的函数以及用法
计算对数函数:math库中的log2(), log()函数等
python中的while else 语句的详细用法:
(45条消息) python中while。。。。else的用法_慕云-CSDN博客_python中while和else
以及try except语句的用法:
(45条消息) Python之异常(try的用法)_蓝七star的博客-CSDN博客_python try
assert断言函数的使用:
(45条消息) Python assert 断言函数_hunyxv的博客-CSDN博客_assert函数python
(2)代码设计思路
首先是先选择游戏模式,1为普通模式,2为聪明模式
普通模式和聪明模式的过程差不多,只是在电脑取数时会有不同
普通模式下,电脑随机选择处于[1, n//2]之间的数
def computer_getnormal(n):a = random.randint(1, int(n / 2))return a
聪明模式下,电脑尽可能选择能使剩下的数为2的幂次减1的数,也就是尽可能地使剩下的数为2,7,15,31,63等
def getnum(n):a = int(math.log2(n))target = pow(2, a) - 1get = n - targetreturn get
def computer_getsmart(n):a=getnum(n)if a>int(n/2):a=random.randint(1,int(n/2))return a
(3)总代码
import math
import randomdef getnum(n):a = int(math.log2(n))target = pow(2, a) - 1get = n - targetreturn getdef computer_getsmart(n):a=getnum(n)if a>int(n/2):a=random.randint(1,int(n/2))return adef computer_getnormal(n):a = random.randint(1, int(n / 2))return adef compusmart():n = random.randint(1, 100)while n>1:print('现在有{}个物品'.format(n))#from herewhile True:try:person=int(input("请你输入你要拿走的物件个数:"))assert 1<=person<=n//2breakexcept:print("请输入1到{}的数".format(n//2))#till heren = n - personif n==1:print('你赢啦!')breakelse:computernum=computer_getsmart(n)print('电脑取走{}个物品'.format(computernum))n=n-computernumprint('现在还有{}个物品'.format(n))else:print('你输啦!')def compunormal():n = random.randint(1, 100)while n>1:print('现在有{}个物品'.format(n))# from herewhile True:try:person = int(input("请你输入你要拿走的物件个数:"))assert 1 <= person <= n // 2breakexcept:print("请输入1到{}的数".format(n // 2))# till heren = n - personif n==1:print('你赢啦!')breakelse:computernum=computer_getnormal(n)print('电脑取走{}个物品'.format(computernum))n=n-computernumprint('现在还有{}个物品'.format(n))else:print('你输啦!')choice = int(input('1是普通模式,2是聪明模式,请选择游戏模式:'))
if choice == 1:print('-------------------普通模式---------------------')compunormal()
else:print('-------------------聪明模式---------------------')compusmart()
实验3.2 计算小明爬楼梯的爬法数量
一、 实验目的
- 理解并熟练使用序列解包
- 理解递归函数的工作原理
- 能够编写递归函数代码解决实际问题
- 理解Python字典的用法
- 养成检查和测试循环结构边界条件的习惯
- 养成时刻注意各级代码缩进级别的习惯
二、 实验内容
假设15个台阶,小明一步最多能上3个台阶。编写程序计算小明上这段楼梯一共有多少种方法。要求给出递推法和递归法两种实现代码。
F(n) = F(n-1) + F(n-2) + F(n-3)
F(1) = 1
F(2) = 2
F(3) = 4
三、实验步骤
递推:数学上的概念,主要指递推式、递推数列或递推函数。一个数列的下一项由它前面几项的一种运算(或函数)构成,如 a [ n ] = a [ n − 1 ] + a [ n − 2 ] a[n]=a[n-1]+a[n-2]a[n]=a[n−1]+a[n−2]。
递归:计算机中的概念,主要指计算机上的递归函数,(计算机中的‘函数’不同于数学上的‘函数’,这里指一段代码),即指会调用自己的函数。
def ditui(n):a,b,c=1,2,4#预先设置好前三个台阶的走法for i in range(n-3):temp1,temp2,temp3=a,b,ca=temp2b=temp3c=temp1+temp2+temp3return cdef digui(n):if n==1:return 1elif n==2:return 2elif n==3:return 4else:return digui(n-1)+digui(n-2)+digui(n-3)n=int(input('请输入一个数:'))
result1=ditui(n)
result2=digui(n)print('递推的结果为:{}'.format(result1))
print('递归的结果为:{}'.format(result2))
更多推荐
PYTHON第三次实验
发布评论