基于Android Flutter编写贪吃蛇游戏

目录
  • 前言
  • 开发步骤:
    • 1.定义蛇和豆子
    • 2.让蛇动起来
    • 3.使用陀螺仪来控制蛇
    • 4.让蛇吃掉豆子
    • 5.吃掉豆子随机生成一个豆子

前言

放假期间,小T打算回顾一下经典,想用Flutter做一下小游戏,做什么好呢,从打飞机到坦克大战,最后还是想做一款贪吃蛇,依稀还记得,小时候第一次玩游戏是在父母的小灵通上玩贪吃蛇哈哈,但是光光一个贪吃蛇太单调了,我们就加一个陀螺仪吧~

话不多说,先上效果图,有图有真相!!(陀螺仪好难操控)!

开发步骤:

非常简单,就是玩起来有点费手~

github仓库还没有搭建,大家可以先看一下文末通知!

1.定义蛇和豆子

2.让蛇动起来

3.使用陀螺仪来控制蛇

4.让蛇吃掉豆子

5.吃掉豆子随机生成一个豆子

1.定义蛇和豆子

///蛇的每一块的大小
const double size = 10;
Offset ball = Offset.zero;//豆子
List<Offset> snakeList = [Offset(50, 0), Offset(60, 0)];//蛇的长度

显示豆子和蛇:

使用Stack是因为豆子在被蛇吃的时候会重叠

使用Positioned来进行定位

body: Stack(
      children: snakeList
          .map((snake) => Positioned.fromRect(
              rect: Rect.fromCenter(
                  center: adjust(snake), width: size, height: size),
              child: Container(margin:const EdgeInsets.all(1),color: Colors.black)))//加个外边距使每一块更清晰
          .toList()
            ..add(Positioned.fromRect(
                rect: Rect.fromCenter(
                    center: adjust(ball), width: size, height: size),
                child: Container(color: Colors.orange))),
    )
Offset adjust(Offset offset) {
    return Offset(offset.dx + size / 2, offset.dy + size / 2); //使每一块更好的展示出来
}

2.让蛇动起来

在这里我们要先给蛇来一个状态定义:

///控制蛇的状态
enum Direction { Up, Down, Left, Right }

因为蛇要一直动,所以给一个周期函数:

1.定义200毫秒动一次

2.处理更新蛇的长度

3.求余的好处在于优化吃豆子,因为随机生成豆子时,可能是个不会被整除的。

Direction direction = Direction.Left; //给蛇设置一个状态,默认向左移动
///周期函数
  void didChangeDependencies() {
    ///两百毫秒的周期函数
    var period = Duration(milliseconds: 200);
    ///对蛇的长度进行优化
    double maxWidth = MediaQuery.of(context).size.width;
    double widthPad = maxWidth % size;
    maxWidth -= widthPad;
    double maxHeight = MediaQuery.of(context).size.height;
    double heigthPad = maxHeight % size; //这里除于是为了更好的游戏体验
    maxHeight -= heigthPad;
    ///周期调用
    ///用于贪吃蛇的自己移动,以及碰撞检测
    Timer.periodic(period, (timer) {
      final snakeHead = snakeList[0];
      List<Offset> newSnakeList = List.generate(snakeList.length, (index) {
        if (index > 0) {
          return snakeList[index - 1];
        } else {
          ///移动处理
          switch (direction) {
            case Direction.Up:
              return Offset(snakeHead.dx,
                  (snakeHead.dy - size + maxHeight) % maxHeight); //求余是保证不会超标
            case Direction.Down:
              return Offset(
                  snakeHead.dx, (snakeHead.dy + size + maxHeight) % maxHeight);
            case Direction.Left:
              return Offset(
                  (snakeHead.dx - size + maxWidth) % maxWidth, snakeHead.dy);
            case Direction.Right:
              return Offset(
                  (snakeHead.dx + size + maxWidth) % maxWidth, snakeHead.dy);
          }
        }
      });
      setState(() {
        snakeList = newSnakeList; //更新蛇的状态
      });
    });
    super.didChangeDependencies();
  }

3.使用陀螺仪来控制蛇

Flutter使用陀螺仪需要借助一个库:sensors 或者sensors_plus,两者没有太大的区别

这个demo使用:

sensors: any

官方给的例子:

import 'package:sensors/sensors.dart';
​
accelerometerEvents.listen((AccelerometerEvent event) {
  print(event);
});
// [AccelerometerEvent (x: 0.0, y: 9.8, z: 0.0)] 加速度
​
userAccelerometerEvents.listen((UserAccelerometerEvent event) {
  print(event);
});
// [UserAccelerometerEvent (x: 0.0, y: 0.0, z: 0.0)]
​
gyroscopeEvents.listen((GyroscopeEvent event) {
  print(event);
});
// [GyroscopeEvent (x: 0.0, y: 0.0, z: 0.0)] 陀螺仪

我们在initState对陀螺仪进行监听:

这里有x,y,z的三个参数,也可以自己优化调试,5.0是当手机倾斜>=45°

@override
void initState() {
  super.initState();
  accelerometerEvents.listen((AccelerometerEvent event) {
    setState(() {
      _accelerometerValues = <double>[event.x, event.y, event.z];
      if(_accelerometerValues[0] >= 5.0){
        direction = Direction.Left;
      }else if(_accelerometerValues[1] >= 5.0){
        direction = Direction.Down;
      }else if(_accelerometerValues[0] <= -5.0){
        direction = Direction.Right;
      }else if(_accelerometerValues[1] <= -5.0){
        direction = Direction.Up;
      }
    });
  });
}

4.让蛇吃掉豆子

还是在刚刚的周期函数里添加:

当蛇头碰到豆子时,给蛇加一格

if(newSnakeList[0] == ball){
  newSnakeList..add(snakeList[snakeList.length - 1]);
  setState(() {
    ball = randoowPositon(maxWidth, maxHeight); //随机生成一个豆子,randoowPositon方法在后面
  });
}

5.吃掉豆子随机生成一个豆子

对豆子的生成也需要优化一下 (之前生成有点问题,现在优化一下)

Offset randoowPositon(double widthRange, double heightRange) {
  ///随机生成豆子
  var rng = Random();
  int intWidthRange = widthRange.toInt();
  int intHeightRange = heightRange.toInt();

  int finalWdith = rng.nextInt(intWidthRange);
  int finalHeight = rng.nextInt(intHeightRange);
  double widthPad = finalWdith % size;
  double heightPad = finalHeight % size;

  double actualWidth = finalWdith - widthPad;
  double actualHeight = finalHeight - heightPad;
  return Offset(rng.nextInt(widthRange.toInt()).toDouble(),
      rng.nextInt(heightRange.toInt()).toDouble());
}

到此这篇关于基于Android Flutter编写贪吃蛇游戏的文章就介绍到这了,更多相关Flutter贪吃蛇内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android开发之经典游戏贪吃蛇

    前言 这款游戏实现的思路和源码参考了Google自带的Snake的例子,其中修改了一些个人认为还不够完善的地方,加入了一些新的功能,比如屏幕上的方向操作盘,暂停按钮,开始按钮,退出按钮.另外,为了稍微增加些用户体验,除了游戏的主界面,本人自己新增了5个界面,分别是登陆界面,菜单界面,背景音乐设置界面,难度设置界面,还有个关于游戏的介绍界面.个人觉得在新手阶段,参考现成的思路和实现方式是难以避免的.重要的是我们需要有自己的理解,读懂代码之后,需要思考代码背后的实现逻辑,形成自己的思维.这样在下次开

  • 基于Android平台实现拼图小游戏

    一.需求描述 拼图是一款益智类经典游戏了,本游戏学习了一些前辈们的经验,整体来说讲,将图片用切图工具进行切割,监听用户手指滑动事件,当用户对凌乱的图片,在一定的时间内拼凑恢复成原来的样子,则成功闯关. 根据游戏不同的关卡对图片进行动态的切割.玩家可以在随意交换任意两张图片,通过遍历切割好的每块图片,将用户选中的图片,进行替换: 其中主要的功能为: 动态对图片进行切割成所需要的份数. 玩家任意点击的两张图片能够进行正确交换. 实现交换图片的动画切换效果. 实现过关逻辑. 实现游戏时间逻辑控制. 游

  • Android自定义View实现数独游戏

    先说一下数独游戏的规则: 1.在整个横坐标和纵坐标的9个格子上只能填土1-9的数字且不重复 2.在当前3*3 的格子上填入1-9数字且不重复 先给大家看效果图 项目思路 1.UI呈现:这个放在 GameView 类里面         显示原始数据         显示当然用户填写的数据         显示用户当前点击的位置         显示候选区数据 2.逻辑处理:这个是放在Matrix类里面的     原始数据:游戏开始的时候就要创建出来的,     当前数据:用户填写上去的实时数据

  • Android 2d游戏开发之贪吃蛇基于surfaceview

    前两个游戏是基于View游戏框架的,View游戏框架只适合做静止的,异步触发的游戏,如果做一直在动的游戏,View的效率就不高了,我们需要一种同步触发的游戏框架,也就是surfaceview游戏框架,你可能会问,什么乱七八糟的,啥叫同步?啥叫异步?...我就不告诉你...我们先看一下这个同步框架,看看骚年你能不能自己领悟. GameView.java(继承自SurfaceView) package com.next.eatsnake; import android.content.Context

  • Android实现扫雷小游戏

    本文实例为大家分享了Android实现扫雷小游戏的具体代码,供大家参考,具体内容如下 先看效果图: 初始游戏界面: 翻开块和标记块界面: 游戏结束界面: 菜单界面: 更换难度界面: 查看游戏记录界面: 代码分析 Block.java 这部分代码实现的是游戏界面的板块 设置四个变量来记录当前块是否被翻开,当前块是否是地雷,是否把当前快标记为地雷(也就是插旗子),当前块周围的地雷数量. 关键部分代码: //设置翻开状态 public void setNumberOfSurroundingMines(

  • Android实现打地鼠小游戏

    本文实例为大家分享了Android实现打地鼠小游戏的具体代码,供大家参考,具体内容如下 实现结果 代码实现 playmouse.java package com.example.playmouse; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; impor

  • 基于Android Flutter编写贪吃蛇游戏

    目录 前言 开发步骤: 1.定义蛇和豆子 2.让蛇动起来 3.使用陀螺仪来控制蛇 4.让蛇吃掉豆子 5.吃掉豆子随机生成一个豆子 前言 放假期间,小T打算回顾一下经典,想用Flutter做一下小游戏,做什么好呢,从打飞机到坦克大战,最后还是想做一款贪吃蛇,依稀还记得,小时候第一次玩游戏是在父母的小灵通上玩贪吃蛇哈哈,但是光光一个贪吃蛇太单调了,我们就加一个陀螺仪吧~ 话不多说,先上效果图,有图有真相!!(陀螺仪好难操控)! 开发步骤: 非常简单,就是玩起来有点费手~ github仓库还没有搭建,

  • 从0到1学习JavaScript编写贪吃蛇游戏

    本文实例为大家分享了JavaScript编写贪吃蛇游戏的具体代码,供大家参考,具体内容如下 游戏截图 1.画出游戏界面 var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d");//获取地图 2.给小蛇设置参数 var time = 160 ; //蛇的速度 var x = y = 8; var t = 20; //蛇身长 var map = []; //记录蛇运行路径 var siz

  • 基于Vue uniapp实现贪吃蛇游戏

    目录 游戏演示 代码结构 渲染蛇身 控制蛇的方向 游戏演示 代码结构 详细代码结构如果需要请到github查看 <template> <view ref="body" class="content"> <view>蛇蛇目前:{{snakes.length}}米长</view> <view class="game-field"> <!-- 地面板块 --> <view c

  • 利用TypeScript编写贪吃蛇游戏

    目录 Explanation 1. tsconfig.json配置 2. HTML & CSS 布局相关 3. TS核心逻辑 项目源码链接 先来康康效果图 我接下来将讲解相关配置和代码,源码链接放在最底下了,在GitHub上. Explanation 1. tsconfig.json配置 { "compilerOptions": { "target": "ES2015", "module": "ES2015&

  • 基于Java实现简单贪吃蛇游戏

    本文实例为大家分享了Java实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇小游戏制作方法 首先需要的准备有: 1.掌握Java基础知识,即Java SE 2.了解一定的GUI知识 3.自定义的贪吃蛇图片(可以在网上找到) 如果以上三点都没有,也不要紧,完全可以看我之前的博文来进行学习!!!! 学习贪吃蛇的目的 一:了解GUI 对前端的知识进行了解 二:了解监听器的作用 熟练掌握监听器(重点) 三:为枯燥乏味的学习提高兴趣(大重点!!) 贪吃蛇小游戏运行效果 设计思路: 由Game

  • javascript编写贪吃蛇游戏

    代码很简单,这里就不多BB了,小伙伴们直接看示例吧 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta

  • 用最少的JS代码写出贪吃蛇游戏

    曾经诺基亚的贪吃蛇风靡一时,在游戏匮乏的年代,用java实现太难,现在网页制作20行代码就做成一个简单的demo了,时代在进步啊 完整脚本代码: <!doctype html> <html> <body> <canvas id="can" width="400" height="400" style="background: Black"></canvas> <

  • 利用Flutter制作经典贪吃蛇游戏

    目录 前言 使用 Flutter 作为游戏引擎 画蛇 2D 渲染的基础 创建蛇 填写列表 将蛇移动到下一个位置 添加运动和速度 添加控件 改变方向 吃东西和提高速度 在屏幕上显示食物 消耗和再生食物 检测碰撞并显示游戏结束对话框 添加一些收尾工作 重启游戏 显示分数 前言 Flutter (Channel stable, 2.10.3, on Microsoft Windows [Version 10.0.19044.1586], locale zh-CN) Android toolchain

  • C++基于控制台实现的贪吃蛇小游戏

    本文实例讲述了C++基于控制台实现的贪吃蛇小游戏.分享给大家供大家参考.具体实现方法如下: #include <windows.h> #include <time.h> #include <stdio.h> #define MAX 100 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 #define MOVING 5 #define STOP 0 HANDLE hMain_Out = NULL; H

  • 基于C语言实现的贪吃蛇游戏完整实例代码

    本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

随机推荐