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) - 1
get = n - target
return 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 random
def getnum(n):
a = int(math.log2(n))
target = pow(2, a) - 1
get = n - target
return get
def computer_getsmart(n):
a=getnum(n)
if a>int(n/2):
a=random.randint(1,int(n/2))
return a
def computer_getnormal(n):
a = random.randint(1, int(n / 2))
return a
def compusmart():
n = random.randint(1, 100)
while n>1:
print('现在有{}个物品'.format(n))
#from here
while True:
try:
person=int(input("请你输入你要拿走的物件个数:"))
assert 1<=person<=n//2
break
except:
print("请输入1到{}的数".format(n//2))
#till here
n = n - person
if n==1:
print('你赢啦!')
break
else:
computernum=computer_getsmart(n)
print('电脑取走{}个物品'.format(computernum))
n=n-computernum
print('现在还有{}个物品'.format(n))
else:
print('你输啦!')
def compunormal():
n = random.randint(1, 100)
while n>1:
print('现在有{}个物品'.format(n))
# from here
while True:
try:
person = int(input("请你输入你要拿走的物件个数:"))
assert 1 <= person <= n // 2
break
except:
print("请输入1到{}的数".format(n // 2))
# till here
n = n - person
if n==1:
print('你赢啦!')
break
else:
computernum=computer_getnormal(n)
print('电脑取走{}个物品'.format(computernum))
n=n-computernum
print('现在还有{}个物品'.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,c
a=temp2
b=temp3
c=temp1+temp2+temp3
return c
def digui(n):
if n==1:
return 1
elif n==2:
return 2
elif n==3:
return 4
else:
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))