2015-02-24 76 views
0

我正在使用python 3并遵循[tutorial] [1]。我遇到了问题,我的蛇也没有动。它呼吁vec_add)无效的语法(当我删除一些括号,我得到:Python蛇游戏数学

Traceback (most recent call last): 
    File "_ctypes/callbacks.c", line 234, in 'calling callback function' 
    File "C:\Python34\lib\site-packages\OpenGL\GLUT\special.py", line 164, in deregister 
    function(value) 
    File "C:/Users/jay/Desktop/Python/OpenGL/Snake Game.py", line 51, in update 
    snake.insert(0, vec_add(snake[0], snake_dir))  # insert new position in the beginning of the snake list 
TypeError: vec_add() missing 2 required positional arguments: 'x2' and 'y2' 

蛇应该向右移动。

from OpenGL.GL import * 
from OpenGL.GLUT import * 
from OpenGL.GLU import * 

window = 0            # glut window number 
width, height = 500, 500        # window size 
field_width, field_height = 50, 50      # internal resolution 
snake = [(20, 20)]          # snake list of (x, u) positions 
snake_dir = (1, 0)          # snake movement direction 
#Note: snake dir (1, 0) means that its current movement 
#direction is x=1 and y=0, which means it moves to the right. 
interval = 200 # update interval in milliseconds 

def vec_add((x1, y1), (x2, y2)):  
    return (x1 + x2, y1 + y2) 


def refresh2d_custom(width, height, internal_width, internal_height): 
    glViewport(0, 0, width, height) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(0.0, internal_width, 0.0, internal_height, 0.0, 1.0) 
    glMatrixMode (GL_MODELVIEW) 
    glLoadIdentity() 

def draw_rect(x, y, width, height): 
    glBegin(GL_QUADS)         # start drawing a rectangle 
    glVertex2f(x, y)         # bottom left point 
    glVertex2f(x + width, y)       # bottom right point 
    glVertex2f(x + width, y + height)     # top right point 
    glVertex2f(x, y + height)       # top left point 
    glEnd()           # done drawing a rectangle 

def draw_snake(): 
    glColor3f(1.0, 1.0, 1.0) # set color to white 
    for x, y in snake:  # go through each (x, y) entry 
     draw_rect(x, y, 1, 1) # draw it at (x, y) with width=1 and height=1 


def draw():           # draw is called all the time 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # clear the screen 
    glLoadIdentity()         # reset position 
    refresh2d_custom(width, height, field_width, field_height) 

    draw_snake() 

    glutSwapBuffers()         # important for double buffering 


def update(value): 
    snake.insert(0, vec_add(snake[0], snake_dir))  # insert new position in the beginning of the snake list 
    snake.pop()          # remove the last element 

    glutTimerFunc(interval, update, 0)     # trigger next update 


# initialization 
glutInit()            # initialize glut 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 
glutInitWindowSize(width, height)      # set window size 
glutInitWindowPosition(0, 0)       # set window position 
window = glutCreateWindow(b"noobtuts.com")    # create window with title 
glutDisplayFunc(draw)         # set draw function callback 
glutIdleFunc(draw)          # draw all the time 
glutTimerFunc(interval, update, 0)      # trigger next update 
glutMainLoop()           # start everything 

回答

0

在这个函数:

def vec_add((x1, y1), (x2, y2)):  
    return (x1 + x2, y1 + y2) 

Python不支持函数参数列表解构。所以,你可以写这样的:

def vec_add(p1, p2):  
    return (p1[0] + p2[0], p1[1] + p2[1]) 

这是与您现有的呼叫vec_add兼容。

+0

谢谢,我真的很感激它! – Joe 2015-02-24 01:33:44

0

使用普通的元组来存储&操纵坐标是很好的,但是你可能会发现指定的元组是一个更方便的数据结构。命名元组的元素可以通过名称或索引来访问,并且作为一个命名元组,可以为其添加自定义方法。

下面是一个简短演示,它向2元素名称元组添加矢量加法和减法方法,它还增加了一个有用的__str__方法。通过定义__add____sub__,我们可以简单地通过使用+-运算符来执行矢量加法和减法,比使用显式函数调用更容易输入(和读取)。

#!/usr/bin/env python 

from collections import namedtuple 

Vector = namedtuple('Vector', ['x', 'y']) 

Vector.__str__ = lambda self: 'Vector({s.x}, {s.y})'.format(s=self) 
Vector.__add__ = lambda self, other: Vector(self.x + other.x, self.y + other.y) 
Vector.__sub__ = lambda self, other: Vector(self.x - other.x, self.y - other.y) 

snake = [Vector(20, 20)] 
snake_dir = Vector(x=1, y=0) 
print(snake_dir.x) 
print(snake[0] + snake_dir) 

输出

1 
Vector(21, 20) 

参见namedtuple用于进一步信息Python文档;这里是这些文档的Python 3 version

您也可以从头开始定义您自己的Vector或Point类,如this answer。如果你想存储很多点,你可能希望将__slots__ =()添加到你的类定义中,以最大限度地减少内存使用量,正如在Python 2命名的元组文档中提到的那样。