摆脱全局变量并创建函数
Getting rid of globals and creating functions
import subprocess as sp
plyr_x, plyr_y = (9,5)
plyr_char = 'o'
def create_board():
''' Creates a 10x10 grid of cells'''
board = []
for _ in range(10):
board.append(['-']*10)
board[plyr_x][plyr_y] = plyr_char
return board
def print_board(board):
'''Clears the screen prints or re-print all changes'''
tmp = sp.call('clear')
for row in board:
print ' '.join(row)
board = create_board()
print_board(board)
while True:
'''Main loop'''
choice = raw_input('What do you want to do? ')
print_board(board)
if choice == 'move':
'''Moves the player. Empties the cell previously occupid,
adds/subtracts 1 from the player location,
and then reprints the board'''
direction = raw_input('Which way do you want to move? ')
if direction == 'up':
board[plyr_x][plyr_y] = ' '
plyr_x += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'down':
board[plyr_x][plyr_y] = ' '
plyr_x += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'right':
board[plyr_x][plyr_y] = ' '
plyr_y += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'left':
board[plyr_x][plyr_y] = ' '
plyr_y += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif choice == 'attack':
print 'There is no one to attack right now.'
elif choice == 'die':
plyr_char = '%'
print_board(board)
quit()
一切正常,但我想去掉顶部的全局变量,如果可能的话,并将所有移动代码写入它自己的 move() 函数中,这样我就可以去掉巨大的 if主循环。你怎么能这样做?
这应该很有用。我认为可能会让您感到困惑的概念是将事物传递给函数,因为我基本上就是这样做的。
import subprocess as sp
def move(plyr_x, plyr_y, board):
'''Moves the player. Empties the cell previously occupid,
adds/subtracts 1 from the player location,
and then reprints the board'''
direction = raw_input('Which way do you want to move? ')
if direction == 'up':
board[plyr_x][plyr_y] = ' '
plyr_x += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'down':
board[plyr_x][plyr_y] = ' '
plyr_x += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'right':
board[plyr_x][plyr_y] = ' '
plyr_y += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'left':
board[plyr_x][plyr_y] = ' '
plyr_y += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
return (plyr_x, plyr_y, board)
def create_board(plyr_x, plyr_y, plyr_char):
''' Creates a 10x10 grid of cells'''
board = []
for _ in range(10):
board.append(['-']*10)
board[plyr_x][plyr_y] = plyr_char
return board
def print_board(board):
'''Clears the screen prints or re-print all changes'''
tmp = sp.call('clear')
for row in board:
print ' '.join(row)
def main():
plyr_x, plyr_y = (9,5)
plyr_char = 'o'
board = create_board(plyr_x, plyr_y, plyr_char)
print_board(board)
while True:
'''Main loop'''
choice = raw_input('What do you want to do? ')
print_board(board)
if choice == 'move':
plyr_x, plyr_y, board = move(plyr_x, plyr_y, board)
elif choice == 'attack':
print 'There is no one to attack right now.'
elif choice == 'die':
plyr_char = '%'
print_board(board)
quit()
以下是我将如何进行:
- 使用
main
函数
- 将全局参数移到那里
- 现在您必须将您的参数传递给函数,而不是依赖全局变量
- 开始添加可以同时包含行为和状态的classes!
我只实现了一个 Player()
class,但我也会创建一个板 class。我会把那个留给你!
例如,更新玩家位置(及其最后已知位置)中的字符可能是 Board
class 的一种方法。同样,您可以使用一种方法来显示棋盘 def print(self)
。当然,create_board()
函数会变成类似 def __init__(self, player, size)
.
的东西
我想你会发现这段代码很容易理解:
import subprocess as sp
class Player(object):
def __init__(self, x, y, char):
self.x = x
self.y = y
self.char = char
def move(self, direction):
""" update our position. """
if direction.lower() == 'left':
self.y -= 1
elif direction.lower() == 'right':
self.y += 1
elif direction.lower() == 'up':
self.x -= 1
elif direction.lower() == 'down':
self.x += 1
def create_board(player):
''' Creates a 10x10 grid of cells'''
board = []
for _ in range(10):
board.append(['-']*10)
board[player.x][player.y] = player.char
return board
def print_board(board):
'''Clears the screen prints or re-print all changes'''
tmp = sp.call('clear')
for row in board:
print ' '.join(row)
def main():
player = Player(9, 5, 'o')
board = create_board(player)
print_board(board)
while True:
'''Main loop'''
choice = raw_input('What do you want to do? ')
print_board(board)
if choice == 'move':
'''Moves the player. Empties the cell previously occupid,
adds/subtracts 1 from the player location,
and then reprints the board'''
direction = raw_input('Which way do you want to move? ')
if direction in ('up', 'down', 'left', 'right'):
board[player.x][player.y] = ' ' # Erase
player.move(direction)
board[player.x][player.y] = player.char
print_board(board)
elif choice == 'attack':
print 'There is no one to attack right now.'
elif choice == 'die':
player.char = '%'
print_board(board)
quit()
if __name__ == '__main__':
main()
我希望能给你一些想法!
import subprocess as sp
plyr_x, plyr_y = (9,5)
plyr_char = 'o'
def create_board():
''' Creates a 10x10 grid of cells'''
board = []
for _ in range(10):
board.append(['-']*10)
board[plyr_x][plyr_y] = plyr_char
return board
def print_board(board):
'''Clears the screen prints or re-print all changes'''
tmp = sp.call('clear')
for row in board:
print ' '.join(row)
board = create_board()
print_board(board)
while True:
'''Main loop'''
choice = raw_input('What do you want to do? ')
print_board(board)
if choice == 'move':
'''Moves the player. Empties the cell previously occupid,
adds/subtracts 1 from the player location,
and then reprints the board'''
direction = raw_input('Which way do you want to move? ')
if direction == 'up':
board[plyr_x][plyr_y] = ' '
plyr_x += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'down':
board[plyr_x][plyr_y] = ' '
plyr_x += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'right':
board[plyr_x][plyr_y] = ' '
plyr_y += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'left':
board[plyr_x][plyr_y] = ' '
plyr_y += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif choice == 'attack':
print 'There is no one to attack right now.'
elif choice == 'die':
plyr_char = '%'
print_board(board)
quit()
一切正常,但我想去掉顶部的全局变量,如果可能的话,并将所有移动代码写入它自己的 move() 函数中,这样我就可以去掉巨大的 if主循环。你怎么能这样做?
这应该很有用。我认为可能会让您感到困惑的概念是将事物传递给函数,因为我基本上就是这样做的。
import subprocess as sp
def move(plyr_x, plyr_y, board):
'''Moves the player. Empties the cell previously occupid,
adds/subtracts 1 from the player location,
and then reprints the board'''
direction = raw_input('Which way do you want to move? ')
if direction == 'up':
board[plyr_x][plyr_y] = ' '
plyr_x += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'down':
board[plyr_x][plyr_y] = ' '
plyr_x += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'right':
board[plyr_x][plyr_y] = ' '
plyr_y += 1
board[plyr_x][plyr_y] = 'o'
print_board(board)
elif direction == 'left':
board[plyr_x][plyr_y] = ' '
plyr_y += -1
board[plyr_x][plyr_y] = 'o'
print_board(board)
return (plyr_x, plyr_y, board)
def create_board(plyr_x, plyr_y, plyr_char):
''' Creates a 10x10 grid of cells'''
board = []
for _ in range(10):
board.append(['-']*10)
board[plyr_x][plyr_y] = plyr_char
return board
def print_board(board):
'''Clears the screen prints or re-print all changes'''
tmp = sp.call('clear')
for row in board:
print ' '.join(row)
def main():
plyr_x, plyr_y = (9,5)
plyr_char = 'o'
board = create_board(plyr_x, plyr_y, plyr_char)
print_board(board)
while True:
'''Main loop'''
choice = raw_input('What do you want to do? ')
print_board(board)
if choice == 'move':
plyr_x, plyr_y, board = move(plyr_x, plyr_y, board)
elif choice == 'attack':
print 'There is no one to attack right now.'
elif choice == 'die':
plyr_char = '%'
print_board(board)
quit()
以下是我将如何进行:
- 使用
main
函数 - 将全局参数移到那里
- 现在您必须将您的参数传递给函数,而不是依赖全局变量
- 开始添加可以同时包含行为和状态的classes!
我只实现了一个 Player()
class,但我也会创建一个板 class。我会把那个留给你!
例如,更新玩家位置(及其最后已知位置)中的字符可能是 Board
class 的一种方法。同样,您可以使用一种方法来显示棋盘 def print(self)
。当然,create_board()
函数会变成类似 def __init__(self, player, size)
.
我想你会发现这段代码很容易理解:
import subprocess as sp
class Player(object):
def __init__(self, x, y, char):
self.x = x
self.y = y
self.char = char
def move(self, direction):
""" update our position. """
if direction.lower() == 'left':
self.y -= 1
elif direction.lower() == 'right':
self.y += 1
elif direction.lower() == 'up':
self.x -= 1
elif direction.lower() == 'down':
self.x += 1
def create_board(player):
''' Creates a 10x10 grid of cells'''
board = []
for _ in range(10):
board.append(['-']*10)
board[player.x][player.y] = player.char
return board
def print_board(board):
'''Clears the screen prints or re-print all changes'''
tmp = sp.call('clear')
for row in board:
print ' '.join(row)
def main():
player = Player(9, 5, 'o')
board = create_board(player)
print_board(board)
while True:
'''Main loop'''
choice = raw_input('What do you want to do? ')
print_board(board)
if choice == 'move':
'''Moves the player. Empties the cell previously occupid,
adds/subtracts 1 from the player location,
and then reprints the board'''
direction = raw_input('Which way do you want to move? ')
if direction in ('up', 'down', 'left', 'right'):
board[player.x][player.y] = ' ' # Erase
player.move(direction)
board[player.x][player.y] = player.char
print_board(board)
elif choice == 'attack':
print 'There is no one to attack right now.'
elif choice == 'die':
player.char = '%'
print_board(board)
quit()
if __name__ == '__main__':
main()
我希望能给你一些想法!