如何使用python制作贪吃蛇大冒险,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
贪吃蛇,大家应该都玩过。当初第一次接触贪吃蛇的时候 ,还是我爸的数字手机,考试成绩比较好,就会得到一些小奖励,玩手机游戏肯定也在其中首位,毕竟小孩子天性都喜欢~
当时都能玩的不亦乐乎。今天,我们用Python编程一个贪吃蛇游戏哦~
1.将使用两个主要的类(蛇和立方体)。
#Snake Tutorial Python import math import random import pygame import tkinter as tk from tkinter import messagebox class cube(object): rows = 20 w = 500 def __init__(self,start,dirnx=1,dirny=0,color=(255,0,0)): pass def move(self, dirnx, dirny): pass def draw(self, surface, eyes=False): pass class snake(object): def __init__(self, color, pos): pass def move(self): pass def reset(self, pos): pass def addCube(self): pass def draw(self, surface): pass def drawGrid(w, rows, surface): pass def redrawWindow(surface): pass def randomSnack(rows, item): pass def message_box(subject, content): pass def main(): pass main()
2.创造游戏循环:
在所有的游戏中,我们都有一个叫做“主循环”或“游戏循环”的循环。该循环将持续运行,直到游戏退出。它主要负责检查事件,并基于这些事件调用函数和方法。
我们将在main()功能。在函数的顶部声明一些变量,然后进入while循环,这将代表我们的游戏循环。
def main(): global width, rows, s width = 500 # Width of our screen height = 500 # Height of our screen rows = 20 # Amount of rows win = pygame.display.set_mode((width, height)) # Creates our screen object s = snake((255,0,0), (10,10)) # Creates a snake object which we will code later clock = pygame.time.Clock() # creating a clock object flag = True # STARTING MAIN LOOP while flag: pygame.time.delay(50) # This will delay the game so it doesn't run too quickly clock.tick(10) # Will ensure our game runs at 10 FPS redrawWindow(win) # This will refresh our screen
3.更新屏幕:通常,在一个函数或方法中绘制所有对象是一种很好的做法。我们将使用重绘窗口函数来更新显示。我们在游戏循环中每一帧调用一次这个函数。稍后我们将向该函数添加更多内容。然而,现在我们将简单地绘制网格线。
def redrawWindow(surface): surface.fill((0,0,0)) # Fills the screen with black drawGrid(surface) # Will draw our grid lines pygame.display.update() # Updates the screen
4.绘制网格:现在将绘制代表20x20网格的线条。
def drawGrid(w, rows, surface): sizeBtwn = w // rows # Gives us the distance between the lines x = 0 # Keeps track of the current x y = 0 # Keeps track of the current y for l in range(rows): # We will draw one vertical and one horizontal line each loop x = x + sizeBtwn y = y + sizeBtwn pygame.draw.line(surface, (255,255,255), (x,0),(x,w)) pygame.draw.line(surface, (255,255,255), (0,y),(w,y))
5.现在当我们运行程序时,我们可以看到网格线被画出来。
6.开始制作贪吃蛇:蛇对象将包含一个代表蛇身体的立方体列表。我们将把这些立方体存储在一个名为body的列表中,它将是一个类变量。我们还将有一个名为turns的类变量。为了开始蛇类,对__init__()方法并添加类变量。
class snake(object): body = [] turns = {} def __init__(self, color, pos): self.color = color self.head = cube(pos) # The head will be the front of the snake self.body.append(self.head) # We will add head (which is a cube object) # to our body list # These will represent the direction our snake is moving self.dirnx = 0 self.dirny = 1
7.这款游戏最复杂的部分就是翻蛇。我们需要记住我们把我们的蛇转向了哪里和哪个方向,这样当头部后面的立方体到达那个位置时,我们也可以把它们转向。这就是为什么每当我们转向时,我们会将头部的位置添加到转向字典中,其中值是我们转向的方向。这样,当其他立方体到达这个位置时,我们就知道如何转动它们了。
class snake(object): ... def move(self): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() keys = pygame.key.get_pressed() for key in keys: if keys[pygame.K_LEFT]: self.dirnx = -1 self.dirny = 0 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_RIGHT]: self.dirnx = 1 self.dirny = 0 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_UP]: self.dirnx = 0 self.dirny = -1 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_DOWN]: self.dirnx = 0 self.dirny = 1 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] for i, c in enumerate(self.body): # Loop through every cube in our body p = c.pos[:] # This stores the cubes position on the grid if p in self.turns: # If the cubes current position is one where we turned turn = self.turns[p] # Get the direction we should turn c.move(turn[0],turn[1]) # Move our cube in that direction if i == len(self.body)-1: # If this is the last cube in our body remove the turn from the dict self.turns.pop(p) else: # If we are not turning the cube # If the cube reaches the edge of the screen we will make it appear on the opposite side if c.dirnx == -1 and c.pos[0] <= 0: c.pos = (c.rows-1, c.pos[1]) elif c.dirnx == 1 and c.pos[0] >= c.rows-1: c.pos = (0,c.pos[1]) elif c.dirny == 1 and c.pos[1] >= c.rows-1: c.pos = (c.pos[0], 0) elif c.dirny == -1 and c.pos[1] <= 0: c.pos = (c.pos[0],c.rows-1) else: c.move(c.dirnx,c.dirny) # If we haven't reached the edge just move in our current direction
8.画蛇:我们只需画出身体中的每个立方体对象。我们将在蛇身上做这个绘制()方法。
class snake(object): ... def draw(self): for i, c in enumerate(self.body): if i == 0: # for the first cube in the list we want to draw eyes c.draw(surface, True) # adding the true as an argument will tell us to draw eyes else: c.draw(surface) # otherwise we will just draw a cube
9.结束游戏当我们的蛇物体与自己碰撞时,我们就输了。为了检查这一点,我们在main()游戏循环中的功能。
for x in range(len(s.body)): if s.body[x].pos in list(map(lambda z:z.pos,s.body[x+1:])): # This will check if any of the positions in our body list overlap print('Score: ', len(s.body)) message_box('You Lost!', 'Play again...') s.reset((10,10)) break
10.蛇类–重置()方法现在我们将对重置()方法。所有这些将会做的是重置蛇,这样我们可以在之后再次玩。
class snake(): ... def reset(self, pos): self.head = cube(pos) self.body = [] self.body.append(self.head) self.turns = {} self.dirnx = 0 self.dirny = 1
下面我们先看看效果:
好了?蛇蛇大作战就写完啦!
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。