12

我已经教 8-9 年级的学生基本计算机编程两周了,昨天我试图向他们展示如何用 Python 制作真正简单的文本冒险游戏。

场景是函数,(例如dragons_cave())由一些打印语句和对 的调用组成input(),询问玩家下一步想去哪里,然后将其传递给以globals()找到合适的函数,然后调用。我知道这并不理想(在什么时候庞大的功能链会开始成为问题?)但是,我想到的是,这对他们来说似乎是最简单的,而且只涉及一点点手。

我的问题是全局状态——例如。玩家在一个场景中获得钥匙,然后才能在另一个场景中解锁大门。当我有像字符串或布尔值这样的全局不可变变量时,Python 希望我global在函数的开头使用关键字。

global hasKey
hasKey = True

我对此很满意,但我有一种模糊的感觉(从互联网上其他地方的 Stackoverflow 中得到),这种感觉global是不受欢迎的,而且总是有一个更好的对应物。我可以拥有一个全局字典或将所有内容包装在一个类中,但我不确定我是否可以为我的孩子清楚地捍卫这些选项(他们仍在思考变量的含义)。

无论我使用什么,我都希望能够直截了当地向我的孩子解释为什么我们这样做,以及为什么这样做是必要的。global似乎有这两个属性,但它是坏的吗?

4

2 回答 2

10

我会鼓励他们开始学习 OO

class Location:
     name="a place"
     description = "A dark place.  there are exits to the North and East"
     exits = "North","East"
     def __str__(self):
         return "%s\n%s"%(self.name,self.description)


class Player:
     current_location = "Home"
     inventory = ["Blue Key","Magic Thumbtacks"]
     health = 100
     name = "Unknown"
     def __init__(self,name):
         self.name = name

player = Player("Player 1")
loc = Location()
print loc
x = input("Input:")

老实说,游戏是一个困难的概念(即使是文字冒险)。但我会直接从 OO 概念开始,从长远来看,他们会从中受益更多。

当然,这个例子非常小,并且遗漏了很多实现细节。

一个不相关但更好的 OO 示例是:

class Animal:
     voice = '...'
     def speak(self):
         return "A %s Says '%s'"%(self.__class__.__name__, self.voice)

class Dog(Animal):
     voice = "Bark, Bark"

class Duck(Animal):
     voice = "Quack, Quack"

print Dog().speak()
print Duck().speak()
于 2013-07-20T19:00:05.143 回答
9

假设您希望使事情尽可能简单(没有 OO)并且希望避免引入global关键字,您可以改为使用状态字典并在其中分配变量。

state['hasKey'] = True

由于访问 thisdict不是变量赋值,因此您避免引入global关键字,同时可以教如何使用 a dict(检查键等)

当然,您仍然使用全局变量,并没有真正解决良好编码风格的问题。但另一方面,它可以作为对范围和命名空间的介绍。

于 2013-07-20T19:27:34.113 回答