刚结束期末考试,闲来无事,便尝试着做个贪吃蛇玩玩。
起初尚是不明所以,但在看了另一个老哥的文章用python写一个简单的贪吃蛇游戏(附代码)之后,豁然开朗。
我的代码大体采用了这位老哥的框架,但采取了与之不同的面向对象的实现方式。并且我的代码实现了贪吃蛇穿墙移动(从一头进,在另一头出)的操作。
但是写完之后实际看看还是有比较大的上升空间的,例如可以把蛇和苹果的绘制放到”蛇“类和”苹果“类当中去。只是练习作,如果有更好的意见欢迎畅所欲言。
代码实现
“蛇”类:用于实现蛇对象(本质为队列)
class Snake:
def __init__(self) -> None:
self._sn = deque()
self._sn.append([2, 2])
self._sn.append([1, 2])
self._sn.append([0, 2])
self.directionX = 1
self.directionY = 0
def pushBack(self, nextStep : list) -> None:
self._sn.appendleft(nextStep)
def pop(self) -> None:
self._sn.pop()
def __len__(self) -> int:
return len(self._sn)
def getSn(self) -> deque:
return self._sn
”苹果“类: 用于实现苹果对象
class Apple:
def __init__(self, snake : Snake):
self._x = random.randint(0, screenWidth // 20 - 1)
self._y = random.randint(2, screenHeight // 20 - 1)
while [self._x, self._y] in snake.getSn():
self._x = random.randint(0, screenWidth // 20 - 1)
self._y = random.randint(2, screenHeight // 20 - 1)
def getX(self) -> int:
return self._x
def getY(self) -> int:
return self._y
”计数“类:用于计量游戏数值(得分,速度)
class ScoreAndSpeed:
def __init__(self):
self._score = 0
self._oriSpeed = 0.5
self._speed = self._oriSpeed
def getScore(self) -> int:
return self._score
def setScore(self, score : int):
self._score = score
def getOriSpeed(self) -> float:
return self._oriSpeed
def getSpeed(self) -> float:
return self._speed
def setSpeed(self, speed : float):
self._speed = speed
”游戏“类:用于实现游戏画面和相关功能
class Game:
def __init__(self):
pygame.init()
self.myWindow = pygame.display.set_mode((screenWidth, screenHeight), 0, 32)
pygame.display.set_caption("Snake")
self.myWindow.fill((0, 0, 0))
pygame.display.update()
self.font_score = pygame.font.SysFont('SimHei', 24)
self.font_Length = pygame.font.SysFont('SimHei', 24)
self.font_GameOver = pygame.font.SysFont(None, 72)
self.font_Beginning = pygame.font.SysFont(None, 48)
self.color_GameOver = (255, 255, 255)
# self.directionX = 1
# self.directionY = 0
self.directionLimit = True
self.isGameOver = True
self.isStart = False
# self.score = 0
# self.oriSpeed = 0.5
self.lastMove = time.time()
self.isPause = False
self.snake = Snake()
self.apple = Apple(self.snake)
self.scoreAndSpeed = ScoreAndSpeed()
self.speed = self.scoreAndSpeed.getOriSpeed()
def fontPrinter(self, font, x, y, text, fcolor = (255, 255, 255)):
Textimg = font.render(text, True, fcolor)
self.myWindow.blit(Textimg, (x, y))
def runing(self):
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()