Python中的战舰

时间:2015-10-23 20:33:46

标签: python

对于学校项目,我必须做一个战舰游戏。在游戏中,玩家有4艘船,如果单个玩家的所有船只都被摧毁,则游戏结束。我试图让这个功能起作用。

这是代码:

board = []
for x in range(10):
    board.append(["O"] * 10)
def print_board(board):
    for row in board:
        print " ".join(row)
print "Let's play Battleship!"
print_board(board)
def Input_row1(board):
    return int(raw_input("In what row do you want to place your first ship?"))
def Input_col1(board):
    return int(raw_input("In what col do you want to place your first ship?"))  
def Input_row2(board):
    return int(raw_input("In what row do you want to place your second ship?"))
def Input_col2(board):
    return int(raw_input("In what col do you want to place your second ship?")) 
def Input_row3(board):
    return int(raw_input("In what row do you want to place your third ship?"))
def Input_col3(board):
    return int(raw_input("In what col do you want to place your third ship?"))
def Input_row4(board):
    return int(raw_input("In what row do you want to place your fourth ship?"))
def Input_col4(board):
    return int(raw_input("In what col do you want to place your fourth ship?"))  
ship_row1 = Input_row1(board)
ship_col1 = Input_col1(board)
ship_row2 = Input_row2(board)
ship_col2 = Input_col2(board)
ship_row3 = Input_row3(board)
ship_col3 = Input_col3(board)
ship_row4 = Input_row4(board)
ship_col4 = Input_col4(board)
for turn in range(9):
    guess_row = int(raw_input("Guess Row:"))
    guess_col = int(raw_input("Guess Col:"))
    if guess_row == ship_row1 and guess_col == ship_col1 or guess_row == ship_row2 and guess_col == ship_col2 or guess_row == ship_row3 and guess_col == ship_col3 or guess_row == ship_row4 and guess_col == ship_col4:
        print "Congratulations! You sunk my battleship!"
        if True:
            total_ships = 4
            total_ships = total_ships - 1
            print total_ships
            if total_ships == 0:
                print "You destroyed all hostile ships!"
    else:
        if (guess_row < 0 or guess_row > 9) or (guess_col < 0 or guess_col > 9):
            print "Oops, that's not even in the ocean."
        elif(board[guess_row][guess_col] == "X"):
            print "You guessed that one already."
        else:
            print "You missed my battleship!"
            if turn == 9:
                print "GAME OVER"
                if turn == 9:
                    print "Game Over"
        board[guess_row][guess_col] = "X"
    print "Turn", turn + 1
    print_board(board)

问题是在第二艘船被击中后,total_ships保持3,并且没有转为2.为什么这不正常?

2 个答案:

答案 0 :(得分:2)

这是你的问题:

total_ships = 4
total_ships = total_ships - 1

您每次都会重置total_ships。以上相当于:

total_ships = 3

你应该让total_ships的初始化在你的回合之外。就此而言,你能做的最好的事情是创建一个游戏循环函数和一个处理特定转弯的函数,这样你就不会只有一个长文件代码。

答案 1 :(得分:2)

你的程序有很多奇怪的东西。我不确定我们应该在这里重写多少,因为这是一个学校项目,但这里有一些评论:

  • 对于你的主要问题,正如纳撒尼尔·福特所回答的那样,问题是你在每次船只被击中之前将total_ships重置为4。只在程序开始时初始化一次,而不是在转弯循环中初始化。

  • 在同一个循环中,有一行

    if True:
    

    我不知道你的意思,但它可能没有做你想做的事。它完全没用,因为if中的块总是执行(所以你不妨完全删除if,或者更可能重写测试,以便它做你想到的事情。)

  • 您在开头声明了一个名为board的10x10数组,但您从未使用它。如果您创建一个棋盘(这似乎是一个好主意),您不应该将每个战舰的位置存储在单独的变量中(ship_row1ship_col1等)。相反,当用户选择船只的(i, j)位置时,您应该将单元格board[i][j]设置为1以指示那里有船只,并摆脱{{1}完全和ship_col个变量。这样就可以在一个循环中以相同的方式选择所有船只的位置,这个循环要求ship_rowx(行和列)并更改板中相应的单元格(想象放置20个船只的代码你写道,这将是很多复制/粘贴...)。这样也可以更简单地检查用户是否将两艘船放在同一位置(在当前的实施中,当放置第四艘船时,您应该添加一个长检查以查看是否

    y

    可以通过检查电路板上的单元是否已经为1来简单地替换。