首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >战舰2人游戏(Python)

战舰2人游戏(Python)
EN

Code Review用户
提问于 2017-06-01 19:55:46
回答 1查看 1.2K关注 0票数 3

我一直在工作的2人战舰游戏,并最终使它发挥作用,没有bug。

我在这里发这篇文章是想问问你对此的看法。是否有任何修改可以提高代码的性能/总体布局?

如果您遇到任何与代码本身有关的问题(可能还没有发现bug ),那么如果您能告诉我,我将非常感激。

这款游戏是一款相当简单的基于控制台的战舰游戏,玩家轮流使用它来击沉由5x5棋盘上的x和y坐标定义的共同船。

代码语言:javascript
复制
from random import randint

game_board = []

player_one = {
    "name": "Player 1",
    "wins": 0,
}

player_two = {
    "name": "Player 2",
    "wins": 0,
}

colors = {
    "reset":"\033[00m",
    "red":"\033[91m",
    "blue":"\033[94m",
    "cyan":"\033[96m",
}

# Building our 5 x 5 board
def build_game_board(board):
    for item in range(5):
        board.append(["O"] * 5)

def show_board(board):
    for row in board:
        print(" ".join(row))

# Defining ships locations
def load_game(board):
    print("WELCOME TO BATTLESHIP!")
    print("Find and sink the ship!")
    del board[:]
    build_game_board(board)
    print(colors['blue'])
    show_board(board)
    print(colors['reset'])
    ship_col = randint(1, len(board))
    ship_row = randint(1, len(board[0]))
    return {
        'ship_col': ship_col,
        'ship_row': ship_row,
    }

ship_points = load_game(game_board)

# Players will alternate turns.
def player_turns(total_turns):

    if total_turns % 2 == 0:
        total_turns += 1
        return player_one

    return player_two

# Allows new game to start
def play_again():

    positive = ["yes", "y"] 
    negative = ["no", "n"]

    global ship_points

    while True:
        answer = input("Play again? [Y(es) / N(o)]: ").lower().strip()
        if answer in positive:
            ship_points = load_game(game_board)
            main()
            break

        elif answer in negative:   
            print("Thanks for playing!")
            exit()

# What will be done with players guesses
def input_check(ship_row, ship_col, player, board):
    guess_col = 0
    guess_row = 0
    while True:

        try:
            guess_row = int(input("Guess Row:")) - 1
            guess_col = int(input("Guess Col:")) - 1
        except ValueError:

            print("Enter a number only: ")
            continue
        else:

            break
    match = guess_row == ship_row - 1 and guess_col == ship_col - 1
    not_on_game_board = (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4)

    if match:
        player["wins"] += 1
        print("Congratulations! You sunk my battleship!")
        print('The current match score is %d : %d (Player1 : Player2)' % (player_one["wins"], player_two["wins"]))
        print("Thanks for playing!")
        play_again()

    elif not match:
        if not_on_game_board:
            print("Oops, that's not even in the ocean.")

        elif board[guess_row][guess_col] == "X" or board[guess_row][guess_col] == "Y":
            print("You guessed that one already.")

        else:
            print("You missed my battleship!")
            if player == player_one:
                board[guess_row][guess_col] = "X"
            else:
                board[guess_row][guess_col] = "Y"

        print(colors['cyan'])
        show_board(game_board)
        print(colors['reset'])

    else:
        return 0


begin = input("Type 'start' to begin: ")

while (begin != str('start')):
    begin = input("Type 'start' to begin: ")

def main():

    for turns in range(6):

        if player_turns(turns) == player_one:
            print(ship_points)
            print("Player One")
            input_check(
                ship_points['ship_row'],
                ship_points['ship_col'],
                player_one, game_board
            )

        elif player_turns(turns) == player_two:
            print("Player Two")
            input_check(
                ship_points['ship_row'],
                ship_points['ship_col'],
                player_two, game_board
            )

        if turns == 5:
            print("This game is a draw.")
            print(colors['red'])
            show_board(game_board)
            print(colors['reset'])
            print('The current match score is %d : %d (Player1 : Player2)' % (player_one["wins"], player_two["wins"]))
            play_again()

if __name__ == "__main__":
    main()
EN

回答 1

Code Review用户

回答已采纳

发布于 2017-06-01 20:17:22

这个似乎很常见-

白色空间

Python依赖空白和适当的缩进来进行可读性;对于开发人员(S)和世界各地查看代码的人来说都是如此。您应该尝试添加空白以将逻辑代码片段彼此分离。特别是您的load_game()函数需要这样做。我重写了它,所以它更易读:

代码语言:javascript
复制
def load_game(board):
    del board[:]
    build_game_board(board)

    print(colors['blue'])
    show_board(board)
    print(colors['reset'])

    ship_col = randint(1, len(board))
    ship_row = randint(1, len(board[0]))

    return {
                'ship_col': ship_col,
                'ship_row': ship_row,
              }

main()函数和输入/输出

在上面的示例代码中,您可能已经注意到我去掉了程序的输出。我之所以这样做,是因为一般来说,在代码的一个部分(main())中保存最多的-/输出比较容易。这样,就更容易使用~开关-case~语句并有效地评估用户输入。

坏代码:

代码语言:javascript
复制
def some_function():
    some_input = input()
        some_result = evaluate(some_input)
        if some_result:
            some_other_result = do_this()
            if some_other_result:
                 do_this_again()
        else:
            do_that()

稍微好一点的代码:

代码语言:javascript
复制
def some_function(result):

    if evaluate(result):
        do_this()

    else:
        do_that()

def main():
    print("Some welcome message.")
    evaluate_me = input()

    some_function(result)

input_check()

有几件事是不对的:

  • 函数的名称太泛型了。使用一些更有意义的东西,这样你就不必用注释来解释它了。
  • 您的代码没有划分为逻辑部分;空格为off: guess_col =0 guess_row =0,而True: guess_row =int(输入(“猜测行:") )-1 guess_col =int(输入(”猜测Col:“)-1,除了ValueError: print(”只输入一个数字:“),继续其他:中断

更好的代码:

代码语言:javascript
复制
guess_col = 0
guess_row = 0

while True:
    try:
        guess_row = int(input("Guess Row:")) - 1
        guess_col = int(input("Guess Col:")) - 1
        break     # break will run here if no ValueError gets raised
    except ValueError:
        print("Enter a number only.")
  • 如果运行一个错误(在当前的设置下,这似乎不太可能),您的else:语句(参见上面的语句)将悄悄地让错误退出。为什么不干脆放弃这句话呢?
  • 您不需要使用“继续”,因为缩进代码只有在发生ValueError时才会运行,如果发生这种情况,则不会运行else:语句(只有当任何其他条件为假,而不是任何条件为True时才运行。)
  • 您也犯了同样的错误:在函数的末尾使用了一个end :返回0语句,尽管这是不可能运行的。您可以将if / elif / else更改为if / the语句: if match:# do change:# do other change
  • 返回0令人困惑。如果您需要返回none,请使用(这不容易吗?)返回0可以理解为退出代码,在这种情况下,您应该使用sys.exit(0) (https://stackoverflow.com/questions/23547284/exit-0-vs-return-0-python-preference)。您也可以使用返回或返回False (如果有的话)。

General

就在声明main()的行的上方:

代码语言:javascript
复制
begin = input("Type 'start' to begin: ")

while (begin != str('start')):
    begin = input("Type 'start' to begin: ")

简化如下:

代码语言:javascript
复制
while True:
    start_game = input("Type 'start' to begin: ")
    if start_game == "start": 
    # No need for parentheses;
    # "start" is already str(). No need to convert.
        break

有些代码就在79个字符边框的边缘(一行116个字符长)。考虑缩短你的线条,以提高可读性。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/164709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档