如何使该Python记忆游戏正常工作

时间:2018-12-12 20:54:02

标签: python

这是我到目前为止所拥有的代码,我的老师希望游戏在您猜出一个数字并且当它们与数字匹配时“翻转X结束”,但是当数字不同时,数字“翻转过去”并且再次成为X。而且他希望游戏在所有数字都暴露出来后说“你赢了”。

import random

visual=[['X','X','X','X','X'],['X','X','X','X','X'],['X','X','X','X','X'],['X','X','X','X','X'],['X','X','X','X','X']]
data=[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]


random.shuffle(data[0])
random.shuffle(data[1])
random.shuffle(data[2])
random.shuffle(data[3])
random.shuffle(data[4])


while True:


print(visual[0])
print(visual[1])
print(visual[2])
print(visual[3])
print(visual[4])


   user_input_1 = int(input('enter a number 0 thru 4 to pick your first X position: '))

    user_input_2 = int(input('enter a number 0 thru 4 to pick your first Y position: '))
    user_input_3 = int(input('enter a number 0 thru 4 to pick your second X position: '))


user_input_4 = int(input('enter a number 0 thru 4 to pick your second Y position: '))


if data[user_input_1][user_input_2] == data[user_input_3][user_input_4]:
    visual[user_input_1][user_input_2] = str(data[user_input_1][user_input_2])
    visual[user_input_3][user_input_4] = str(data[user_input_3][user_input_4])

    print(visual[0])
    print(visual[1])
    print(visual[2])
    print(visual[3])
    print(visual[4])
    print('Congratulations you won the game!')
    break

2 个答案:

答案 0 :(得分:1)

据我了解,这是游戏中的离散步骤:

  1. 初始化电路板和数据。
  2. 随机播放数据
  3. 进入循环
  4. 印制板
  5. 问用户第一个猜测
  6. 询问用户第二次猜测
  7. 用显示板印刷
  8. 如果用户错过了,请备份它们
  9. 检查获胜条件(一切都显示了吗?)
  10. 回退或打印获胜

您的代码成功地初始化了面板(步骤1),对数据进行洗牌(2),进入循环(3),打印面板(4)并要求猜测(5)(6)。

以下是您丢失的物品的一些指导:

  • 获得输入后,您始终希望将面板与面板(7)一起打印。为此,您需要先用所写的文章来更新视觉效果:

    visual[user_input_1][user_input_2] = str(data[user_input_1][user_input_2])
    visual[user_input_3][user_input_4] = str(data[user_input_3][user_input_4])
    

    ,然后打印您的视觉效果。如果使用if语句,则不需要这样做,因为您始终想打印显示的木板。

  • 此后,如果用户未命中(8),则要交换回X。您已经基本编写了此条件。您需要检查数据板上是否有遗漏,如果是,则将这些可视内容交换回X:

        if data[user_input_1][user_input_2] != data[user_input_3][user_input_4]:
            visual[user_input_1][user_input_2] = 'X'
            visual[user_input_3][user_input_4] = 'X'
    

    侧面注:理想情况下,您希望清除显露的先前木板印刷以测试内存。这部分有些棘手。如果不使用操作系统命令,就没有简单的方法来清除显示内容,这几乎肯定超出了您的课程范围。我会与您的老师核对有关翻身的期望。

    如果您对在Python here中使用操作系统命令如何实现这一目标感兴趣,请参阅StackOverflow。您将需要导入os和导入时间。打印显示内容后,使用time.sleep(number_of_seconds)为用户提供很多时间来尝试记住位置,然后将os.system('clear')用于linux / mac os或os.system('CLS')用于Windows清除屏幕。 同样,这不是您的老师想要的。

  • 现在让我们来处理获胜条件(9)。当前,您正在使用带有“ break”的“ while True:”。尽管在这种情况下这可能起作用,但几乎应始终避免使用“ while True:”(有很多原因,here是解决一个原因的帖子)。诸如“ while”,“ do-while”和“ for”之类的循环结构具有内置的停止条件,将在每次循环时进行检查。在此程序中,您要停止的条件是将棋盘完全暴露出来(这就是您知道游戏结束并且用户不再需要猜测的方式)。因此,在这种情况发生之前,您希望while循环继续进行。看起来像这样:

        while #win condition is not met#:
            #stuff you want to loop#
        #congrats, you have met your win condition# 
    
  • 有多种方法可以检查您的获胜条件是否尚未满足。一种选择是,如果可视面板与数据面板仍不相同,您就知道还没有赢:

        while visuals != data:
            #stuff you want to loop#
        print(congrats....)
    

总之,TLDR:

import random
visuals = [...]
data = [...]
    #shuffle
    while visuals != data:
        #print visuals
        #get input
        #update the inputted visuals with reveals
        #print visuals with reveals
        if #not a match:
            #update the inputted visuals back to X's
    print("Congratulations you won the game!")

如果您感兴趣的话,有一些较小的要点也可以改进您的代码:对缩进非常警惕,在这里do-while循环更合适(您能想到为什么吗?),您可以编写减少大量重复代码的函数和循环(例如,打印视觉效果时)。但这足以应付您的需求。

答案 1 :(得分:0)

您的代码的一些建议:

  1. 由于经常显示电路板,因此您可能需要编写一个单独的函数,该函数以变量visual作为输入并打印内容。然后,您可以调用该函数,而不用编写所有这些print语句。
  2. 在当前代码中,只有匹配时才显示卡片。玩记忆游戏的整体策略之一是,如果您翻了两张纸牌,例如看到“ 5”和“ 2”,那不是匹配,但是如果您翻新了两副纸牌,而其中两张是另一张“ 5”,您可能还记得您在前一轮中将第一个“ 5”翻倒的位置,因此知道如何进行比赛。因此,也许您应该这样做:选择第一张卡后更新并显示visual,然后对第二张卡进行相同操作。如果有匹配项,则将visual保留原样。如果它们不匹配,则用“ X”替换两个点,然后返回循环的顶部。
  3. 您的代码似乎将一场比赛视为“胜利”。一旦所有卡都匹配后,不应该认为它赢了吗?在这种情况下,您可以通过检查是否在visual中的任何地方显示“ X”来跟进上一步。如果没有,那就意味着所有的卡都被发现了,因此玩家赢了。