IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter 贪吃蛇小游戏(要用上下左右控制的。。。没键盘的不行哦)245行 -> 正文阅读

[移动开发]Flutter 贪吃蛇小游戏(要用上下左右控制的。。。没键盘的不行哦)245行

贪吃蛇小游戏。

?

import 'dart:async';
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: '贪吃蛇'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

//球的位置
Offset _ball = Offset.zero;
//每个快宽度固定的
const double _size = 20;
//贪吃蛇的位置
List<Offset> _snakeList = [Offset(_size * 2, 0), Offset(_size * 3, 0)];

//贪吃蛇的方向
enum Direction { Up, Down, Left, Right }
enum GameStatus { Over, Start }

Direction _direction = Direction.Up;
GameStatus _gameStatus = GameStatus.Start;

late Timer _timer;

class _MyHomePageState extends State<MyHomePage> {
  //每次build之前被调用
  @override
  void didChangeDependencies() {
    reSetGame();
    super.didChangeDependencies();
  }

  void reSetGame() {
    var period = Duration(milliseconds: 200);
    double maxWidth = MediaQuery.of(context).size.width;
    double maxHeight = MediaQuery.of(context).size.height;
    double widthPad = maxWidth % _size;
    double heightPad = maxHeight % _size;
    maxWidth = maxWidth - widthPad;
    maxHeight -= heightPad;
    _ball = randomPosition(maxWidth, maxHeight);
    _timer = Timer.periodic(period, (timer) {
      //更新蛇的位置
      List<Offset> newSnakeList = List.generate(_snakeList.length, (index) {
        if (index > 0) {
          return _snakeList[index - 1];
        } else {
          final snakeHead = _snakeList[0];

          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);
            case Direction.Left:
              return Offset(
                  (snakeHead.dx - _size + maxWidth) % maxWidth, snakeHead.dy);
            case Direction.Right:
              return Offset((snakeHead.dx + _size) % maxWidth, snakeHead.dy);
          }
        }
      });
      //贪吃蛇吃到块
      if (newSnakeList[0] == _ball) {
        //吧贪吃蛇加一个
        newSnakeList..add(_snakeList[_snakeList.length - 1]);
        setState(() {
          _ball = randomPosition(maxWidth, maxHeight);
        });
      }
      //贪吃蛇迟到自己
      List<Offset> judgeSnakeList = List.from(newSnakeList);
      judgeSnakeList.removeAt(0);
      if (judgeSnakeList.contains(newSnakeList[0])) {
        setState(() {
          _gameStatus = GameStatus.Over;
          _timer.cancel();
        });
      }
      setState(() {
        _snakeList = newSnakeList;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _incrementCounter method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.
    return Scaffold(
        body: RawKeyboardListener(
      focusNode: FocusNode(),
      autofocus: true,
      onKey: (event) {
        if (event.runtimeType == RawKeyDownEvent) {
          Direction newDirection = Direction.Left;

          switch (event.logicalKey.keyLabel) {
            case "Arrow Up":
              // 处理对立面
              if (_direction == Direction.Down) {
                return;
              }
              newDirection = Direction.Up;
              break;
            case "Arrow Down":
              // 处理对立面
              if (_direction == Direction.Up) {
                return;
              }
              newDirection = Direction.Down;
              break;
            case "Arrow Left":
              // 处理对立面
              if (_direction == Direction.Right) {
                return;
              }
              newDirection = Direction.Left;
              break;
            case "Arrow Right":
              // 处理对立面
              if (_direction == Direction.Left) {
                return;
              }
              newDirection = Direction.Right;
              break;
          }
          setState(() {
            _direction = newDirection;
          });
        }
      },
      child: _gameStatus == GameStatus.Start
          ? _buildGameStart()
          : _buildGameOver(),
    )
        // This trailing comma makes auto-formatting nicer for build methods.
        );
  }

  GestureDetector _buildGameOver() {
    return GestureDetector(
      onTap: () {},
      child: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            TextButton(
              child: Text("点击继续游戏(假装有广告其实没有)"),
              onPressed: () {
                setState(() {
                  _gameStatus = GameStatus.Start;
                  reSetGame();
                });
              },
            ),
            TextButton(
              child: Text("点击重新游戏(假装有广告其实没有)"),
              onPressed: () {
                setState(() {
                  _gameStatus = GameStatus.Start;
                  _direction = Direction.Up;
                  _snakeList = [Offset(_size * 2, 0), Offset(_size * 3, 0)];
                  reSetGame();
                });
              },
            )
          ],
        ),
      ),
    );
  }

  _buildGameStart() {
    return Stack(
      children: _snakeList
          .map((snake) => Positioned.fromRect(
              rect: Rect.fromCenter(
                  center: adjust(snake), width: _size, height: _size),
              child: Container(
                margin: EdgeInsets.all(1),
                color: Colors.black,
              )))
          .toList()
            //蛇
            ..add(Positioned.fromRect(
                rect: Rect.fromCenter(
                    center: adjust(_ball), width: _size, height: _size),
                child: Container(
                  margin: EdgeInsets.all(1),
                  color: Colors.orange,
                ))),
    );
  }

  Offset adjust(Offset offset) {
    return Offset(offset.dx + (_size / 2), offset.dy + (_size / 2));
  }

  Offset randomPosition(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(actualWidth, actualHeight);
  }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:35:19  更:2021-08-21 15:35:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:16:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码