Игра змея в Python


Я биолог. Некоторое время назад я хотел научиться программировать, а так как я увлеклась 4-го измерения, и я был очарован rotatation в гиперкубах и гиперсферы, поэтому я решил, чтобы лучше ее понять, и благодаря работе Стива Hollasch, я понял, что люди не могут "видеть" 4-е измерение, только проект в 3-мерном мире.

В любом случае, после нахождения функции в проекте 4-го измерения, я хотел сделать что-то взаимодействующее с ней, то где можно узнать где и каким образом объект перемещается в 4-мерном пространстве. Поэтому я придумал идею простой игры: змея.

snake4d

Можете ли вы пожалуйста прокомментировать код?

__author__ = "Mauro Pellanda"
__credits__ = ["Mauro Pellanda"]
__license__ = "GNU"
__version__ = "1.1.0"
__maintainer__ = "Mauro Pellanda"
__email__ = "pmauro@ethz.ch"
__status__ = "Devlopment"


''' In this file is contained the snake definition'''

def get_random_color():
    return "#%02x%02x%02x" % (random.randrange(0,255), random.randrange(0,255), random.randrange(0,255))

from vec import *
import time


class Snake:

    def __init__(self):
        self.head_pos = V4(0,0,0,0) #position of the head
        self.head_dir ="UP" #direction of the head
        self.p_list = [] #store the polygon of the snake
        self.score = 0 #score
        self.score2 = 0 #number of cube taken
        self.time = 0. #boh
        self.color = [0, 255, 0] #color
        self.color_var = "up" #Variable to circulary change color


    def create_cube(self,point):
        '''This function return the polygon coordinates in a
        determined postion defined by point'''
        #calculate coordinates
        v = V4(.4,.4,.4,.4)
        higher = sum4(point,v)
        lower = sub4(point,v)
        c = cube4d(lower,higher)
        #calculate the color
        if self.color_var == "up":          
            self.color[0] += 20
            if self.color[0] > 255-21:
                self.color_var = "down"
        elif self.color_var == "down":
            self.color[0] -= 20
            if self.color[0] < 21:
                self.color_var = "up"           
        color_tuple = (self.color[0],self.color[1],self.color[2])
        c.color = "#%02x%02x%02x" % color_tuple
        #add the tag for the canvas (not used in this version)
        c.tag = "snake"
        return c

    def initialize_snake(self):
        '''it initialize the snake at the original position with 4 cubes'''
        self.__init__()
        size = 4
        for x in range(size+1):
            point = V4(0,-(size-x),0,0)
            self.p_list.append(self.create_cube(point))

    def move(self,dir):
        '''check if is a valid move in that direction, the snake cannot go
        in opposite direction'''
        no_move = False
        if dir == "UP" and self.head_dir != "DOWN":
            dir_v = V4(0,1,0,0)
        elif dir == "DOWN" and self.head_dir != "UP":
            dir_v = V4(0,-1,0,0)
        elif dir == "LEFT" and self.head_dir != "RIGHT":
            dir_v = V4(-1,0,0,0)
        elif dir == "RIGHT" and self.head_dir != "LEFT":
            dir_v = V4(1,0,0,0)
        elif dir == "FW" and self.head_dir != "RW":
            dir_v = V4(0,0,1,0)
        elif dir == "RW" and self.head_dir != "FW":
            dir_v = V4(0,0,-1,0)
        elif dir == "IN" and self.head_dir != "OUT":
            dir_v = V4(0,0,0,-1)
        elif dir == "OUT" and self.head_dir != "IN":
            dir_v = V4(0,0,0,1)
        else:
            no_move = True

        if not no_move:
            #move the snake, and append a new polygon in the new position,
            #take off the polygon from the tail, the snake is stored in the
            #list like this: [tail,->,head]
            self.head_pos = sum4(self.head_pos, dir_v)
            self.head_dir = dir
            self.p_list.pop(0)
            self.p_list.append(self.create_cube(self.head_pos))
  1. Такие комментарии полезны для понимания того, что я сделал?
  2. У вас есть какие-либо предложения о стиле программирования и/или алгоритмов?

Вот это загрузка полного источника.



7510
6
задан 15 сентября 2011 в 12:09 Источник Поделиться
Комментарии
1 ответ

__author__ = "Mauro Pellanda"
__credits__ = ["Mauro Pellanda"]
__license__ = "GNU"
__version__ = "1.1.0"
__maintainer__ = "Mauro Pellanda"
__email__ = "pmauro@ethz.ch"
__status__ = "Devlopment"

''' In this file is contained the snake definition'''

Для этого должен быть признан строкой документации, я думаю, он должен быть первым делом в файл.

def get_random_color():
return "#%02x%02x%02x" % (random.randrange(0,255), random.randrange(0,255), random.randrange(0,255))

from vec import *
import time

импорт, как правило, размещаются перед определениями функций

class Snake:

Если вы работаете с Python 2.X, я рекомендую вам сделать ваши классы наследуют от Object. Таким образом, они новые классы стилей.

    def __init__(self):
self.head_pos = V4(0,0,0,0) #position of the head
self.head_dir ="UP" #direction of the head

Используя что-то вроде этой строки-это немного странно. Я предлагаю логическое значение или целое число.

        self.p_list = [] #store the polygon of the snake
self.score = 0 #score
self.score2 = 0 #number of cube taken
self.time = 0. #boh
self.color = [0, 255, 0] #color

Я бы сделала цвет кортеж. Списки для хранения, ну и списки, не связанных элементов, таких как цвета. Я знаю, что вы делаете это так, вы можете изменить его. Но я буду создавать новые кортежи каждый раз, когда я изменил цвет.

        self.color_var = "up" #Variable to circulary change color

Против строки нечетной, если ее на самом деле текст. Это займет немного больше времени, чтобы сравнивать строки потом говорят ИНЦ или рисовые шарики.

    def create_cube(self,point):
'''This function return the polygon coordinates in a
determined postion defined by point'''

Как правило, первый "и окончательной" размещаются на отдельной строке
для многострочные комментарии

        #calculate coordinates
v = V4(.4,.4,.4,.4)
higher = sum4(point,v)
lower = sub4(point,v)
c = cube4d(lower,higher)
#calculate the color
if self.color_var == "up":
self.color[0] += 20
if self.color[0] > 255-21:
self.color_var = "down"
elif self.color_var == "down":
self.color[0] -= 20
if self.color[0] < 21:
self.color_var = "up"
color_tuple = (self.color[0],self.color[1],self.color[2])

Вы можете просто сделать color_tuple = кортежа(самовыдвижение.цвет)

        c.color = "#%02x%02x%02x" % color_tuple

Вы продублировали Кортеж в строку логики здесь и в случайный цвет. Я предлагаю рефакторинг, так что они разделяют его.

        #add the tag for the canvas (not used in this version)
c.tag = "snake"
return c

def initialize_snake(self):
'''it initialize the snake at the original position with 4 cubes'''
self.__init__()

Никогда не делай этого. __инит__ вызывается, когда объект будет построен. Вы не должны называть его позже. Питон позволит вам, но никто не ожидает, что вы сделать это, и вы несете ответственность, чтобы запутать людей.

        size = 4
for x in range(size+1):
point = V4(0,-(size-x),0,0)
self.p_list.append(self.create_cube(point))

def move(self,dir):
'''check if is a valid move in that direction, the snake cannot go
in opposite direction'''
no_move = False
if dir == "UP" and self.head_dir != "DOWN":
dir_v = V4(0,1,0,0)
elif dir == "DOWN" and self.head_dir != "UP":
dir_v = V4(0,-1,0,0)
elif dir == "LEFT" and self.head_dir != "RIGHT":
dir_v = V4(-1,0,0,0)
elif dir == "RIGHT" and self.head_dir != "LEFT":
dir_v = V4(1,0,0,0)
elif dir == "FW" and self.head_dir != "RW":
dir_v = V4(0,0,1,0)
elif dir == "RW" and self.head_dir != "FW":
dir_v = V4(0,0,-1,0)
elif dir == "IN" and self.head_dir != "OUT":
dir_v = V4(0,0,0,-1)
elif dir == "OUT" and self.head_dir != "IN":
dir_v = V4(0,0,0,1)
else:
no_move = True

Цепи elifs знак, чтобы искать лучшее решение. Например, вы могли бы directionts картографическая словарь противоположностей и векторов. Тогда тебе просто нужно принести из словаря.

        if not no_move:

Двойное отрицание, учитывать инвертирование логики на no_move так он будет тронут.

            #move the snake, and append a new polygon in the new position,
#take off the polygon from the tail, the snake is stored in the
#list like this: [tail,->,head]
self.head_pos = sum4(self.head_pos, dir_v)
self.head_dir = dir
self.p_list.pop(0)
self.p_list.append(self.create_cube(self.head_pos))

10
ответ дан 15 сентября 2011 в 07:09 Источник Поделиться