首页 / 社会动态 / 正文
JavaScript实现贪吃蛇游戏:蛇的移动方向与速度控制详解

Time:2025年04月25日 Read:3 评论:0 作者:haiwenboyue

大家好,又见面了,我是你们的朋友全栈君。

文章目录代码

代码语言:

代码运行次数:0

运行

复制

#!/usr/bin/env python
# -*- coding: utf-8 -*-
author 是 Wangdali,时间是 2021 年 1 月 20 日 16 时 08 分 44 秒。
#python实现:贪吃蛇
- 通过方向键(w、a、s、d)来控制小蛇的走向。
游戏结束的判定策略:超出边界;触碰到自身的身体,也就是蛇前进的下一格子是身体的一部分(即在列表中)。 '''
注:由于在列表中需频繁进行元素的添加和删除操作,所以采用 deque 容器来替代列表;这是因为 deque 在插入和删除操作上具有高效的效率。
#初始化蛇,长度为3,放置在屏幕左上角;
#导包
import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque
#基础设置
Screen_Height=480
Screen_Width=600
Size=20#小方格大小
Line_Width=1
#游戏区域的坐标范围
Area_x 的范围是从 0 到 Screen_Width 除以 Size 再减 1。其中 0 是左边界,1 是右边界。需要注意的是,在 Python 中,// 表示整数除法,/ 表示浮点数除法。
Area_y 等于 2 以及 Screen_Height 除以 Size 再减 1 的结果
#食物的初步设置
#食物的分值+颜色
还有一项是(30,(100,100,255))。
#整体颜色设置
Light=(100,100,100)
Dark=(200,200,200)
Black=(0,0,0)
Red=(200,30,30)
Back_Ground=(40,40,60)
#文本输出格式设置
在屏幕上绘制文本。使用指定的字体。设置文本的位置为 x 坐标和 y 坐标。显示指定的文本内容。可以指定文本的颜色,默认为白色(255,255,255)。
.font.render 的参数意义为:.render 包含内容、是否抗锯齿、字体颜色以及字体背景颜色这些方面
字体通过 render 方法来呈现文本,并且是以 True 的模式以及特定的 fcolor 颜色来进行呈现的。
    screen.blit(Text,(x,y))
#初始化蛇
def init_snake():
    snake=deque()
    snake.append((2,Area_y[0]))
    snake.append((1,Area_y[0]))
    snake.append((0,Area_y[0]))
    return snake
#食物设置
#注意需要对食物出现在蛇身上的情况进行判断
def Creat_Food(snake):
注:randint 所产生的随机数区间是包含左右极限的,即左右均为闭区间的[1, n],这样是可以取到 1 和 n 的。而 randrange 产生的随机数区间只包含左极限,也就是左闭右开的[1, n),其中 1 可以取到,但是 n 取不到。randint 产生的随机数处于指定的某个区间内,是一个特定的值。randrange 产生的随机数能够设定步长,即一个间隔。
food_x 等于在 Area_x 的第一个值到第二个值之间随机生成的一个整数。这里存在疑问。
food_y 被设置为在 Area_y 的第一个值和第二个值之间随机生成的一个整数。
    #如果食物出现在蛇上,重来;
    while(food_x,food_y)in snake:
food_x 等于在 Area_x 的第一个值和第二个值之间随机生成的一个整数。
food_y 等于从 Area_y 的第一行和第二行中随机选取一个整数
    return food_x,food_y
#食物风格

微信输入代码游戏_电脑代码游戏_游戏代码

def Food_Style(): 从 Food_Style_List 中随机选取一个整数,范围在 0 到 2 之间,然后返回对应的分值和颜色。 def main(): pygame.init() 初始化一个准备显示的窗口或屏幕,通过 pygame.display.set_mode((Screen_Width,Screen_Height)) 来实现,将其赋值给 screen 变量。 它将窗口的标题设置为 '贪吃蛇' #得分字体设置 使用 pygame 库的 SysFont 函数创建字体对象,字体名称为'SimHei',字号为 24,将其赋值给 font1 变量。 #GO字体设置 使用 pygame 库的 SysFont 函数创建一个字体对象,字体名称为 None,字体大小为 72,将创建的字体对象赋值给变量 font2 。 fwidth 为字体 font2 显示字符串 'GAME OVER' 的宽度,fheight 为字体 font2 显示字符串 'GAME OVER' 的高度。 然后直接 GameOver 。 # b变量为了防止这个情况发生 b=True #蛇 snake=init_snake() #食物 food=Creat_Food(snake) food_style=Food_Style() #方向控制 pos=(1,0) ### #启动游戏相关变量初始化 game_over 的值为 True ,这是结束标志 。只有当 start 的值为 True 且 game_over 的值也为 True 时,才会显示 GAME OVER 。 game_start=False #开始标志 score=0 #得分 orispeed=0.3 #蛇初始速度 speed=orispeed #蛇速度 last_move_time=None pause=False #暂停 while True: 对于每一个事件: if event.type==QUIT: sys.exit() elif event.type==KEYDOWN: if event.key==K_RETURN: if game_over: game_start=True game_over=False b=True snake=init_snake() food=Creat_Food(snake) food_style=Food_Style() pos=(1,0) #得分 score=0 last_move_time=time.time() elif event.key==K_SPACE: if not game_over: pause=not pause #以下为防止蛇在向右移动时按向左键,导致GameOver elif event.key in (K_UP,K_w): if b and not pos[1]: ### pos=(0,-1) b=False 假如事件的键处于(按下向下键、按下 s 键)的情况; if b and not pos[1]: pos = (0, 1) b = False 如果事件的键在(左箭头键、A 键)中 if b and not pos[0]: pos = (-1, 0) b = False 如果事件的键在 (K_RIGHT 或者 K_d) 之中

游戏代码_电脑代码游戏_微信输入代码游戏

if b and not pos[0]: pos = (1, 0) b = False #填充背景色 screen.fill(Back_Ground) ### #画网格线、竖线 对于 x 而言,x 从 Size 开始,以 Size 为步长,一直到 Screen_Width 为止。 直线的宽度是 Line_Width。 #画网格线、横线 对于 y 而言,其取值范围是从 Area_y[0] 乘以 Size 开始,以 Size 为步长,一直到 Screen_Height 结束。 在屏幕上绘制一条直线,颜色为黑色,起始点坐标为(0, y),终点坐标为(Screen_Width, y),线宽为 Line_Width 。 #蛇的爬行过程 if not game_over: curTime=time.time() 如果当前时间减去上次移动时间大于速度,那么就执行相应的操作。 if not pause: b=True last_move_time=curTime next_s 的值为 snake 数组中第一个元素的第一个坐标值加上 pos 数组的第一个坐标值,以及 snake 数组中第一个元素的第二个坐标值加上 pos 数组的第二个坐标值 #如果吃到了食物 if next_s==food: snake.appendleft(next_s) score+=food_style[0] 速度等于原始速度减去 0.03 乘以(得分除以 100 的结果) food = Creat_Food(snake) food_style = Food_Style() else: #在区域内 if Area_x[0]<=next_s[0]<=Area_x[1] and Area_y[0]<=next_s[1]<=Area_y[1] and next_s not in snake: snake.appendleft(next_s) snake.pop() else : game_over=True #画食物 if not game_over: ''' rect(Surface,color,Rect,width=0) 第一个参数指定矩形绘制到哪个Surface对象上 第二个参数指定颜色 第三个参数指定矩形的范围(left,top,width,height) 第四个参数指定矩形边框的大小(0表示填充矩形) 例如绘制三个矩形: pygame.draw.rect(screen, BLACK, (50, 50, 150, 50), 0) pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1) pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10) ''' # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了 pygame.draw.rect(screen, food_style[1], (food[0] * Size, food[1] * Size, Size, Size), 0) #画蛇 for s in snake: pygame.draw.rect(screen, Dark, (s[0] * Size + Line_Width, s[1] * Size + Line_Width, Size - Line_Width * 2, Size - Line_Width * 2), 0) Print_Txt(screen, font1, 30, 7, f'速度: {score // 100}') Print_Txt(screen, font1, 450, 7, f'得分: {score}') #画GameOver if game_over: if game_start: #print('GameOver') Print_Txt(screen, font2, (Screen_Width - fwidth) // 2, (Screen_Height - fheight) // 2, 'GAME OVER',Red) pygame.display.update() if __name__=='__main__': main()

运行截图

笔记补充

蛇的移动首先要依据方向来进行判断。这里用 pos 变量来记录方向,比如 pos(1, 0)表示当前蛇向右的方向,pos(-1, 0)表示当前蛇向左的方向,pos(0, 1)表示当前蛇向下的方向,pos(0, -1)表示当前蛇向上的方向。怎么控制蛇的速度呢?其实是通过控制时间来实现刷新。我们知晓所有的动作都是在一个循环当中完成的,也就是说代码始终在持续运行着。

如果我将速度设置为 1,这意味着每秒会进行一次刷新。在这种情况下,蛇的移动速度就是每秒一次,而我们所看到的蛇的移动也是每秒一格。

当我们将速度设置为 0.5 时,意味着每 0.5 秒刷新一次。这样我们就能看到每 0.5 秒移动一格,从而感觉速度相对变快了。

参考博客(阿里嘎多!)

1、2、

标签:
关于我们
海文博阅网,打造全方位的文化信息阅读平台,涵盖社会动态、历史人文、生活百科等广泛内容。我们为读者提供高质量的资讯和深度文章,让阅读成为获取知识、拓宽视野的桥梁。在这里,您可以随时随地畅游知识的海洋,感受阅读的魅力。
发文扫码联系站长微信
Copyright ©2021-2025 Comsenz Inc.Powered by©haiwenboyue 文章发布联系站长:dat818