摆脱全局变量并创建函数

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()

我希望能给你一些想法!