贪吃蛇“大作战”(五)

创建真正的游戏(续)



  在上一篇博客介绍了pygame模块的安装,并开始通过pygame模块来创建贪吃蛇游戏。在上篇博客中我创建了一个窗体,贪吃蛇游戏将在窗体中运行。同时简单编写了一个退出窗体的事件应对机制,今天的博客将深入学习pygame模块,并一步一步“勾勒”出完整的贪吃蛇游戏。

  上篇博客贪吃蛇代码编写到创建贪吃蛇游戏的窗体:

import pygame                   #导入pygame模块
from pygame.locals import *     #导入pygame模块中常用的函数和常量,如表示全屏的FULLSCREEN常量
from sys import exit            #导入sys模块中的exit()方法,用于退出程序

  #设置常量
BACKBROUNDFILL = (255,245,238)      #窗体背景填充RGB数值

  #初始化pygame组件
pygame.init()

  #创建一个窗口对象
screen =  pygame.display.set_mode((640,480),0,32)
  #元组(640,480)代表640X480的分辨率;0表示窗口显示,如果是FULLSCREEN则表示全屏显示;32代表色深32位

  #设置窗口标题
pygame.display.set_caption("贪吃蛇大作战!")

while True:
  #此处为主循环,类似之前命令行贪吃蛇代码中的循环,此处一个循环可看作一帧

    for event in pygame.event.get():     #等待获取外部事件,读取外部事件的队列
        if event.type == QUIT:           #判断外部事件类别,即判断用户的操作类型
            exit()                       #执行事件的对应操作,退出程序
            #pygame.quit()               #关闭窗体,但程序仍在运行;在下个while循环由于窗体关闭,因事件无法获取故会出现报错

    screen.fill(BACKBROUNDFILL)          #设置窗体的背景填充色      

    pygame.display.update()              #刷新Surface对象到窗体中(不可缺少)

  之前窗体填充色都是默认黑色,我加了screen.fill()语句修改了窗体颜色,看着舒服多了

  

  窗体创建好了,接下来介绍事件应对机制。pygame有一个事件应对的体系,用于玩家与GUI进行友好交互,比如之前关闭窗体的事件应对案例。

  玩家控制贪吃蛇的方式正常只有“上下左右”四个动作(此处用键盘控制,也可以用鼠标等控制方向),接下来列举一个键盘控制Surface对象的应对机制。

 1 import pygame                   #导入pygame模块
 2 from pygame.locals import *     #导入pygame模块中常用的函数和常量,如表示全屏的FULLSCREEN常量
 3 from sys import exit            #导入sys模块中的exit()方法,用于退出程序
 4
 5   #设置常量
 6 BACKBROUNDFILL = (255,245,238)      #窗体背景填充RGB
 7 TESTPICTURE = ‘snowman.png‘         #选取Surface素材(此处使用雪人图片)
 8
 9   #初始化pygame组件
10 pygame.init()
11
12   #创建一个窗口对象
13 screen =  pygame.display.set_mode((640,480),0,32)
14   #元组(640,480)代表640X480的分辨率;0表示窗口显示,如果是FULLSCREEN则表示全屏显示;32代表色深32位
15
16   #设置窗口标题
17 pygame.display.set_caption("贪吃蛇大作战!")
18
19   #素材转化为pygame识别的surface对象
20 testsurface = pygame.image.load(TESTPICTURE)
21
22   #设定雪人在窗体中的初始位置
23 x,y = 0,0                           #将窗体看作坐标轴,窗体左上顶点为坐标轴原点
24
25   #此处为主循环,类似之前命令行贪吃蛇代码中的循环,此处一个循环可看作一帧
26 while True:
27
28
29     for event in pygame.event.get():             #等待获取外部事件,读取外部事件的队列
30         if event.type == QUIT:                   #判断外部事件类别,即判断用户的操作类型
31             exit()                               #执行事件的对应操作,退出程序
32             #pygame.quit()                       #关闭窗体,但程序仍在运行;在下个while循环由于窗体关闭,因事件无法获取故会出现报错
33
34     pressed_keys = pygame.key.get_pressed()      #获取键盘相关事件的返回信息;返回的是一个元组如(K_UP,TRUE)
35
36     if pressed_keys[K_LEFT]:                     #if结构判断键盘“上下左右”哪个按键被按下,执行相应操作
37         x -= 1
38     elif pressed_keys[K_RIGHT]:
39         x += 1
40     if pressed_keys[K_UP]:
41         y -= 1
42     elif pressed_keys[K_DOWN]:
43         y += 1
44
45     screen.fill(BACKBROUNDFILL)                  #设置窗体的背景填充色
46
47     screen.blit(testsurface,(x,y))               #在screen窗体对象中添加一个testsurface代表的雪人对象,添加的坐标为(x,y)
48
49     pygame.display.update()                      #刷新Surface对象到窗体中(不可缺少)

  

  上面的代码是将雪人对象添加到窗体对象中,并在whlie循环中不断监听键盘的“上下左右”按键是否被按下,最后根据监听的结果改变雪人对象的坐标,在下次刷新时变化雪人在窗体中的位置。

注:45行代码与47行代码的次序不能对调,否则在运行程序时窗体中不会有雪人出现;这是因为如果次序对调,执行screen.fill()语句时会将之前的雪人对象“覆盖”。

  来看看代码运行的效果:

  

  键盘“左键”按一下,“右键”按一下看看效果:

  

  Bingo!玩家与贪吃蛇游戏的“互动平台”已经搭建好了,接下来可以进入正题了。下篇博客将开始创建贪吃蛇、食物和草地对象。

原文地址:https://www.cnblogs.com/3fman/p/9237873.html

时间: 2024-11-10 00:02:48

贪吃蛇“大作战”(五)的相关文章

贪吃蛇大作战的一点感悟

春节过罢,闲来无事,玩了两日贪吃蛇大作战,之前玩过球球大作战,感觉球球大作战玩法比较多,也比较难入门.而贪吃蛇大作战就简单多了,就两个原则:1不断地吃食物,让自己长大.2尽量避免撞到别人身上,以致于死亡.抱着这样的原则,我就开始了自己的贪吃之路. 刚开始的时候是小心翼翼地吃游戏自带的豆豆,也不敢去击杀别人,还经常撞到别人身上,所以更加小心地玩,自己长大了才敢去围追堵截别人,这样不知不觉居然就能玩到9000多长度了.接着再玩下去就有点心急了,一方面是有前边的经验,感觉也不太难嘛,另一方面想更快地打

贪吃蛇大作战canvas实现(手机触屏操作)--地图逻辑

//html部分 <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> <title>贪吃蛇大作战</titl

贪吃蛇“大作战”(四)

创建真正的游戏 之前演示的贪吃蛇游戏是以python命令行的形式模拟实现的,今天博客的主题就是是创建一个真正的贪吃蛇游戏,其摆脱了命令行的限制,界面更加美观,人机交互更加方便,可以让玩家有更好的游戏体验. 那么,要如何将贪吃蛇游戏做的更好.一个真正的游戏是通过图形用户界面GUI(Graphical User Interface)来展示的.在python中,要做一个GUI有多种选择,简单的就是easygui模块,进阶版的就是tkinter模块.wxPython模块等:当然,还有些模块虽然不是专门做

贪吃蛇“大作战”(二)

从对象出发看贪吃蛇 在上一篇博客中,我通过逐行分析代码对贪吃蛇的运行机制做了一个简要的介绍:逐行分析后可以看出这个贪吃蛇例程的编写范式更突出面向过程:该例程先是预设食物和贪吃蛇的位置参数,然后通过选择逻辑判断外部命令的值,根据不同的值做出不同的动作,最后在地图上将之前的动作"渲染",达到贪吃蛇"前进"的效果:如此下来,一步一步地根据"看得到的逻辑"实现了贪吃蛇的运行机制. 现在,我从面向对象的编程思维来对这个贪吃蛇运行机制做一个分析.从下面这幅图

java小游戏贪吃蛇大作战:来一起回顾童年回忆!

Java小项目之贪吃蛇 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 贪吃蛇,绝对是很多朋友的童年记忆.几乎没有人会说没玩过这款小游戏,因为不管在小灵通手机,直板手机,还是半智能手机,甚至是现在的5G手机,都能看见这款游戏的身影.虽然游戏一直在进化,画面,风格,操作方式越来越精细,但是游戏本质的玩法是没变的,例如蛇不断变大,碰到墙壁会死亡等设定.这篇文章来分享java小游戏贪吃蛇:部分代码展示:这个贪吃蛇小游戏,玩法和操控,都是比较完善的,大家感兴趣的可

贪吃蛇“大作战”(三)

例程实操与分析 在之前的两篇博客中分别通过面向过程和面向对象的编程思想分析介绍了来自sunny开始学坏的贪吃蛇例程,今天的博客将通过运行这个贪吃蛇例程来了解各行代码的作用,同时通过"找茬"的方式深入分析了解贪吃蛇的运行机制并改善这个例程. 下面是这个贪吃蛇例程的代码: 1 import os,random 2 sw=[[5,5]] 3 #lc=[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6]] 4 lc=[[5,i] for i in range(1

贪吃蛇大作战游戏攻略

1.不去人群密集的地方 2.长大之后想要啥就有啥 3.跑马圈地,长大之后,要让身体占据更大的空间 4.不抢食物,头只在身体内运动,只有当外部空间比较大时再进行领土扩张 5.不抢食物,而是要围住食物之后慢慢吃. 6.对于进入身体内部的蛇,要压缩之,不停地围绕它转圈,每转一圈就压缩一点空间. 7.勿贪小利,要从地形上取胜,而不要注重一星半点的食物.要鲸吞小蛇,而不要与它们正面交锋 8.不行险,不侥幸,稳,慢.活着是第一要务,活着是一切之根本. 9.慎终如始,则无败事.

Java课程设计---贪吃蛇大作战

目录 一.团队课程设计博客链接 二.个人负责模块和任务说明 三.自己的代码提交记录截图 四.自己负责模块或任务详细说明 五.课程设计感想 一.团队课程设计博客链接 二.个人负责模块和任务说明 1.负责实现闯关模式 2.负责实现挑战模式 3.串联GUI与信息代码 4.实现排行榜功能 三.自己的代码提交记录截图 四.自己负责模块或任务详细说明 这是挑战模式的时间线程 this.thread = new Thread(() -> { while (start) { if (count == 0) {

Canvas贪吃蛇大作战斗实现及思考

一向比较后知后觉,上周才发现了贪吃蛇大作战这个游戏,玩了一下,居然很上瘾!应该讲是一种虐的快感和不小心死掉的遗憾和再来一盘的心态的集合! 只是当时有个思考,就是游戏如何在我切换到其他应用后依然回来可以继续对战!是将我的数据及时保存,然后从这个游戏房间把我先挂起来,然后其他的玩家就会看到我突然在这里消失了?那么再将我恢复的时候如何保障不与其他用户冲突! 同时我发现每次进来,旁边的蛇依然在原来的位置,而且一样的会躲闪我的攻击等,我想那其他玩家的历史数据是怎么做到能判断我当前切换进来的行为!当时我还思