python_不误正业之贪吃蛇
时间:2022-07-25
本文章向大家介绍python_不误正业之贪吃蛇,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
python贪吃蛇
概述
一直以来就想学这个,玩玩看 教程来自B站python学习者
备注:年前完成,20200818测试
代码
# -*- coding: utf-8 -*-
import sys # 系统交互的模块
import random # 随机产生食物的位置
import pygame # 开发游戏的模块,需要额外pip安装
screen_x = 600 # 界面大小
screen_y = 600 # 界面大小
# 添加类
# 蛇
class Snake(object):
# 属性 1.初始化蛇的长度
# 2.蛇开始的位置
def __init__(self):
# 默认初始方向和长度
self.direction = pygame.K_RIGHT # 蛇的方向
self.body = [] # 蛇的长度
for x in range(5):
self.addnode()
# 行为:1.吃食物
# 2.死亡
# 3.移动
# 4.方向
def addnode(self):
# 设置初始化蛇的位置
left, top = (0, 0)
if self.body:
left, top = (self.body[0].left, self.body[0].top)
node = pygame.Rect(left, top, 25, 25)
if self.direction == pygame.K_LEFT:
node.left -= 25
if self.direction == pygame.K_RIGHT:
node.left += 25
elif self.direction == pygame.K_UP:
node.top -= 25
elif self.direction == pygame.K_DOWN:
node.top += 25
self.body.insert(0, node)
# 移动后删除原始位置像素点
def delnode(self):
self.body.pop()
# 死亡方法
def isdead(self):
# 撞墙
if self.body[0].x not in range(screen_x):
return True
if self.body[0].y not in range(screen_y):
return True
# 撞自己
if self.body[0] in self.body[1:]:
return True
return False
# 移动
def move(self):
self.addnode()
self.delnode()
# 改变方向
def changedirection(self, curkey):
LR = [pygame.K_LEFT, pygame.K_RIGHT]
UD = [pygame.K_UP, pygame.K_DOWN]
if curkey in LR + UD:
# 如果键盘为左右,蛇身子为左右则不执行
if (curkey in LR) and (self.direction in LR):
return
# 如果键盘为上下,蛇身子为上下则不执行
if (curkey in UD) and (self.direction in UD):
return
# 其他情况为键盘
self.direction = curkey
# 食物
class Food:
def __init__(self):
# 初始化位置
self.rect = pygame.Rect(-25, 0, 25, 25)
def remove(self):
self.rect.x = -25
def set(self):
if self.rect.x == -25:
allpos = []
# 不能靠墙太近
for pos in range(25, screen_x-25, 25):
allpos.append(pos)
self.rect.left = random.choice(allpos)
self.rect.top = random.choice(allpos)
print(self.rect)
# 主函数核心
def main():
pygame.init() # 游戏初始化
# 定义游戏界面大小
screen_size = (screen_x, screen_y)
# 返回到界面
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption("瞎的贪吃蛇") # 窗口标题
clock = pygame.time.Clock() # 游戏的刷新频率
scores = 0 # 初始成绩
isdead = False # 死亡
snake = Snake()
food = Food()
while True:
for event in pygame.event.get():
# 如果退出
if event.type == pygame.QUIT:
sys.exit()
# 如果键盘事件
if event.type == pygame.KEYDOWN:
snake.changedirection(event.key)
# 如果没死和按空格返回游戏
if event.key == pygame.K_SPACE and isdead:
return main()
# 填充主板颜色
screen.fill((255, 255, 255))
# 画蛇身体
if not isdead:
snake.move()
for rect in snake.body:
pygame.draw.rect(screen, (20, 220, 39), rect, 0)
# 显示死亡文字
isdead = snake.isdead()
if isdead:
show_text(screen, (100, 100), "you dead!", (227, 29, 18), False, 100)
show_text(
screen, (150, 260), "press space to try again", (0, 0, 22), False, 30
)
# 食物处理,吃到+1
# 如果蛇头和食物重叠,则运行
if food.rect == snake.body[0]:
scores += 50
food.remove()
snake.addnode()
# 添加新的食物
food.set()
pygame.draw.rect(screen, (136, 0, 24), food.rect, 0)
# 显示分数文字
show_text(screen, (50, 500), "Scores: " + str(scores), (223, 223, 223))
# 更新
pygame.display.update()
clock.tick(10)
def show_text(
screen, pos, text, color, font_bold=False, font_size=60, font_italic=False):
# 获取系统字体,设置大小
cur_font = pygame.font.SysFont("宋体", font_size)
# 设置粗体
cur_font.set_bold(font_bold)
# 设置斜体
cur_font.set_italic(font_italic)
# 设置文字内容
text_fmt = cur_font.render(text, 1, color)
# 绘制文字
screen.blit(text_fmt, pos)
# 调用函数
main()
测试结果
游戏测试结果
运行测试
死亡测试
得分测试
结束语
这几天心情颇不宁静,静下心来写点东西总是很难,思来想去,幸福的生活是一样的,不幸福的生活各式各样。
北京,我又要回来了。
- 【专知-关关的刷题日记16】Leetcode 88. Merge Sorted Array
- [接口测试 - 基础篇] 06 好吧也来解析下html
- [接口测试 - 基础篇] 05 好讨厌的xml解析
- 【专知-关关的刷题日记17】Leetcode 268. Missing Number
- 【专知-关关的刷题日记18】Leetcode 35. Search Insert Position
- [接口测试 - http.client篇] 15 常用API说明及基本的示例
- [接口测试 - http.client篇] 14 源码初探及其工作机制分析
- 【专知-关关的刷题日记19】Leetcode 118. Pascal's Triangle
- 每周学点大数据 | No.3算法设计与分析理论
- HDU 1874 畅通工程续【Floyd算法实现】
- 接口测试 | 21 基于flask弄个restful API服务出来
- 数论部分第二节:埃拉托斯特尼筛法 埃拉托斯特尼筛法
- [接口测试 -基础篇] 20 用flask写一个简单server用于接口测试
- 接口测试 | urllib篇 19 urllib基本示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现简易计算器功能
- DataFrame 数据合并实现(merge,join,concat)
- PHP ajax+jQuery 实现批量删除功能实例代码小结
- python对execl 处理操作代码
- Python手动或自动协程操作方法解析
- 什么是python的自省
- python Socket网络编程实现C/S模式和P2P
- keras 多任务多loss实例
- 什么是python的必选参数
- python进程与线程小结实例分析
- PHP集成环境XAMPP的安装与配置
- Python socket服务常用操作代码实例
- Python select及selectors模块概念用法详解
- keras使用Sequence类调用大规模数据集进行训练的实现
- python的json包位置及用法总结