Recogedor de coordenadas Battleship -- python campo con python-3.x campo con battleship camp codereview Relacionados El problema

Battleship coordinate picker


3
vote

problema

Español

Te presento ... ¡My Battleship Lugar Picker! Esto será parte de un programa de acorazado más grande. Las coordenadas que son importantes son doDamage()0 .

  doDamage()1  
Original en ingles

I present to you... my battleship location picker! This will be part of a larger battleship program. The coordinates that are important are finalcoords.

from operator import itemgetter import getch import skilstak.colors as c #colors BOARDLENGTH = 10 BOARDHEIGHT = 10 board = [['_'] * BOARDLENGTH for _ in range(BOARDHEIGHT)] class Ship():     def __init__(self, size, symbol):         self.size = size         self.symbol = symbol         self.coords = [(x,0) for x in range(size)]         self.previous_coords = [(None,None) for _ in range(size)]     def shift(self,direction):          x_values = list(map(itemgetter(0), self.coords))         y_values = list(map(itemgetter(1), self.coords))         if direction == 'R' and 0 not in x_values:             change = (-1,0)             elif direction == 'D' and BOARDHEIGHT-1 not in y_values:             change = (0,1)         elif direction == 'U' and 0 not in y_values:             change = (0,-1)         elif direction == 'L' and BOARDLENGTH-1 not in x_values:             change = (1,0)         else:             change = (0,0)         for i, coord in enumerate(self.coords):             self.previous_coords[i] = self.coords[i]              self.coords[i] = (coord[0] + change[0], coord[1] + change[1])      def rotate(self):         a, b = self.coords[0][0], self.coords[0][1]         x, y = self.coords[-1][0], self.coords[-1][1]          newx, newy = -(y-b)+a, (x-a)+b         if newy >= 0 and newx >= 0 and newy <= BOARDHEIGHT-1 and newx <= BOARDLENGTH-1:             for i, coord in enumerate(self.coords):                 self.previous_coords[i] = self.coords[i]                 self.coords[i] = (-(self.coords[i][1]-b)+a, (self.coords[i][0]-a)+b)      def show(self, board, hasprevious=True):         if hasprevious:             for pcoord in self.previous_coords:                 board[pcoord[1]][pcoord[0]] = '_'         for coord in self.coords:             board[coord[1]][coord[0]] = self.symbol         display_board = '\n'.join(' '.join(line) for line in board)         print(c.clear + display_board) #c.clear clears the screen         return board def hide(board,coords):     for coord in coords:         board[coord[1]][coord[0]] = '_'     return board  def choose_locations(board):     ships = [Ship(5,'A'),Ship(4,'B'),Ship(3,'c'),Ship(3,'C'),Ship(2,'D')]      finalcoords = []     for ship in ships:         board = ship.show(board,hasprevious=False)         while True:             key = getch.getch()             if key == 'w':                 ship.shift('U')                 board = ship.show(board)             elif key == 's':                 ship.shift('D')                  board = ship.show(board)             elif key == 'a':                 ship.shift('R')                  board = ship.show(board)             elif key == 'd':                     ship.shift('L')                  board = ship.show(board)             elif key == 'r':                 ship.rotate()                 board = ship.show(board)             elif key == 'q':                 exit()             elif key == '\r':                 intersection = list(set(ship.coords).intersection(finalcoords))                 if intersection == []:                     finalcoords += ship.coords                     board = hide(board,ship.coords)                     break                 else:                     print('''You already have a ship or part of a ship there.Your current coordinates are {} You have placed a ship on these coords, {}.  You overlapped on these coords: {}'''.format(ship.coords,finalcoords,intersection))             else:                 print('press w,a,s or d to move, and r to rotate. Press q to quit.')     return finalcoords if __name__ == '__main__':                     coords = choose_locations(board) 
        
   
   

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Aquí hay algunas observaciones:

  • No hay comentarios significativos o documentos de documentos (no siempre son necesarios, pero imagine que hay eso " Psychopath violento, que sabe dónde vive " leerá el código)
  • PEP8 Violaciones y hacer las cosas Pythonic:

    • línea en blanco entre los métodos de clase, dos líneas en blanco entre las funciones y las clases de nivel superior ( fuente )
    • Organización de importación correcta
    • el formato de comentarios en línea
    • denominación variable, si está definiendo una constante, tiene que haber un guión subrayado entre las palabras:

        BOARDLENGTH -> BOARD_LENGTH BOARDHEIGHT -> BOARD_HEIGHT   
    • Un espacio entre los argumentos después de una coma:

        ship.show(board, hasprevious=False)             HERE^   
    • No es necesario () después de la definición de clase
    • if intersection == []: se puede reescribir como if not intersection:
    • Simplifique la condición de IF dentro del método rotate() , reemplace:

        if newy >= 0 and newx >= 0 and newy <= BOARDHEIGHT-1 and newx <= BOARDLENGTH-1:   

      con:

        if 0 <= newx <= BOARDLENGTH - 1 and 0 <= newy <= BOARDHEIGHT - 1:   
  • Otras mejoras:

    • parece que no necesita hacer el size una variable de instancia: solo lo necesita en el constructor
    • ¿Qué sucede si en lugar de múltiples bloques repetitivo <> BOARDLENGTH -> BOARD_LENGTH BOARDHEIGHT -> BOARD_HEIGHT 0 dentro del BOARDLENGTH -> BOARD_LENGTH BOARDHEIGHT -> BOARD_HEIGHT 1 , usted crearía una asignación entre las teclas de acción y las instrucciones de cambio , por ejemplo:

        BOARDLENGTH -> BOARD_LENGTH BOARDHEIGHT -> BOARD_HEIGHT 2  

      Entonces, podemos mejorar la pieza que determina la dirección de cambio:

        BOARDLENGTH -> BOARD_LENGTH BOARDHEIGHT -> BOARD_HEIGHT 3  
 

Here are some observations:

  • no meaningful comments or docstrings (they are not always needed, but imagine there is that "violent psychopath, who knows where you live" will be reading the code)
  • PEP8 violations and making things Pythonic:

    • blank line between class methods, two blank lines between top-level functions and classes (source)
    • correct import organization
    • the inline comments formatting
    • variable naming, if defining a constant, there has to be an underscore between words:

      BOARDLENGTH -> BOARD_LENGTH BOARDHEIGHT -> BOARD_HEIGHT 
    • a space between arguments after a comma:

      ship.show(board, hasprevious=False)             HERE^ 
    • no need for extra () after the class definition
    • if intersection == []: can be rewritten as if not intersection:
    • simplify the if condition inside the rotate() method, replace:

      if newy >= 0 and newx >= 0 and newy <= BOARDHEIGHT-1 and newx <= BOARDLENGTH-1: 

      with:

      if 0 <= newx <= BOARDLENGTH - 1 and 0 <= newy <= BOARDHEIGHT - 1: 
  • other improvements:

    • looks like you don't need to make the size an instance variable - you only need it in the constructor
    • what if instead of multiple repetitive if/else blocks inside the choose_locations(), you would create a mapping between action keys and the shift directions, e.g.:

      ACTION_KEYS = {     'w': 'U',     's': 'D',     'a': 'R',     'd': 'L' } 

      Then, we can improve the part determining the shift direction:

      key = getch.getch() if key in ACTION_KEYS:     ship.shift(ACTION_KEYS[key])      board = ship.show(board) 
 
 

Relacionados problema

3  Programa de Battleship Python (2 jugadores o 1 jugador)  ( Python battleship program 2 player or 1 player ) 
Recientemente comencé a estudiar Python con un régimen de estudio mucho más pesado, quería que alguien revisara mi código para ver lo que pensaban. Tengo la l...

2  Acorazado en Python Tkinter  ( Battleship in python tkinter ) 
Soy muy nuevo en la programación GUI, y estoy bastante seguro de que lo estoy haciendo mal. Por favor, eche un vistazo a mi código y sugiera algunos cambios. ...

6  Diseño de un juego de acorazado simple en Python  ( Designing a simple battleship game in python ) 
Estoy tratando de codificar acorazado . Debe ser un juego de texto de un jugador contra la computadora donde el jugador de computadora y el jugador humano se...

4  Juego de acorazados  ( Game of battleship ) 
Estoy trabajando en un juego de Battleships de 2 jugadores en Python, aunque el juego es ligeramente buggy. A veces, no me permite jugar otro juego una vez qu...

7  Battleship Simple escrito en Python  ( Simple battleship written in python ) 
Agradecería los comentarios sobre mi primer juego de acorazados escrito en Python para mi introducción a la clase de programación. Aquí está el código, lo ú...

5  Java Battleship juego  ( Java battleship game ) 
Me han dado una declaración de problemas para crear un juego de acorazados en Java. Mi código de trabajo (Spring Boot + Web) se coloca aquí junto con la dec...

4  Juego de Battleship Modificado con sede en consola de 2 jugadores  ( 2 player console based modified battleship game ) 
He escrito un código simple utilizando la lista de matriz, el escáner y la cadena para desarrollar un juego de acorazados de 2 jugadores basado en una consola...

5  Función de verificación de la colocación de la nave para el juego Battleship  ( Ship placement verification function for battleship game ) 
Escribí un simulador de juego de Battleship Side Side en Nodejs / Javascript: Un jugador aleatorio que comienza es elegido. ambos jugadores colocan sus b...

11  Juego de Blattleship Principiante en Python / Terminal  ( Beginner battleship game in python terminal ) 
Estoy aprendiendo a programar y durante el curso de Python en codecademy i fue animado para reescribirlo todo con nuevo Características (2 jugadores, vari...

4  MAPA INICIAL MODELADO PARA EL JUEGO DE BATTESIO  ( Initial map modelling for battleship game ) 
El objetivo del código a continuación se limita a la creación del mapa inicial solamente y no a toda la mecánica del juego. Las reglas son que hay 4 barco...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos