目的

上周新一期的最强大脑出来了,虽然上季被称为最强黑幕,不过呢。我决定还是看看= =。它里面第一关是叫做数字华容道。说白了,就是和拼图差不多。一开始我准备下一个玩玩的。结果没搜到。所以决定写了一个。最后效果差不多是这样:

思路以及实现

首先,我们应该考虑如何去实现这个效果。细想一下,其实和之前的2048有点像,但是又不是完全一直。于是,便又折腾了一波。这次布局和内容项参考之前2048的,下面放上代码:

自定义一个frame layout,我们先绘制里面的数字:

 private void initial() {label = new TextView(getContext());label.setTextSize(32);label.setBackgroundColor(0x33ff0033);label.setTextColor(0x330D0D0D);label.setGravity(Gravity.CENTER);LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);lp.setMargins(10, 10, 0, 0);addView(label, lp);setNum(0);}public int getNum() {return num;}@SuppressLint("SetTextI18n")public void setNum(int num) {this.num = num;if (num <= 0) {label.setText("");} else {label.setText(num + "");}}

我们可以看到上面的数字在3x3中,我们显示1-8。不过通过代码我们可以知道,其实我们是去生成0-8,然后把0的那块内容设为空。

那么我们在想一下,是滑动移动还是点击移动。以现在体验的角度,滑动移动会更方便一点。所以我们需要监听它的滑动事件:

         setOnTouchListener(new View.OnTouchListener() {private float startX, startY, changeX, changeY;@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:startX = event.getX();startY = event.getY();break;case MotionEvent.ACTION_UP:// 改变的X坐标=现在的-起始的changeX = event.getX() - startX;// 改变的Y坐标=现在的-起始的changeY = event.getY() - startY;// 若X的绝对值>Y的绝对值,则是左右移动,否则为上下移动,左上角坐标为(0,0)if (Math.abs(changeX) > Math.abs(changeY)) {if (changeX < -PADDING) {left();} else if (changeX > PADDING) {right();}} else {if (changeY < -PADDING) {up();} else if (changeY > PADDING) {down();}}break;default:}return true;}});

但是我们需要在滑动之前先生成所有的随机数。也就是1-N生成N个随机数。

        public int[] randomCommon(int max, int n) {if (n > (max + 1) || max < 0) {return null;}int[] result = new int[n];int count = 0;while (count < n) {int num = (int) (Math.random() * max) + 1;boolean flag = true;for (int j = 0; j < n; j++) {if (num == result[j]) {flag = false;break;}}if (flag) {result[count] = num;count++;}}return result;}

数字生成完成之后,我们需要把数据放入之前写的Card并且add到现在的GridLayout中。

        private void addCard(int cardWidth, int cardHeight) {Card card;int sum = 0;for (int x = 0; x < addNumber; x++) {for (int y = 0; y < addNumber; y++) {card = new Card(getContext());card.setNum(number[sum] - 1);addView(card, cardWidth, cardHeight);point[x][y] = card;sum++;}}}

数据生成了,内容也显示了,接下来我们需要做的就是对方向的逻辑处理。这边我放一个,其他的同理:

      for (int x = 0; x < addNumber; x++) {for (int y = 0; y < addNumber; y++) {if (x - 1 >= 0) {if (point[x - 1][y].getNum() == 0) {point[x - 1][y].setNum(point[x][y].getNum());point[x][y].setNum(0);isFinish();return;}}}}

如果有人看过之前的2048会发现这边的判断更简单一些,然后我们每次滑动结束,我们需要判断游戏是否结束。如果游戏结束就给它一个提示,是重新来过还是直接下一关:

       int number = 1;for (int x = 0; x < addNumber; x++) {for (int y = 0; y < addNumber; y++) {if (number == addNumber * addNumber) {MainActivity.getMainActivity().stop();new AlertDialog.Builder(getContext()).setTitle("游戏结束!").setMessage("您的时间是:" + MainActivity.getMainActivity().getTimer()).setPositiveButton("重来",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {MainActivity.getMainActivity().clear();start();}}).setNegativeButton("下一关",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {MainActivity.getMainActivity().clear();addNumber();}}).show();return;}if (point[x][y].getNum() == number) {number++;}}}

这样基本所有的逻辑就写完了。具体代码我已经上传到github中:https://github.com/sw950729/NumKlotski

最后

我也试着去玩一玩,里面我也写了计时,我记得我3x3最好成绩是42秒,4x4最好成绩是一分四十。大家可以试一下。你最好能玩到多少。里面我也做了上下限的判断,最低三阶,最高八阶。你们可以试试看能不能通关~

开发一个数字华容道的小游戏相关推荐

  1. 来学习开发一个网页版马里奥小游戏吧

    大家好,我是TJ 一个励志推荐10000款开源项目与工具的程序员 说起全球最有吸金能力的IP,大家会想到什么呢?是漫威?是哈利波特?还是王者荣耀(笑)? 其实很多印象都是主观的,根据Wikimili从 ...

  2. 开发一个简易的俄罗斯方块小游戏

    完整代码如下: import pygame import random import sys# 游戏设置 WINDOW_WIDTH = 400 WINDOW_HEIGHT = 500 GRID_WID ...

  3. Unity 游戏实例开发集合 之 CompoundBigWatermelon (简单合成一个大西瓜) 休闲小游戏快速实现

    Unity 游戏实例开发集合 之 CompoundBigWatermelon (简单合成一个大西瓜) 休闲小游戏快速实现 目录 Unity 游戏实例开发集合 之 CompoundBigWatermel ...

  4. WPF 一个训练记忆力的小游戏——记忆联盟

    WPF 一个训练记忆力的小游戏--记忆联盟 一.简述 记--一个用来训练记忆力的小游戏--记忆联盟. 例子打包:https://wwa.lanzous.com/iM4ZDllmjzi       (2 ...

  5. [SFML]使用SFML复刻一个九宫幻卡小游戏(一)前期规划和准备工作

    写在前面:   是笔者大二下的课内作业,要求是使用SFML制作棋牌类游戏.本人水平较差,复刻开发过程中存在大量走弯路.走邪门.代码冗余等情况.写此博客记录已经是一年以后的复盘了,仅作为个人学习的记录. ...

  6. java猜数游戏图形界面_Java做一个猜数的小游戏

    @Author : By Runsen 效果展现 猜数字游戏是一个简单,有趣的小游戏.游戏者通过输入一个指定区间的数字,与系统产生的随机数进行对比,然后输出相应的结果. 游戏运行时产生一个0-10之间 ...

  7. Android使用SurfaceView开发《捉小猪》小游戏 (一)

    先上效果图: 哈哈, 说下实现思路: 我们可以把每一个树桩, 小猪, 车厢都看成是一个Drawable, 这个Drawable里面保存了x, y坐标, 我们的SurfaceView在draw的时候, ...

  8. 开发一个标题为Flipflop的游戏应用程序

    开发一个标题为Flipflop的游戏应用程序,它从1计数到100,遇到3的倍数就输出单词"Flip",遇到5的倍数就输出单词"Flop",既为3的倍数又为5的倍 ...

  9. 手把手教你做一个Java贪吃蛇小游戏

    大家好,我是孙不坚1208,这篇博客给大家分享一下:如何做一个贪吃蛇小游戏(Java版)的exe应用程序,希望能给需要帮助的朋友带来方便. 手把手教你做一个Java贪吃蛇小游戏的exe应用程序 一.J ...

最新文章

  1. MongoDB操作(.net)
  2. ubuntun_11.04安装
  3. ubuntu改变@后面的主机名
  4. JavaScript RegExp 对象
  5. c++变量重新赋值_Java基础二:一文讲透变量与数据类型
  6. php输出mysqli查询出来的结果
  7. Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor...
  8. 重学TCP协议(12)SO_REUSEADDR、SO_REUSEPORT、SO_LINGER
  9. ArrayList 实现原理及源码解析(jdk8 底层⽤的是数组)
  10. 华硕v4000fj笔记本怎么样_所有已开箱笔记本的目录汇总 20200812
  11. apache rewrite支持post数据
  12. lcx 通过端口转发实现内网穿透
  13. excel多个窗口独立显示_收藏!Excel快捷键
  14. centos linux安装网卡驱动,如何在CentOS系统下安装网卡驱动
  15. C++ 模版类和模板函数介绍及使用
  16. 【FJ 2016 Day5】冷战(coldwar)
  17. 华为Play 4T Pro批量添加联系人
  18. PTA(接口)用java写 7-10 房屋、住宅、写字楼类
  19. 关于数据库的内模式、模式、外模式,数据的逻辑独立性,数据的物理独立性的个人体会
  20. NBUT 1119 Patchouli's Books (STL应用)

热门文章

  1. FX5U FX5-40SSC-G简单运动控制模块设置
  2. Oracle删除字段之前判断字段是否存在
  3. SpringBoot--maven-wrapper(mvnw)--使用/详解
  4. 「数字化生产」PDM和PIM:有什么区别?
  5. 看完这篇文章轻松学会如何视频剪辑制作
  6. [冀信2021-pwn] pwn19
  7. 企业级日志分析系统ELK(Elasticsearch , Logstash, Kibana)
  8. 基于JAVAWEB系统秒杀优化设计计算机毕业设计源码+系统+lw文档+部署
  9. vue-cli网页聊天室:当聊天室有新消息时,控制滚动条滚动到底部
  10. 弘辽科技:淘宝怎么做免费推广?有哪些免费推广活动?