20172321 20172333 2017-2018 暑假作业APP

项目介绍

项目成员

  • 吴恒佚 20172321
  • 严域俊 20172333

项目简介

  • 从理论上来说,这是一个贪吃蛇游戏。
  • 《贪吃蛇》:控制小蛇前进的方向,尽可能吃更多的东西使自己变长,首先不能咬到自己的尾巴,不能撞到墙壁。————360百科
  • 本游戏玩法:用按钮上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴(目前只支持无限模式,后期应该会有闯关等新模式)

代码地址

提取码:cnq6

项目展示

运行展示

分区展示

  • 首先介绍的是app图标

这是导入自己喜欢的图片后,在以下代码中修改自己喜欢的名字和图片地址

  • 之后进入这个页面,这是个菜单页面,理论上来说,可以选择要玩的游戏和查看攻略以及历史评分之类的,不过现在还没有完成这些功能

  • 最后就是游戏界面,目前是简朴复古流

    游戏画面清晰易懂、操作按钮简单朴实、没有花里胡哨的闯关地图,在小小的方形地图中挑战极限 ...可计分、暂停、加速。

制作过程

开始操作之前

  • 在严域俊小胖友的诚挚邀请下我来到了他的家,两个热爱编程的人在一起能干什么呢?还能干什么呢?

    • 暑假编程不还没写吗?王老师不是说可以编个小游戏吗?
    • 要不来个俄罗斯方块,感觉没什么难度。。。
    • 去贴吧里看看编程思路好了
    • 算了算了,有没有什么简单点的。。。
  • 之后我们一起参观了B站老哥的教学视频,主要是学习蛇体的运动方式,和食物是否被吃的判定。

关键代码解析

  • 最开始肯定是生成一个30*30的背景墙并且设置墙壁
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
width = getWidth();
height = getHeight();
pixl = width / SnakeConfig.snakeNum;
if (!isInit) {
initPoint();
isInit = true;
}
mPaint.setStrokeWidth(pixl * 2);
snakePaint.setStrokeWidth(pixl - 2);
initWall(canvas);
initSnake(canvas);
drawSnakeBuf(canvas);
}
private void initWall(Canvas canvas) {
RectF rel;
paintWall.setStyle(Paint.Style.FILL_AND_STROKE);
paintWall.setColor(Color.BLACK);
for (int i = bengin; i < width - pixl; i += pixl) {
for (int j = bengin; j < width - pixl; j += pixl) {
if (i == bengin || j == bengin || i > width - 2 * pixl || j > width - 2 * pixl) {
rel = new RectF(i, j, i + pixl, j + pixl);
canvas.drawRoundRect(rel, 10, 10, paintWall);
}
}
}
paintWall.setStyle(Paint.Style.STROKE);
paintWall.setColor(Color.LTGRAY);
for (int i = bengin; i < width - pixl; i += pixl) {
for (int j = bengin; j < width - pixl; j += pixl) {
if (i == bengin || j == bengin || i > width - 2 * pixl || j > width - 2 * pixl) {
} else {
rel = new RectF(i, j, i + pixl, j + pixl);
canvas.drawRoundRect(rel, 4, 4, paintWall);
}
}
}
}
  • 蛇体的移动是通过在移动方向的前一个格子生成蛇体并且消除蛇尾的最后一个格子的蛇体实现,例如向右移动
private void moveToRight() {
int len = snakeDatas.size();
for (int i = len - 1; i > 0; i--) {
snakeDatas.get(i).x = snakeDatas.get(i - 1).x;
snakeDatas.get(i).y = snakeDatas.get(i - 1).y;
}
snakeDatas.get(0).x = snakeDatas.get(0).x + pixl;
}
  • 还有一个关键的判定:判断两个点是否在同一个位置。用来判断蛇头和其他点的位置

    • 如果蛇头的和蛇体或者墙壁重合则死亡
    • 如果蛇头和食物重合则增加一分并且随机再生成一个代表食物的点
public boolean isSamePoint(Snake snake, Snake snakeBuf2) {
if ((snake.x - snakeBuf2.x) < -2 || (snake.x - snakeBuf2.x) > 2) {
return false;
}
if ((snake.y - snakeBuf2.y) < -2 || (snake.y - snakeBuf2.y) > 2) {
return false;
}
return true;
}

按钮生成

  • 以向上按钮为例
  • 首先我们找到一个差不多看起来像方向指针的图片

  • 然后用一个up.xml把图片引用,就得到了一个按钮。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/up_p" android:state_pressed="true"></item>
<item android:drawable="@drawable/up_n"></item> </selector>

  • 王老师指出,这样就不能用电脑键盘操作了,不过我们本来就是手机app嘛,[摊手]

可扩展功能

  • 就是一些花里胡哨的的贪吃蛇版本嘛

    • 闯关冒险、限时得分、娱乐道具
    • 网上计分、匹配对战、排名挑战
    • 会员开通、充值酷炫皮肤、购买复活加分道具
    • 3D模式(如果技术允许)
  • 您的充值,是我们前进的动力

游戏中所阐述的哲理

  • 在这个游戏中,两位创作人并不只是想向人们展示一个简朴的贪吃蛇游戏,而是想借此为人们生动的阐述一些哲理,谨在此例举两例

    • 在控制小蛇不断吞食小豆的路上,偶尔小豆不会自动生成,需要自己动手点击一下启动键。我们想告诉大家的是:取得成果的机会不总是努力寻找就可以得到的,偶尔也要自己去创造。
    • 当一局游戏失败之后开始新的一局,分数会从0开始,但是在结束后一局游戏时,你会发现,总分会是两局得分之和。大家应该明白:在前进的路上总会有许许多多的失败,偶尔要重写开始,但是,你以前的付出绝对不是毫无意义的,它也是你所取得的成绩的重要部分。

写在最后

“程序员的宿命啊,就是被扔,这代码啊,是写了扔,扔了写。”

  • 在和吴恒佚(金银铜铁刚)编写这个贪吃蛇的过程中,从无到有,这之间不过十天左右的时间,代码很简陋,从构思做什么app再到基本的框架构建,上下左右,加速,暂停,吃豆豆这些方法的实现,具现在AS上也不过600行代码,大部分知识都是从别人视频里面学的,有些时候从这位大佬上学点从帧数调整上使贪吃蛇加速,有时从另外一位大佬上学学限制贪吃蛇框架构建。整个APP都是东拼西凑出来的东西,有时候几十行代码写了出来,发现不适合,没办法只能扔掉,扔掉又重新写,写出来再扔掉,往复直到将就适合。有的BUG都完全没办法解决(技术不到位,莫得办法),只能一步一步推倒回去,直到不再出错,再重新找到其他方法重新开始。如果说其他职业的每一步工作都有自己应有的价值,再怎么废弃也是一定价值的,那么程序员就是一个极端,出BUG删掉重写、程序写完后闪退重写、方法由于类型值不符合重写、就一直扔一直写,写到那唯一的一条路上successful。得亏编写的过程中也不只有BUG,也有欢乐与成就。两个人共用一个电脑桌,桌上摆着两杯奶茶,码累了,往落地窗外看看成都的风景,过去的行人,在篮球场挥霍汗水的男女生,伸个懒腰,继续开始一次又一次的调试与视频学习。在这样没有deadline的日子悠闲的编程也算是一次另类的暑假娱乐了吧。

——强调了自己姓名的严域俊先生

参考文献

20172321 20172333 2017-2018 暑假作业APP的更多相关文章

  1. 暑假作业app博客

    一.光照传感器 界面 简介 运用了传感器类,通过手机的感应区根据当时的光照强度显示出数据. 核心代码 protected void onCreate(Bundle savedInstanceState ...

  2. 20172328 暑假作业 之 实现安卓小程序Enjoy-all

    20172328 暑假作业 之 实现安卓小程序Enjoy-all 项目介绍 项目名称: Enjoy - all 项目简介: 本项目基于Java语言和Anroid Studio软件,实现了简单的冒泡.屏 ...

  3. 20172305 暑假作业 之 TimeCalculate & Save Iron Man

    20172305 暑假作业 之 TimeCalculate & Save Iron Man TimeCalculate 项目介绍 项目名称: TimeCalculate 项目简介: 本项目基于 ...

  4. 2017国家集训队作业[arc082d]Sandglass

    2017国家集训队作业[arc082d]Sandglass 题意: ​ 有一个沙漏,初始时\(A\)瓶在上方,两个瓶子的最大容量都为\(X\)克,沙子流动的速度为\(1g\)每单位时间.给出\(K\) ...

  5. 2017国家集训队作业[arc076d/f][Exhausted?]

    2017国家集训队作业[arc076d/f][Exhausted?] 题意: ​ 有\(N\)个人,\(M\)把椅子,给出\(...L_i.R_i\)表示第\(i\)个人可以选择编号为\(1\sim ...

  6. MyEclips 2017/2018 (mac 版)安装与破解

    MyEclips 2017/2018 (mac 版)安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEclips ...

  7. MyEclipse 2017/2018 安装与破解 图文教程

    SSM 框架-02-MyEclipse 2017/2018 安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEc ...

  8. </2017><2018>

    >>> Blog 随笔原始文档及源代码 -> github: https://github.com/StackLike/Python_Note >>> 统计信 ...

  9. 2017国家集训队作业Atcoder题目试做

    2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...

随机推荐

  1. HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)

    Fast Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. Unity3D游戏开发从零单排(三) - 极速创建狂拽酷炫的游戏地形

    提要 在Unity工作流程内,地形是一个必不可少的重要元素.不论是游戏或虚拟现实都会使用到各种类型的地形效果,在这个教学中我们须要了解到地形的制作基本概念与,当中对于Unity的地形操作部分须要大量的 ...

  3. python3通过纯真IP数据库查询IP归属地信息

    在网上看到的别人写的python2的代码,修改成了python3. 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下. #! /usr/bin/env python # -*- co ...

  4. 数据库oracle安装与卸载

    安装的版本是oracle12-OraDb10g_home1服务端,先来卸载,如果电脑安装了oracle,在计算机-->管理-->服务里面可以看见下面三个oracle服务 首先我们要把它这里 ...

  5. Oracle Data Provider for .NET – Microsoft .NET Core and Entity Framework Core

    http://www.oracle.com/technetwork/topics/dotnet/tech-info/odpnet-dotnet-ef-core-sod-4395108.pdf Orac ...

  6. Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)

    通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx 脚本如下: #!/bin/shnginx_home = /Data/app_1 ...

  7. 2017-2018-1 20155230 mypwd实现

    mypwd实现 每个文件夹都有以".",".."为名的文件.首先记录"."所拥有的i-节点号,然后使用chdir向上进入父目录查找含有刚记录 ...

  8. IntelliJ IDEA 添加jar包

      事先下载完成需要的javacsv.jar包. java项目在没有导入该jar包之前,显示如下图所示   点击 File ->  Project Structure(快捷键 Ctrl + Al ...

  9. RMAN 与control文件和spfile文件的备份

    以10.2为例,官方文档如此说: http://docs.oracle.com/cd/B19306_01/backup.102/b14191/rcmconc1.htm The RMAN behavio ...

  10. [Deep-Learning-with-Python]神经网络入手学习[上]

    神经网络入手[上] [x] 神经网络的核心部分 [x] Keras介绍 [ ] 使用Keras解决简单问题:分类和回归 神经网络剖析 神经网络的训练与下列对象相关: 网络层Layers,网络层结合形成 ...