网站建设 部署与发布/互联网营销专家
文章目录
- 效果图:
- 项目目录结构
- main.py
- game/apple.py
- game/base.py
- game/snake.py
- constant.py
效果图:
项目目录结构
main.py
from snake.game.apple import Apple # 导入苹果类
from snake.game.base import * # 导入游戏基类
from snake.game.snake import Snake # 导入蛇类class SnakeGame(GameBase):"""贪吃蛇游戏"""def __init__(self):"""初始化游戏"""super(SnakeGame, self).__init__(game_name=GAME_NAME, icon=ICON, # 调用基类的初始化方法screen_size=SCREEN_SIZE,display_mode=DISPLAY_MODE,loop_speed=LOOP_SPEED,font_size=FONT_SIZE,background=WHITE,font_name=None)# 绘制背景self.prepare_background()# 创建游戏对象self.apple_count = 0 # 苹果计数器self.high_score = 0 # 记录最高分self.snake = Snake(self) # 创建蛇对象self.apple = Apple(self) # 创建苹果对象# 绑定按键事件self.add_key_binding(KEY_UP, self.snake.turn, direction=UP) # 绑定上方向键self.add_key_binding(KEY_DOWN, self.snake.turn, direction=DOWN) # 绑定下方向键self.add_key_binding(KEY_LEFT, self.snake.turn, direction=LEFT) # 绑定左方向键self.add_key_binding(KEY_RIGHT, self.snake.turn, direction=RIGHT) # 绑定右方向键self.add_key_binding(KEY_RESTART, self.restart) # 绑定R键(重启游戏)self.add_key_binding(KEY_PAUSE, self.pause) # 绑定R键(重启游戏)self.add_key_binding(KEY_EXIT, self.quit) # 绑定退出键# 添加绘图函数self.add_draw_action(self.draw_score) # 添加绘制分数的函数def prepare_background(self):"""准备背景"""self.background.fill(BACKGROUND_COLOR) # 用背景颜色填充背景for _ in range(CELL_SIZE, SCREEN_WIDTH, CELL_SIZE): # 绘制垂直网格线self.draw.line(self.background, GRID_COLOR, (_, 0), (_, SCREEN_HEIGHT))for _ in range(CELL_SIZE, SCREEN_HEIGHT, CELL_SIZE): # 绘制水平网格线self.draw.line(self.background, GRID_COLOR, (0, _), (SCREEN_WIDTH, _))def restart(self):"""重启游戏"""if not self.snake.is_alive: # 如果蛇已经死亡self.apple_count = 0 # 重置苹果计数器self.apple.drop() # 重新放置苹果self.snake.restart_pawn() # 重生蛇self.running = True # 继续游戏循环def draw_score(self):"""绘制分数"""text = f"Apple: {self.apple_count}" # 准备要绘制的文本self.high_score = max(self.high_score, self.apple_count) # 更新最高分self.draw_text(text, (0, 0), (255, 255, 33)) # 绘制文本if not self.snake.is_alive: # 如果蛇已经死亡self.draw_text(" 游戏结束 ", (SCREEN_WIDTH / 2 - 54, SCREEN_HEIGHT / 2 - 10), # 绘制游戏结束文本(255, 33, 33), WHITE)self.draw_text(" 按R键重启 ", (SCREEN_WIDTH / 2 - 85, SCREEN_HEIGHT / 2 + 20), # 绘制重启提示文本GREY, DARK_GREY)self.draw_text(f"当前最高分: {self.high_score}", (SCREEN_WIDTH / 2 - 114, SCREEN_HEIGHT / 2 + 50), # 绘制最高分文本(255, 33, 33), WHITE) # 展示最高分if not self.running and self.snake.is_alive: # 如果游戏暂停且蛇还活着self.draw_text("游戏暂停 ", (SCREEN_WIDTH / 2 - 55, SCREEN_HEIGHT / 2 - 10), # 绘制游戏暂停文本LIGHT_GREY, DARK_GREY)if __name__ == '__main__':SnakeGame().run() # 运行游戏
game/apple.py
from random import randint
from snake.constant import *class Apple:"""苹果类:表示游戏中的苹果,蛇吃到苹果会增长身体长度。"""def __init__(self, game):"""初始化苹果对象。:param game: 游戏对象。"""self.game = gameself.x = self.y = 0 # 苹果的初始位置self.game.add_draw_action(self.draw) # 将 draw 方法添加到游戏的绘制动作列表中self.drop() # 生成一个新的苹果def drop(self):"""生成一个新的苹果,确保苹果不在蛇的身体上。"""snake = self.game.snake.body + [self.game.snake.head] # 获取蛇的身体和头部的所有位置while True:(x, y) = randint(0, COLUMNS - 1), randint(0, ROWS - 1) # 随机生成一个位置if (x, y) not in snake: # 如果这个位置不在蛇的身体上self.x, self.y = x, y # 将苹果的位置设置为这个位置break # 退出循环def draw(self):"""绘制苹果。"""self.game.draw_cell((self.x, self.y), # 苹果的位置CELL_SIZE, # 每个单元格的大小APPLE_COLOR_SKIN, # 苹果的外框颜色APPLE_COLOR_BODY # 苹果的主体颜色)
game/base.py
import os
import sys
import time
from snake.constant import *# 使窗口居中
os.environ["SDL_VIDEO_CENTERED"] = "1"# MyGame 默认值
GAME_NAME = "贪吃蛇 By stormsha"
SCREEN_SIZE = 640, 480
DISPLAY_MODE = pygame.HWSURFACE | pygame.DOUBLEBUF
LOOP_SPEED = 60
# noinspection SpellCheckingInspection
FONT_NAME = "resources/MONACO.ttf"
FONT_SIZE = 16
KEY_PAUSE = pygame.K_PAUSEclass GameBase(object):"""pygame模板类"""def __init__(self, **kwargs):"""初始化可选参数:game_name 游戏名称icon 图标文件名screen_size 画面大小display_mode 显示模式loop_speed 主循环速度font_name 字体文件名font_size 字体大小"""pygame.init()pygame.mixer.init()self.game_name = kwargs.get("game_name") or GAME_NAMEpygame.display.set_caption(self.game_name)self.screen_size = kwargs.get("screen_size") or SCREEN_SIZEself.screen_width, self.screen_height = self.screen_sizeself.display_mode = kwargs.get("display_mode") or DISPLAY_MODEself.images = {}self.sounds = {}self.musics = {}self.icon = kwargs.get("icon") or Noneself.icon and pygame.display.set_icon(pygame.image.load(self.icon))self.screen = pygame.display.set_mode(self.screen_size,self.display_mode)self.loop_speed = kwargs.get("loop_speed") or LOOP_SPEEDself.font_size = kwargs.get("font_size") or FONT_SIZEself.background = None# noinspection SpellCheckingInspection''' 支持中文的字体新细明体:PMingLiU细明体:MingLiU标楷体:DFKai - SB黑体:SimHei宋体:SimSun新宋体:NSimSun仿宋:FangSong楷体:KaiTi仿宋_GB2312:FangSong_GB2312楷体_GB2312:KaiTi_GB2312微软正黑体:Microsoft JhengHei微软雅黑体:Microsoft YaHei'''self.font_name = kwargs.get("font_name") or pygame.font.match_font('SimHei') # 获取系统字体self.font = pygame.font.Font(self.font_name, self.font_size)self.clock = pygame.time.Clock()self.now = 0self.background_color = kwargs.get("background") or BLACKself.set_background()self.key_bindings = {} # 按键与函数绑定字典self.add_key_binding(KEY_PAUSE, self.pause)self.game_actions = {} # 游戏数据更新动作self.draw_actions = [self.draw_background] # 画面更新动作列表self.running = Trueself.draw = pygame.drawdef run(self):"""主循环"""while True:self.now = pygame.time.get_ticks()self.process_events()if self.running:self.update_game_data()self.update_display()self.clock.tick(self.loop_speed)def pause(self):"""暂停游戏"""self.running = not self.runningif self.running:for action in self.game_actions.values():if action["next_time"]:action["next_time"] = self.now + action["interval"]def process_events(self):"""事件处理"""for event in pygame.event.get():if event.type == pygame.QUIT:self.quit()elif event.type == pygame.KEYDOWN:action, kwargs = self.key_bindings.get(event.key, (None, None))# noinspection allaction(**kwargs) if kwargs else action() if action else Nonedef update_game_data(self):"""更新游戏数据"""for action in self.game_actions.values():if not action["next_time"]:action["run"]()elif self.now >= action["next_time"]:action["next_time"] += action["interval"]action["run"]()def update_display(self):"""更新画面显示"""for action in self.draw_actions:action()pygame.display.flip()def draw_background(self):"""绘制背景"""self.screen.blit(self.background, (0, 0))def add_key_binding(self, key, action, **kwargs):"""增加按键绑定"""self.key_bindings[key] = action, kwargs# TODO: 更新动作若有次序要求,则用字典保存不合适def add_game_action(self, name, action, interval=0):"""添加游戏数据更新动作"""next_time = self.now + interval if interval else Noneself.game_actions[name] = dict(run=action,interval=interval,next_time=next_time)def add_draw_action(self, action):"""添加画面更新动作"""self.draw_actions.append(action)def draw_text(self, text, loc, color, bgcolor=None):if bgcolor:surface = self.font.render(text, True, color, bgcolor)else:surface = self.font.render(text, True, color)self.screen.blit(surface, loc)def draw_cell(self, xy, size, color1, color2=None):x, y = xyrect = pygame.Rect(x * size, y * size, size, size)self.screen.fill(color1, rect)if color2:self.screen.fill(color2, rect.inflate(-4, -4))@staticmethoddef quit():"""退出游戏"""pygame.quit()sys.exit(0)@staticmethoddef load_music(filename):pygame.mixer.music.load(filename)@staticmethoddef play_music():pygame.mixer.music.play(-1)@staticmethoddef pause_music():pygame.mixer.music.pause()@staticmethoddef resume_music():pygame.mixer.music.unpause()@staticmethoddef stop_music():pygame.mixer.music.stop()def save_screenshots(self):filename = time.strftime('screenshots/%Y%m%d%H%M%S.png')pygame.image.save(self.screen, filename)def load_images(self, filename, sub_img=None):sub_img = sub_img or {}image = pygame.image.load(filename).convert_alpha() # 文件打开失败for name, rect in sub_img.items():x, y, w, h = rectself.images[name] = image.subsurface(pygame.Rect((x, y), (w, h)))def set_background(self, background=None):if isinstance(background, str):self.background = pygame.image.load(background)else:self.background = pygame.Surface(self.screen_size)self.background_color = background \if isinstance(background, tuple) else (0, 0, 0)self.background.fill(self.background_color)def load_sounds(self, **sounds):"""@summary: 加载音乐:param sounds::return:"""for name, filename in sounds.items():self.sounds[name] = pygame.mixer.Sound(filename)def play_sound(self, name):self.sounds[name].play()if __name__ == '__main__':GameBase().run()
game/snake.py
import pygamefrom snake import constantclass Snake:"""贪吃蛇"""def __init__(self, game):self.game = gameself.sound_hit = pygame.mixer.Sound("resources/hit.wav")self.sound_eat = pygame.mixer.Sound("resources/eat.wav")self.game.add_draw_action(self.draw)# 初始化数据self.head = (constant.SNAKE_X, constant.SNAKE_Y) # 蛇头当前位置self.body = [(-1, -1)] * constant.SNAKE_BODY_LENGTH # 蛇身长度self.direction = constant.SNAKE_DIRECTION # 当前方向self.new_direction = constant.SNAKE_DIRECTION # 移动方向self.speed = constant.SNAKE_SPEED # 移动速度self.is_alive = True # 是否存活def set_speed(self, speed):"""@summary: 设置蛇的移动速度:param speed: 移动速度:return:"""self._speed = speedself.game.add_game_action("snake.move", self.move, 1000 // speed)def get_speed(self):"""@summary: 获取当前蛇的移动速度:return:"""return self._speed@propertydef speed(self):return self._speed@speed.setterdef speed(self, speed):self._speed = speedself.game.add_game_action("snake.move", self.move, 1000 // speed)def draw(self):"""@summary: 绘制小蛇:return: """skin_color = constant.SNAKE_COLOR_SKIN if self.is_alive else constant.SNAKE_COLOR_SKIN_DEADbody_color = constant.SNAKE_COLOR_BODY if self.is_alive else constant.SNAKE_COLOR_BODY_DEADhead_color = constant.SNAKE_COLOR_HEAD if self.is_alive else constant.SNAKE_COLOR_HEAD_DEADfor cell in self.body:self.game.draw_cell(cell, constant.CELL_SIZE, skin_color, body_color)self.game.draw_cell(self.head, constant.CELL_SIZE, skin_color, head_color)def turn(self, direction):"""@summary: 改变小蛇方向:param direction: :return: """if (self.direction in (constant.LEFT, constant.RIGHT) and direction in (constant.UP, constant.DOWN) orself.direction in (constant.UP, constant.DOWN) and direction in (constant.LEFT, constant.RIGHT)):self.new_direction = directiondef move(self):"""@summary: 移动小蛇:return: """if not self.is_alive:return# 设定方向self.direction = self.new_direction# 检测前方x, y = meeting = (self.head[0] + self.direction[0],self.head[1] + self.direction[1])# 死亡判断if meeting in self.body or x not in range(constant.COLUMNS) or y not in range(constant.ROWS):self.die()return# 判断是否吃了苹果if meeting == (self.game.apple.x, self.game.apple.y):self.sound_eat.play()self.game.apple.drop()self.game.apple_count += 1else:self.body.pop()# 蛇头变成脖子self.body = [self.head] + self.body# 蛇头移动到新位置self.head = meetingdef restart_pawn(self):"""重生"""self.head = (constant.SNAKE_X, constant.SNAKE_Y)self.body = [(-1, -1)] * constant.SNAKE_BODY_LENGTHself.direction = constant.SNAKE_DIRECTIONself.new_direction = constant.SNAKE_DIRECTIONself.speed = constant.SNAKE_SPEEDself.is_alive = Truedef die(self):self.sound_hit.play()self.is_alive = False
constant.py
import pygame# 颜色设定
BLACK = 0, 0, 0
WHITE = 255, 255, 255
DARK_GREY = 33, 33, 33
GREY = 127, 127, 127
LIGHT_GREY = 192, 192, 192
BACKGROUND_COLOR = BLACK
GRID_COLOR = DARK_GREY
APPLE_COLOR_SKIN = 255, 127, 127
APPLE_COLOR_BODY = 255, 66, 66
SNAKE_COLOR_SKIN = 33, 255, 33
SNAKE_COLOR_BODY = 33, 192, 33
SNAKE_COLOR_HEAD = 192, 192, 33
SNAKE_COLOR_SKIN_DEAD = LIGHT_GREY
SNAKE_COLOR_BODY_DEAD = GREY
SNAKE_COLOR_HEAD_DEAD = DARK_GREY# 一般设定
GAME_NAME = "SnakeGame"
SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
CELL_SIZE = 20
COLUMNS, ROWS = SCREEN_WIDTH // CELL_SIZE, SCREEN_HEIGHT // CELL_SIZE
DISPLAY_MODE = pygame.HWSURFACE | pygame.DOUBLEBUF
LOOP_SPEED = 60
# noinspection SpellCheckingInspection
FONT_NAME = "resources/MONACO.TTF"
FONT_SIZE = 16
# noinspection SpellCheckingInspection
ICON = "resources/snake.png"
UP, DOWN, LEFT, RIGHT = (0, -1), (0, 1), (-1, 0), (1, 0)# 按键设定
KEY_EXIT = pygame.K_ESCAPE
KEY_UP = pygame.K_UP
KEY_DOWN = pygame.K_DOWN
KEY_LEFT = pygame.K_LEFT
KEY_RIGHT = pygame.K_RIGHT
KEY_RESTART = pygame.K_r
K_PAUSE = pygame.K_PAUSE# 蛇的默认值
SNAKE_X = 0
SNAKE_Y = 0
SNAKE_BODY_LENGTH = 5
SNAKE_DIRECTION = RIGHT
SNAKE_SPEED = 10
源码地址:https://gitcode.com/stormsha1/games/overview
相关文章:

Python 贪吃蛇
文章目录 效果图:项目目录结构main.pygame/apple.pygame/base.pygame/snake.pyconstant.py 效果图: 项目目录结构 main.py from snake.game.apple import Apple # 导入苹果类 from snake.game.base import * # 导入游戏基类 from snake.game.snake im…...

计算机网络 2.4差错检验与校正
第四节 差错检验与校正 一、认识检验与校正 1.差错形成原因 内部因素(随机错):噪声脉冲、脉动噪声、衰减、延迟失真等。 外部因素(突发错):电磁干扰、太阳噪声、工业噪声等。 2.差错控制编码分类&#…...

uniapp遍历数组对象的常见方法
在 UniApp 中,遍历数组对象的方法与在普通 JavaScript 中是相同的。UniApp 是一个使用 Vue.js 开发所有前端应用的框架,因此你可以使用 Vue.js 和 JavaScript 的语法来遍历数组对象。 以下是一些常见的遍历数组对象的方法: 使用 for 循环 …...

Milvus向量数据库(一)Milvus存储byte[]类型源向量数据
两种路线: 第一种是把byte[]转换为List< float >,然后存储到Milvus的floatVector中第二种是把byte[]转换为ByteBuffer,然后存储到Milvus的BinaryVector中 步骤: 我先用的是第一种,但是在转换float过程中&…...

Jupyter Notebook魔术命令
Jupyter Notebook是一个基于网页的交互式笔记本,支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序,便于创建和共享文学化程序文档,支持实现代码,数学方程,可视化和markdown。用途包括:数据…...

python基础---生成器
生成器 这个老师的课 这个老师的网页 获取系列有规律但是个数不确定的数据 使用迭代器的时候可以使用一个不会产生异常的迭代器, 实际记录的是生成的数据的方式, 不是实际的数据 使用迭代器的时候这一个规则的改变不方便, 需要加一个专门的方法 还有就是如果需要大量的数据,…...

wangEditor 富文本详解
前言:wangEditor 官网 。本文档讲解 wangEditor 在 vue3 中的使用。 一:快速开始 1. 安装 需要安装 wangeditor/editor、wangeditor/editor-for-vuenext 两个依赖 # 安装 editor npm install wangeditor/editor # or yarn add wangeditor/editor # o…...

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测
Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…...

Java多线程:常见的线程的创建方法及Thread类详解
目录 一.并发编程相关概念 线程与进程 多线程 Java中线程的状态 二.线程的创建方法 方法一:继承Thread类 方法二:实现Runnable接口 其他方法 三.Thread类详解 Thread常见构造方法 Thread常见属性 Thread常见方法 start() 与 run() sleep(…...

一招搞定生产管理
劳动力成本上升,原材料价格上涨,企业生产成本逐年增加,市场竞争越来越激烈,传统的中小制造企业面临着巨大的挑战。 企业的数字化转型如今成为炙手可热的高频词语,越来越多的中小制造企业已经开始上云,实践SaaS模式的生产管理系统…...

学习CSS3,实现红色心形loading特效
试想一下,如果你的网站在加载过程中,loading图由一个老旧的菊花转动图片,变为一个红色的心形loading特效,那该有多炫酷啊。 目录 实现思路 初始化HTML部分 延迟动画是重点 设定动画效果 完整源代码 最后 实现思路 每个…...

深度学习之基于Matlab神经网络的活体人脸和视频人脸识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 人脸识别技术作为生物识别技术的一种,近年来得到了广泛的关注和应用。与传统的身份认证方…...

充电桩测试:负载箱的重要性
随着电动汽车的普及,充电桩的需求也在不断增加。为了保证充电桩的安全、稳定和高效运行,对其进行严格的测试是必不可少的。在充电桩测试过程中,负载箱作为一种重要的测试设备,对于评估充电桩的性能和可靠性具有重要意义。 负载箱可…...

贪心算法、Dijkstra和A*类路径搜索算法
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言系列文章目录前言1.贪心算法、Dijkstra和A*类路径搜索算法(1)greedy best frist search贪心算法(仅仅考虑启发式代价)1.核心思想2.构造启发式猜…...

Debian是什么?有哪些常用命令
目录 一、Debian是什么? 二、Debian常用命令 三、Debian和CentOS的区别 四、Debian和CentOS的优缺点 五、Debian和CentOS的运用场景 一、Debian是什么? Debian是一种流行的开源Linux操作系统。 Debian是一个以Linux内核为基础的操…...

万兴PDF专家 PDFelement Pro v10.3.8 破姐版!
🧑💻万兴PDF专家 PDFelement Pro v10.3.8 破姐版 (https://docs.qq.com/sheet/DRVVxTHJ3RXJFVHVr)...

Ubuntu22.04 私钥登录
1. 背景 以前一直使用秘钥登录Linux,最近新装了一台Ubuntu 22.04,照旧部署公钥,使用私钥登录,结果SecureCRT 登录没有问题,使用Xshell登录一直报“所选的用户密钥未在远程主机上注册,请再试一次”。然后各种试&#x…...

Java_JVM_JVMs
JVM 官方文档说明文档目录 官方文档 JVM Specification 说明 以Java SE 17为标准 文档目录 2:JVM 结构 class文件数据类型 基本数据类型引用数据类型 运行时数据区 栈帧 其他内容 对象的表示浮点数运算特殊方法 初始化方法【实例、类】多态方法 3ÿ…...

Linux系统编程之基本指令
零、Linux发展史 1、诞生 1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组 (comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的小操作系统—…...

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…...

【Flask 系统教程 3】请求与响应
Flask 是一个灵活而强大的 Web 框架,而请求与响应则是构建 Web 应用的核心组成部分。在本文中,我们将探讨 Flask 中请求与响应的各种用法,包括不同的请求方法、重定向、响应对象、获取查询参数以及文件上传等。 请求 在 Flask 中࿰…...

jsp校园商城派送系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP 校园商城派送系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统采用serlvetdaobean mvc 模式,系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.…...

【Linux】System V 共享内存
文章目录 1. 共享内存示意图2. 共享内存数据结构3. 共享内存函数shmgetshmatshmdtshmctl 4. 实例代码测试共享内存5. 共享内存相关命令6. System V 消息队列(了解)7. System V 信号量(了解) 共享内存区是最快的 IPC 形式。一旦这样…...

拼多多标准推广怎么玩
拼多多标准推广的玩法主要包括以下方面: 拼多多推广可以使用3an推客。3an推客(CPS模式)给商家提供的营销工具,由商家自主设置佣金比例,激励推广者去帮助商家推广商品链接,按最终有效交易金额支付佣金&…...

HFSS学习-day2-T形波导的优化设计
入门实例–T形波导的内场分析和优化设计 HFSS--此实例优化设计 优化设计要求1. 定义输出变量Power31、Power21、和Power11,表示Port3、Port2、Port1的输出功率2.参数扫描分析添加扫描变量和输出变量进行一个小设置添加输出变量进行扫描分析 3. 优化设计,…...

贪吃蛇小游戏(c语言)
1.效果展示 屏幕录制 2024-04-28 205129 2.基本功能 • 贪吃蛇地图绘制 • 蛇吃食物的功能 (上、下、左、右方键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 3.技术要点 C语言函数、枚举、结构…...

多商户Docker Supervisor进程管理器部署
Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉,使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…...

Vue--》从零开始打造交互体验一流的电商平台(一)
今天开始使用 vue3 ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希…...

uniapp 自定义相机插件(组件版、缩放、裁剪)组件 Ba-CameraView
自定义相机插件(组件版、缩放、裁剪) Ba-CameraView 简介(下载地址) Ba-CameraView 是一款自定义相机拍照组件,支持任意界面,支持裁剪 支持任意自定义界面支持手势缩放支持裁剪(手势拖动、比…...

如何在Python中生成随机密码?
你可以使用Python的random模块来生成随机密码。下面是一个生成随机密码的简单示例代码: import random import stringdef generate_random_password(length):characters string.ascii_letters string.digits string.punctuationpassword .join(random.choice(c…...