随机的乐趣和游戏

本文提供了一系列Python编程实践,包括猜数字游戏的扩展,使用turtle库创建彩色随机螺旋线,实现石头剪刀布游戏,并优化用户体验,以及设计掷骰子和万花筒图像生成的程序,旨在帮助初学者掌握Python基础和游戏逻辑开发。
摘要由CSDN通过智能技术生成

1、猜数字游戏

#GuessingGame.py
import random
the_number = random.randint(1, 10)
print("计算机已经在1到10之间随机生成了一个数字,")
guess = int(input("请你猜猜是哪一个数字: "))
while guess != the_number:
    if guess > the_number:
        print(guess, "猜大了!")
    if guess < the_number:
        print(guess, "猜小了!")
    guess = int(input("再猜一次: "))
print(guess, "猜对了! ") 

练习一

        修改上面的程序让计算机生成1到100之间的随机数字。

练习二

        继续修改,创建一个变量number_of_tries来记录用户猜测的次数,每猜一次,就将该变量加1,猜对后,显示用户猜测的次数。

 练习三

        添加一个外部循环来询问用户,当猜对后是否还想再玩一次。

2、彩色的随机螺旋线

效果如下:

选取任意的颜色

颜色列表=["red","green","yellow"]

random.choice(颜色列表)

设置海龟的坐标

笛卡尔坐标系,即x,y坐标系,屏幕中心为原点(0,0)

设置海龟的位置:turtle.setpos(x,y)

避免画线

turtle.penup(),抬起钢笔,要画线时再pendown()

确保随机的坐标在窗口内

turtle.window_width()获取窗口宽度

turtle.window_height()获取窗口高度

计算随机坐标:x=random.randrange(-turtle.window_width()//2,turtle.window_width()//2)

                        y=random.randrange(-turtle.window_height()//2,turtle.window_height()//2)

整合 

#RandomSpirals.py
import random
import turtle as t

t.bgcolor("black")
colors = ["red", "yellow", "blue", "green", "orange", "purple", 
          "white", "gray"]
for n in range(50):
    # Generate spirals of random sizes/colors at random locations
    t.pencolor(random.choice(colors))   # Pick a random color 
    size = random.randint(10,40)        # Pick a random spiral size
    # Generate a random (x,y) location on the screen
    x = random.randrange(-t.window_width()//2,
                         t.window_width()//2)
    y = random.randrange(-t.window_height()//2,
                         t.window_height()//2)
    t.penup()
    t.setpos(x,y)
    t.pendown()
    for m in range(size):
        t.forward(m*2)
        t.left(91)

3、石头剪刀布

游戏说明:

从石头、剪刀、布中,用户输入一个选项,计算机随机选择一个选项,比较两个选项,根据石头克剪刀、剪刀克布、布克石头这个规则判断输赢。

代码

#石头布剪刀.py
import random
choices = ["石头", "布", "剪刀"]
print("游戏规则:石头克剪刀、剪刀克布、布克石头!")
player = input("你想要出石头还是布还是剪刀 (或者输入quit退出)? ")
while player != "quit":                 # 直到用户输入quit游戏才结束
    #player = player.lower()             # Change user entry to lowercase
    computer = random.choice(choices)   # 计算机随机选择一个选项
    print("你选择了" +player+ ", 计算机选择了 " +computer+ "。")
    if player == computer:
        print("平局!")
    elif player == "石头":
        if computer == "剪刀":
            print("你赢了!")
        else:
            print("计算机赢了!")
    elif player == "布":
        if computer == "石头":
            print("你赢了!")
        else:
            print("计算机赢了!")
    elif player == "剪刀":
        if computer == "布":
            print("你赢了!")
        else:
            print("计算机赢了!")
    else:
        print("你输入有误,请检查你的输入...")
    print()                             # 空一行
    player = input("你想要出石头还是布还是剪刀 (或者输入quit退出)? ")

print("游戏结束了!")

练习

让用户输入石头剪刀布,用户会觉得烦,要是输入1,2,3代表石头剪刀布该多好,试着改一下。 

#石头布剪刀.py
import random
choices = ["石头","剪刀", "布"]
print("游戏规则:石头克剪刀、剪刀克布、布克石头!")
play_prompt="1代表石头,2代表剪刀,3代表布,请选一下输入 (或者输入q退出)? "
right_input=["1","2","3","q","Q"]
flag = True         # 代表是否进行游戏
while flag:                 # 直到用户输入q游戏才结束

    player = input(play_prompt)
    if player in right_input:        
        player = player.lower()
        if player =="q":
            flag = False
        else:    
            player = choices[int(player)-1] 
            computer = random.choice(choices)   # 计算机随机选择一个选项
            print("你选择了" +player+ ", 计算机选择了 " +computer+ "。")
            if player == computer:
                print("平局!")
            elif player == "石头":
                if computer == "剪刀":
                    print("你赢了!")
                else:
                    print("计算机赢了!")
            elif player == "布":
                if computer == "石头":
                    print("你赢了!")
                else:
                    print("计算机赢了!")
            else:
                if computer == "布":
                    print("你赢了!")
                else:
                    print("计算机赢了!")
    else:
        print('你输入有误,只能输入["1","2","3","q","Q"]中的一个字符')

print("游戏结束了!")

4、选任意一张牌,比大小

游戏规则

两个玩家每人随机抽取一张牌,拥有较大牌的大小的玩家胜出。

制作一副牌,不带大小王

suits = ["方块", "红桃", "梅花", "黑桃"]
faces = ["2", "3", "4", "5", "6", "7", "8", "9",
         "10", "J", "Q", "K", "A"]

发牌

import random
suits = ["方块", "红桃", "梅花", "黑桃"]
faces = ["2", "3", "4", "5", "6", "7", "8", "9",
         "10", "J", "Q", "K", "A"]    
my_face = random.choice(faces) 
my_suit = random.choice(suits)
your_face = random.choice(faces)
your_suit = random.choice(suits)
print("我的牌是", my_suit,my_face)
print("你的牌是", your_suit,your_face)

计算牌的大小

这里规定牌的大小跟花色无关,所以牌的大小=faces.index(牌面值)+1,如果只是比较大小的话,直接比较索引值即可。

让玩家持续玩,随时可以退出游戏

for循环适合循环次数确定的,但玩家想玩几次是不确定的,所以在游戏中使用while循环。

常见代码如下:

keep_going = True
while keep_going:
    answer = input("按 [Enter] 继续玩, 按其他键就退出: ")
    if answer == "":
        keep_going = True
    else:
        keep_going = False

精简代码如下:

keep_going = True
while keep_going:
    answer = input("按 [Enter] 继续玩, 按其他键就退出: ")
    keep_going = (answer == "")

整合

# HighCard.py
import random
suits = ["方块", "红桃", "梅花", "黑桃"]
faces = ["2", "3", "4", "5", "6", "7", "8", "9",
         "10", "J", "Q", "K", "A"]
keep_going = True
while keep_going:
    my_face = random.choice(faces) 
    my_suit = random.choice(suits)
    your_face = random.choice(faces)
    your_suit = random.choice(suits)
    print("我的牌是", my_suit,my_face)
    print("你的牌是", your_suit,your_face)
    if faces.index(my_face) > faces.index(your_face):
        print("我赢了!")
    elif faces.index(my_face) < faces.index(your_face):
        print("你赢了!")
    else:
        print("平局!")
    answer = input("按 [Enter] 继续玩, 按其他键就退出: ")
    keep_going = (answer == "")

5、掷骰子

模拟投掷5个骰子,检查玩家是否掷出了3个或者4个或者5个一样的骰子,输出结果

实现步骤

1、建立一个游戏循环,以便用户能够持续掷骰子,直到他们自己想停下来。

2、建立一个列表来存储5个随机值,代表掷出的5个骰子的值,也就是用列表来模拟5个骰子。

3、检查玩家是否掷出了3个或者4个或者5个一样的骰子,输出结果。

核心算法

判断相同骰子的个数是3个还是4个亦或是5个:

先对5个骰子排序,再判断第一个与第五个是否相同,如果相同,输出“豹子”,如果不同,再判断第一个与第四个或者第二个与第五个是否相同,如果相同,输出“4个相同”,如果不同,再判断第一个与第三个或者第二个与第4个或者第三与第五个是否相同,如果相同,输出“3个相同”。

对骰子排序

列表.sort()

测试骰子

假如dice列表代表5个骰子,并且排序后,那么测试骰子的代码如下: 

    if dice[0] == dice[4]:
        print("豹子!")
    # FourOfAKind - first four are the same, or last four are the same
    elif (dice[0] == dice[3]) or (dice[1] == dice[4]):
        print("4颗相同!")
    # ThreeOfAKind - first three, middle three, or last three are the same
    elif (dice[0] == dice[2]) or (dice[1] == dice[3]) or (dice[2] == dice[4]):
        print("3颗相同!")

整合

# FiveDice.py
import random
# Game loop 
keep_going = True
while keep_going:
    # "Roll" five random dice
    dice = [0,0,0,0,0]          # Set up an array for five values dice[0]-dice[4]
    for i in range(5):          # "Roll" a random number from 1-6 for all 5 dice
        dice[i] = random.randint(1,6)
    print("You rolled:", dice)  # Print out the dice values
    # Sort them
    dice.sort()
    # Check for five of a kind, four of a kind, three of a kind
    # Yahtzee - all five dice are the same
    if dice[0] == dice[4]:
        print("Yahtzee!")
    # FourOfAKind - first four are the same, or last four are the same
    elif (dice[0] == dice[3]) or (dice[1] == dice[4]):
        print("Four of a kind!")
    # ThreeOfAKind - first three, middle three, or last three are the same
    elif (dice[0] == dice[2]) or (dice[1] == dice[3]) or (dice[2] == dice[4]):
        print("Three of a kind")
    keep_going = (input("Hit [Enter] to keep going, any key to exit: ") == "")

6、万花筒

万花筒(Kaleidoscope),一种光学玩具,将有鲜艳颜色的实物放于圆筒的一端,圆筒中间放置三棱镜,另一端用开孔的玻璃密封,由孔中看去即可观测到对称的美丽图像

所以万花筒程序的目的是生成对称的图像,在这里是对随机生成的螺旋线生成其他三个对称的螺旋线,我们可以随机生成多个螺旋线,符合真实的万花筒。

如何确定其他三个螺旋线的起始位置?假设第一个螺旋线的随机位置是(x,y),其他三个坐标是(x,-y),(-x,y),(-x,-y)。

我们在上面的彩色的随机螺旋线程序基础上,制作万花筒程序,但图像之间还不是真正的镜像:

#Kaleidoscope.py
import random
import turtle
t = turtle.Pen()
t.speed(0)
turtle.bgcolor("black")
colors = ["red", "yellow", "blue", "green", "orange", "purple", "white", "gray"]
for n in range(50):
    # Generate spirals of random sizes/colors at random locations on the screen
    t.pencolor(random.choice(colors))   # Pick a random color from colors[]
    size = random.randint(10,40)        # Pick a random spiral size from 10 to 40
    # Generate a random (x,y) location on the screen
    x = random.randrange(0,turtle.window_width()//2)
    y = random.randrange(0,turtle.window_height()//2)
    # 第一条螺旋线
    t.penup()
    t.setpos(x,y)
    t.pendown()
    for m in range(size):
        t.forward(m*2)
        t.left(91)
    # 第二条螺旋线
    t.penup()
    t.setpos(-x,y)
    t.pendown()
    for m in range(size):
        t.forward(m*2)
        t.left(91)    
    # 第三条螺旋线
    t.penup()
    t.setpos(-x,-y)
    t.pendown()
    for m in range(size):
        t.forward(m*2)
        t.left(91)
    # 第四条螺旋线
    t.penup()
    t.setpos(x,-y)
    t.pendown()
    for m in range(size):
        t.forward(m*2)
        t.left(91)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值