保姆级python教程写个贪吃蛇大冒险

作者:顾木子吖 时间:2022-06-23 17:12:39 

导语

保姆级python教程写个贪吃蛇大冒险

贪吃蛇,大家应该都玩过。当初第一次接触贪吃蛇的时候 ,还是我爸的数字手机,考试成绩比较好,就会得到一些小奖励,玩手机游戏肯定也在其中首位,毕竟小孩子天性都喜欢~

保姆级python教程写个贪吃蛇大冒险

当时都能玩的不亦乐乎。今天,我们用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.现在当我们运行程序时,我们可以看到网格线被画出来。

保姆级python教程写个贪吃蛇大冒险

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

下面我们先看看效果:

保姆级python教程写个贪吃蛇大冒险

来源:https://blog.csdn.net/weixin_55822277/article/details/120044335

标签:python,贪吃蛇,大冒险
0
投稿

猜你喜欢

  • 使用python开发vim插件及心得分享

    2023-11-22 11:30:32
  • 如何用Python搭建gRPC服务

    2023-02-08 16:00:54
  • Yii2 assets清除缓存的方法

    2024-05-13 09:51:47
  • Python descriptor(描述符)的实现

    2021-12-22 09:07:56
  • pandas对指定列进行填充的方法

    2022-03-15 07:52:51
  • 使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)

    2023-07-01 06:32:45
  • kali2021.4a使用virtualenv安装angr的详细过程

    2022-10-15 12:39:00
  • 使用Template格式化Python字符串的方法

    2021-08-07 14:42:35
  • 一文带你看懂Vue Hook和React Hook

    2024-04-22 13:24:02
  • vue实现验证码倒计时按钮

    2024-04-09 10:49:05
  • 利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel

    2023-09-04 13:50:42
  • python实现简单的计时器功能函数

    2023-02-13 08:33:55
  • 浅谈Scrapy网络爬虫框架的工作原理和数据采集

    2023-08-24 22:17:21
  • XML文件的显示——CSS和XSL

    2007-10-15 18:48:00
  • vue组件watch属性实例讲解

    2024-05-09 15:19:22
  • 基于vue-upload-component封装一个图片上传组件的示例

    2024-05-10 14:14:42
  • Python 如何将integer转化为罗马数(3999以内)

    2023-01-19 12:46:51
  • Perl初学笔记之Hello World

    2022-05-21 10:28:55
  • Python爬虫之m3u8文件里提取小视频的正确姿势

    2021-07-05 18:02:41
  • mysql 插入优化

    2010-12-14 15:29:00
  • asp之家 网络编程 m.aspxhome.com