贪吃蛇“大作战”(二)

从对象出发看贪吃蛇



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

  现在,我从面向对象的编程思维来对这个贪吃蛇运行机制做一个分析。从下面这幅图中我们看到了什么?

  我们能看到蛇、老鼠还有它们身下的草地,换个意思说是:蛇、食物和它们的活动空间。整个贪吃蛇的运行机制就是围绕着三个对象建立的。我们针对这三个对象分别做一个深入的分析。

  蛇

  •   蛇是动物,是会动的,所以它掌握了“动”(move)这个方法
  •   蛇是绿色的,所以它有“颜色”(color)这一属性
  •   从图上能看出,这条蛇有个鲜明的特征——长,所以蛇具有长度(length)这个属性
  •   蛇会吃老鼠,所以蛇有吃(eat)这个方法,蛇吃到老鼠会长大,所以蛇每次吃到老鼠长度会发生变化

  老鼠(食物)

  •   老鼠是群居动物,假定每次只出现一只老鼠,那么每次老鼠出现的位置是随机的,老鼠有随机出现的特性
  •   老鼠是棕色的,所以它有“颜色”这个属性
  •   老鼠是蛇的食物所以老鼠被蛇吃了之后会消失,然后又出现一只老鼠,所以老鼠有存在与不存在这两种状态

  草地(活动空间)

  •   草地是草绿色的,所以有“颜色”这个属性
  •   草地范围有限,蛇和老鼠只能在草地中活动,草地有大小这个属性


  我通过python代码分别对蛇、老鼠和草地这三个对象做一个定义:

#蛇的类定义
class Snake(direc)
    color = ‘green‘
    length = 5
    position = 0  # 蛇出现的初始位置
    def move(self,direc):
        if  self.direc = ‘w‘:
            #执行向上前行动作
        if  self.direc = ‘s‘
            #执行向下前行动作
        if  self.direc = ‘a‘
            #执行向左前行动作
        if  self.direc = ‘d‘
            #执行向右前行动作
    def eat():
        #判断是否吃到老鼠
        #执行吃到老鼠的操作——length += 1

#老鼠的类定义
class Mouse():
    color = ‘brown‘
    #此处定义老鼠出现的位置(草地内的随机位置,不包括蛇的体内)
    #此处判断老鼠是否存在,若不存在则刷新出新的老鼠

#草地的类定义
class grass():
    color = ‘grassgreen‘
    area = ‘20*20‘

  以上一些代码逻辑暂用文字表现,理解意思就好,会在后续的博客以完整的代码例程来展现面对对象的贪吃蛇运行机制(还没开始编写代码)。其实原来的代码就可以用面向对象的思想来看,我只是通过类定义把面对对象表现的更鲜明。

  列表lc可以代表蛇这个对象,它包括了蛇的长度属性和位置信息,通过对列表操作可以表达蛇“前进”这个方法。

  列表sw可以代表食物这个对象,它包括了食物的位置,通过对它操作可以判断食物是否存在,控制食物下一次出现的位置

  列表li则可以代表草地这个对象,它包括了草地的面积和“颜色”,通过对蛇和食物“颜色”属性的”渲染“可以在草地上观察到蛇和食物的位置变化信息。

  还可以通过数学知识——坐标轴来看待这个代码例程:草地就是坐标轴(整数坐标轴)中的x轴0~20与y轴0~20联合包围起来的一个区域;蛇就是在这个区域中连续的几个点;食物就是这个区域中可以随机出现的一个点;通过对这个坐标轴体系中的这三个对象进行操作就可以实现一个简单的贪吃蛇运行机制。

ps:这两篇博客我都是通过文字来解释贪吃蛇的运行机制,在下一篇博客我会开始运行这个代码例程,并不断完善这个例程(因为我发现这个例程其实距离真正可玩的贪吃蛇游戏还有很大的距离,bug有点多,代码结构也不够合理),将我学习改善这个例程的每个细节和大家分享;最后我会以面向对象的编程范式来实现这个贪吃蛇游戏,并争取可以通过窗口来真正地玩这个游戏,而不是命令行模拟。

  

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

时间: 2024-11-07 02:04: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模块等:当然,还有些模块虽然不是专门做

贪吃蛇“大作战”(五)

创建真正的游戏(续) 在上一篇博客介绍了pygame模块的安装,并开始通过pygame模块来创建贪吃蛇游戏.在上篇博客中我创建了一个窗体,贪吃蛇游戏将在窗体中运行.同时简单编写了一个退出窗体的事件应对机制,今天的博客将深入学习pygame模块,并一步一步"勾勒"出完整的贪吃蛇游戏. 上篇博客贪吃蛇代码编写到创建贪吃蛇游戏的窗体: import pygame #导入pygame模块 from pygame.locals import * #导入pygame模块中常用的函数和常量,如表示全

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) {

Expo大作战(二十三)--expo中expo kit 高级属性(没干货)

简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人修改补充+demo测试的形式,对expo进行一次大补血!欢迎加入expo兴趣学习交流群:597732981 [之前我写过一些列关于expo和rn入门配置的东i西,大家可以点击这里查看:从零学习rn开发] 相关文章: Expo大作战(一)--什么是expo,如何安装expo clinet和xde,xd