Simple Battleships game implementation in Python

别说谁变了你拦得住时间么 提交于 2019-12-12 06:54:59

问题


Okay I'm not sure how to develop another board with hidden spaces for the computers ships per-se, and have it test for hits. Again I'm not even sure how I'm going to test for hits on the board I have now. Make note: The player turn function will be migrated to the computer board since you wouldn't be attacking your own ships. Here is the code. It may not be the best formatting (as in with Methods and objects and such) but I can polish it up a little later. Also would there be another way to make placing the ships all in one function? Or with the way I have it, will it have to stay that way?

class battleship(object):

def __init__(self):
    self.board = [["O"] * 10, ["O"] * 10, ["O"] * 10, ["O"] * 10, ["O"] * 10, ["O"] * 10, ["O"] * 10, ["O"] * 10, ["O"] * 10, ["O"] * 10, ]
    self.printboard()
    self.placeAircraftCarrier()
    self.placeBattleShip()
    self.placeSubmarine()
    self.placeDestroyer()
    self.placePatrolBoat()
    for i in range(100):
         self.playerTurn()


def printboard(self):
    print "Game Board\n"
    print "1","2","3","4","5","6","7","8","9","10"
    for row in self.board:
        print "|".join(row)
def placeBattleShip(self):
    while True:
        self.vOrHPlacement = input("Would you like to place the Battleship (1) Vertically or (2)Horizontally?:")
        if self.vOrHPlacement == 1 or self.vOrHPlacement == 2:
            break
        else:
            print "You must press 1 or 2."
    while True:
        self.battleshipRow = input("With the head as the starting place what row would you like to place the Battleship (Takes 4 Spaces)?:")
        self.battleshipCol = input("What column would you like to start the BattleShip at?:")
        if self.vOrHPlacement == 1:
            if self.battleshipRow > 7 or self.battleshipRow <= 0:
                print "\nIf placing vertically you can only choose 1-7 for the row."
            elif self.battleshipCol <= 0 or self.battleshipCol > 10:
                print "You must choose 1 - 10 for a column."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 2
                self.battleshipCol -= 1
                for i in range(4):
                    self.board[self.battleshipRow + 1][self.battleshipCol] = "X"
                    self.battleshipRow += 1
                break
        elif self.vOrHPlacement == 2:
            if self.battleshipCol > 7 or self.battleshipCol <= 0:
                print "\nIf placing horizontally you can only choose 1-7 for a column."
            elif self.battleshipRow <= 0 or self.battleshipRow > 10:
                print "\n You must choose 1 - 10 as a row choice."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 1
                self.battleshipCol -= 2
                for i in range(4):
                    self.board[self.battleshipRow][self.battleshipCol + 1] = "X"
                    self.battleshipCol += 1
                break
    self.printboard()
def placeAircraftCarrier(self):
    while True:
        self.vOrHPlacement = input("Would you like to place the Aircraft Carrier (1) Vertically or (2)Horizontally?:")
        if self.vOrHPlacement == 1 or self.vOrHPlacement == 2:
            break
        else:
            print "You must press 1 or 2."
    while True:
        self.battleshipRow = input("With the head as the starting place what row would you like to place the Aircraft Carrier (Takes 5 Spaces)?:")
        self.battleshipCol = input("What column would you like to start the Aircraft Carrier at?:")
        if self.vOrHPlacement == 1:
            if self.battleshipRow > 6 or self.battleshipRow <= 0:
                print "\nIf placing vertically you can only choose 1-6 for the row."
            elif self.battleshipCol <= 0 or self.battleshipCol > 10:
                print "You must choose 1 - 10 for a column."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 2
                self.battleshipCol -= 1
                for i in range(5):
                    self.board[self.battleshipRow + 1][self.battleshipCol] = "X"
                    self.battleshipRow += 1
                break
        elif self.vOrHPlacement == 2:
            if self.battleshipCol > 6 or self.battleshipCol <= 0:
                print "\nIf placing horizontally you can only choose 1-6 for a column."
            elif self.battleshipRow <= 0 or self.battleshipRow > 10:
                print "\n You must choose 1 - 10 as a row choice."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 1
                self.battleshipCol -= 2
                for i in range(5):
                    self.board[self.battleshipRow][self.battleshipCol + 1] = "X"
                    self.battleshipCol += 1
                break
    self.printboard()
def placeSubmarine(self):
    while True:
        self.vOrHPlacement = input("Would you like to place the Submarine (1) Vertically or (2)Horizontally?:")
        if self.vOrHPlacement == 1 or self.vOrHPlacement == 2:
            break
        else:
            print "You must press 1 or 2."
    while True:
        self.battleshipRow = input("With the head as the starting place what row would you like to place the Submarine (Takes 3 Spaces)?:")
        self.battleshipCol = input("What column would you like to start the Submarine at?:")
        if self.vOrHPlacement == 1:
            if self.battleshipRow > 8 or self.battleshipRow <= 0:
                print "\nIf placing vertically you can only choose 1-8 for the row."
            elif self.battleshipCol <= 0 or self.battleshipCol > 10:
                print "You must choose 1 - 10 for a column."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 2
                self.battleshipCol -= 1
                for i in range(3):
                    self.board[self.battleshipRow + 1][self.battleshipCol] = "X"
                    self.battleshipRow += 1
                break
        elif self.vOrHPlacement == 2:
            if self.battleshipCol > 8 or self.battleshipCol <= 0:
                print "\nIf placing horizontally you can only choose 1-8 for a column."
            elif self.battleshipRow <= 0 or self.battleshipRow > 10:
                print "\n You must choose 1 - 10 as a row choice."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 1
                self.battleshipCol -= 2
                for i in range(3):
                    self.board[self.battleshipRow][self.battleshipCol + 1] = "X"
                    self.battleshipCol += 1
                break
    self.printboard()
def placeDestroyer(self):
    while True:
        self.vOrHPlacement = input("Would you like to place the Destroyer (1) Vertically or (2)Horizontally?:")
        if self.vOrHPlacement == 1 or self.vOrHPlacement == 2:
            break
        else:
            print "You must press 1 or 2."
    while True:
        self.battleshipRow = input("With the head as the starting place what row would you like to place the Destroyer (Takes 3 Spaces)?:")
        self.battleshipCol = input("What column would you like to start the Destroyer at?:")
        if self.vOrHPlacement == 1:
            if self.battleshipRow > 8 or self.battleshipRow <= 0:
                print "\nIf placing vertically you can only choose 1-8 for the row."
            elif self.battleshipCol <= 0 or self.battleshipCol > 10:
                print "You must choose 1 - 10 for a column."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 2
                self.battleshipCol -= 1
                for i in range(3):
                    self.board[self.battleshipRow + 1][self.battleshipCol] = "X"
                    self.battleshipRow += 1
                break
        elif self.vOrHPlacement == 2:
            if self.battleshipCol > 8 or self.battleshipCol <= 0:
                print "\nIf placing horizontally you can only choose 1-8 for a column."
            elif self.battleshipRow <= 0 or self.battleshipRow > 10:
                print "\n You must choose 1 - 10 as a row choice."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 1
                self.battleshipCol -= 2
                for i in range(3):
                    self.board[self.battleshipRow][self.battleshipCol + 1] = "X"
                    self.battleshipCol += 1
                break
    self.printboard()
def placePatrolBoat(self):
    while True:
        self.vOrHPlacement = input("Would you like to place the Patrol Boat (1) Vertically or (2)Horizontally?:")
        if self.vOrHPlacement == 1 or self.vOrHPlacement == 2:
            break
        else:
            print "You must press 1 or 2."
    while True:
        self.battleshipRow = input("With the head as the starting place what row would you like to place the Patrol Boat (Takes 2 Spaces)?:")
        self.battleshipCol = input("What column would you like to start the Patrol Boat at?:")
        if self.vOrHPlacement == 1:
            if self.battleshipRow > 9 or self.battleshipRow <= 0:
                print "\nIf placing vertically you can only choose 1-9 for the row."
            elif self.battleshipCol <= 0 or self.battleshipCol > 10:
                print "You must choose 1 - 10 for a column."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 2
                self.battleshipCol -= 1
                for i in range(2):
                    self.board[self.battleshipRow + 1][self.battleshipCol] = "X"
                    self.battleshipRow += 1
                break
        elif self.vOrHPlacement == 2:
            if self.battleshipCol > 9 or self.battleshipCol <= 0:
                print "\nIf placing horizontally you can only choose 1-9 for a column."
            elif self.battleshipRow <= 0 or self.battleshipRow > 10:
                print "\n You must choose 1 - 10 as a row choice."
            elif self.board[self.battleshipRow - 1][self.battleshipCol - 1] == "X":
                print "There is already a ship there."
            else:
                self.battleshipRow -= 1
                self.battleshipCol -= 2
                for i in range(2):
                    self.board[self.battleshipRow][self.battleshipCol + 1] = "X"
                    self.battleshipCol += 1
                break
    self.printboard()
def playerTurn(self):
    while True:
        self.row = input("What row coordinate would you like to hit?:")
        self.column = input("What column coordinate would you like to hit?")
        if self.row > 10 or self.row < 0:
            print "You must pick a row coordinate between 1 and 10."
        elif self.column > 10 or self.column < 0:
            print "You must pick a column coordinate between 1 and 10."
        elif self.board[self.row - 1][self.column - 1] == "*":
            print "You have already hit there."
        else:
            self.board[self.row - 1][self.column - 1] = "*"
            break
    self.printboard()

b = battleship()

回答1:


You need a lot of code organisation. I would suggest keeping Classes free from any sort of looping or inputs! Input stuff from the user & then add that to the class instance, not the other way round. Organize your code & add documentation to it so that others can help you.

You can do some stuff like this

class BattleShip:
    """ Ship object container"""

    def __init__(self, position_x, position_y, size):
        """ Necessary variables for the ship go here """
        self.position_x = position_x
        self.position_y = position_y
        self.size = size

    def contains(self, position_x, position_y):
        """ Returns true if supplied point lies inside this ship """
        # code

    def destroy(self, position_x, position_y):
        """ Destroys the ship's point supplied if it contains it """
        assert self.contains(position_x, position_y)
        # Now update the gameboard
        # code

    def isCompletelyDestroyed(self):
        """ Returns True if ship is completely destoryed else False """
        # code


class GameBoard:
    """ The container for the ships """
    def __init__(self, size):
        """Initialize clean GameBoard depending on size, etc """
        self.occupied = "+" # representation for ships
        self.destroyed = 'x' # representation for destroyed area
        self.clear = '-' # representation for clear water

    def printBoard(self):
        """ Print the current gameboard state """

    def update(self, ship):
        """ Updates the gameboard according to updated ship """


# Now do the mainloop
while game_not_over:
    # run game


来源:https://stackoverflow.com/questions/20179953/simple-battleships-game-implementation-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!