我一直在工作的2人战舰游戏,并最终使它发挥作用,没有bug。
我在这里发这篇文章是想问问你对此的看法。是否有任何修改可以提高代码的性能/总体布局?
如果您遇到任何与代码本身有关的问题(可能还没有发现bug ),那么如果您能告诉我,我将非常感激。
这款游戏是一款相当简单的基于控制台的战舰游戏,玩家轮流使用它来击沉由5x5棋盘上的x和y坐标定义的共同船。
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()发布于 2017-06-01 20:17:22
这个似乎很常见-
Python依赖空白和适当的缩进来进行可读性;对于开发人员(S)和世界各地查看代码的人来说都是如此。您应该尝试添加空白以将逻辑代码片段彼此分离。特别是您的load_game()函数需要这样做。我重写了它,所以它更易读:
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())中保存最多的-/输出比较容易。这样,就更容易使用~开关-case~语句并有效地评估用户输入。
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()def some_function(result):
if evaluate(result):
do_this()
else:
do_that()
def main():
print("Some welcome message.")
evaluate_me = input()
some_function(result)有几件事是不对的:
更好的代码:
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.")就在声明main()的行的上方:
begin = input("Type 'start' to begin: ")
while (begin != str('start')):
begin = input("Type 'start' to begin: ")简化如下:
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个字符长)。考虑缩短你的线条,以提高可读性。
https://codereview.stackexchange.com/questions/164709
复制相似问题