保姆级python教程写个贪吃蛇大冒险
作者:顾木子吖 发布时间:2022-06-23 17:12:39
导语
贪吃蛇,大家应该都玩过。当初第一次接触贪吃蛇的时候 ,还是我爸的数字手机,考试成绩比较好,就会得到一些小奖励,玩手机游戏肯定也在其中首位,毕竟小孩子天性都喜欢~
当时都能玩的不亦乐乎。今天,我们用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
下面我们先看看效果:
来源:https://blog.csdn.net/weixin_55822277/article/details/120044335
猜你喜欢
- 项目结构├── node_modules # 项目依赖包目录├── build &nb
- 一、 [::-1]import numpy as npimport numpy as npx = np.arange(1, 6)print(
- UUID 全称是 Universally unique identifier,它是一种识别符,使用任意的计算机都可以生成,不需要一个中央数据
- tornado 里面没有 session?不,当然有~我知道 github 上肯定有人帮我写好了~ O(∩_∩)O~
- 作为免费又高效的数据库,mysql基本是首选。良好的安全连接,自带查询解析、sql语句优化,使用读写锁(细化到行)、事物隔离和多版本并发控制
- 用途:将UTF-8编码汉字转换为GB2312码,兼容英文和数字版权:虽说是原创,其实也参考了別人的部分算法asp源代码:<% 
- 使用Tkinter(py2.7)text文本框中输入内容在界面中显示–较为规整的代码:import Tkinter as tkclass W
- 1.背景项目需求,要求获得github的repo的api,以便可以提取repo的数据进行分析。研究了一天,终于解决了这个问题,虽然效率还是比
- 本文实例讲述了Python面向对象之接口、抽象类与多态。分享给大家供大家参考,具体如下:接口类继承有两种用途:一:继承基类的方法,并且做出自
- 游标游标(Cursor)是用于查看或者处理结果集中的数据的一种方法。游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。游标的使用
- maketrans()方法返回的字符串intab每个字符映射到字符的字符串outtab相同位置的转换表。然后这个表被传递到tra
- python中向上取整可以用ceil函数,ceil函数是在math模块下的一个函数。向上取整需要用到 math 模块中的 ceil() 方法
- 简介PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库PyMySQL 遵循 Python 数据库 API
- 一.docx模块Python可以利用python-docx模块处理word文档,处理方式是面向对象的。也就是说python-docx模块会把
- Pytorch多GPU运行设置可用GPU环境变量。例如,使用0号和1号GPU'os.environ["CUDA_VISIB
- 有的时候,我们在网页中会用到复选框,也就是多选框,当用户提交输入信息的时候我们会获取复选框的内容,然后保存到数据库中,如经常用到的是用户输入
- 逻辑门是任何数字电路的基本构建块。它需要一两个输入并根据这些输入产生输出。输出可能为高 (1) 或低 (0)。逻辑门使用二极管或晶体管实现。
- 一、 技术要点 我们都知道Windows应用程序在运行时会启动一个进程,其总包括若干线程,不同的进程之间通信是开发分布
- 在做项目的时候因为数据比较多,一次性全部渲染的话会花费较多的时间,所以,想到每一次渲染10条数据也想过每一次获取十条数据然后显示就行了,就目
- 本文实例讲述了Python使用sorted排序的方法。分享给大家供大家参考,具体如下:# 例1. 按照元素出现的次数来排序seq = [2,