开发实例系列:一、舒尔特方格小游戏,付源码和APK

2023-10-31

舒尔特方格 ,生成随机数,从小到大依次点击,时间越短越好。

底部带源码和apk下载

注意功能点:

一、使用TableLayout自动生成表格

       这一部分是参考网上的帖子,找不到原连接了;

       自定义TableLayout, 以下是源码

public class TableBorderLayout extends TableLayout {
    private Context mContext;
    private BaseAdapter mAdapter;
    private int column = 0; //每行的个数


    public TableBorderLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        setStretchAllColumns(true);
    }

    public void setAdapter(BaseAdapter baseAdapter, int column) {
        if (baseAdapter == null || baseAdapter.getCount() == 0) {
            return;
        }
        this.mAdapter = baseAdapter;
        this.column = column;//个数

        drawLayout();
    }

    private void drawLayout() {
        removeAllViews();
        int realcount = mAdapter.getCount();//数据的总数,list.size(); 例如:size = 18
        int count = 0;
        if (realcount < column) {//如果集合里的数据 小于 行个数   例如:18 > 5
            count = column;
        } else if (realcount % column != 0) {   // 18 % 5 = 3    3 != 0
            count = realcount + column - (realcount % column); // 18 + 5 - 3 = 20  count=20
        } else {
            count = realcount;
        }

        TableRow tableRow = null; //每一行的tableRow
        for (int i = 0; i < count; i++) {  //i < 20, 会循环20次,添加20个格子,但数据总数只有18,所以最后两个是空的
            final int index = i;
            View view = null;
            if (index >= realcount) {
                view = mAdapter.getView((realcount - 1), null, null);
                view.setVisibility(INVISIBLE);//没有数据不显示
            } else {
                view = mAdapter.getView(index, null, null);
            }

            if (index % column == 0) { //整行,每次取余为0 就会新增一行实现自增长,最大数为20,个数为5,会增四行
                tableRow = new TableRow(mContext);
            }

            if (tableRow != null) {//添加view
                tableRow.addView(view);
            }

            if (index % column == 0) {
                addView(tableRow, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            }
        }
    }
}

adapter源码:

public class MyAdapter extends BaseAdapter {

    private List<Integer> dataList;
    private LayoutInflater mInflater;
    private int type;
    private View.OnClickListener clickListener;
    private Context context;
    private List<Integer> isR = new ArrayList<>(); //随机色彩R
    private List<Integer> isG = new ArrayList<>(); //随机色彩G
    private List<Integer> isB = new ArrayList<>(); //随机色彩B

    public MyAdapter(Context context, List<Integer> dataList, View.OnClickListener clickListener, int type) {
        this.mInflater = LayoutInflater.from(context);
        this.dataList = dataList;//总数据
        this.clickListener = clickListener;
        this.type = type; //用来判断是 行个数是否为7、9
        this.context = context;
    }

    public MyAdapter(Context context, List<Integer> dataList, View.OnClickListener clickListener, int type, List<Integer> isR, List<Integer> isG, List<Integer> isB) {
        this.mInflater = LayoutInflater.from(context);
        this.dataList = dataList;
        this.clickListener = clickListener;
        this.type = type;
        this.context = context;
        this.isR = isR;
        this.isG = isG;
        this.isB = isB;
    }

    @Override
    public int getCount() {
        return dataList.size();
    }

    @Override
    public Object getItem(int i) {
        return dataList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        if (view == null) {
            view = mInflater.inflate(R.layout.item_click_interface_list, null);
        }

        TextView textView = view.findViewById(R.id.tvTile);
        if (type == 7) {
            textView.setTextSize(20);//缩小字体
        } else if (type == 9) {
            textView.setTextSize(16);
        }

        if (isR.size() > 0  && isG.size() > 0 && isB.size() > 0){//生成随机色
            textView.setBackgroundColor(Color.rgb(isR.get(i+1), isG.get(i+2), isB.get(i+3)));
        }

        textView.setText("" + dataList.get(i).toString());
        textView.setId(dataList.get(i).intValue());//设置ID

        textView.setOnClickListener(clickListener);
        return view;
    }
}

二、打乱数字

      打乱数字比较简单,使用Collections.shuffle()方法,已下是关键代码:

//打乱数字
Collections.shuffle(numberList);
shuffle(List<?>) 方法用于随机排列随机使用一个默认的源指定的列表

这个方法很实用,在随机色彩也使用了该方法。



...............................以上就是应用比较关键的代码.............................

三、应用截图

共有三种模式,普通模式{3x3, 5x5, 7x7, 9x9},素数模式{5x5},奇数模式{3x3, 5x5, 7x7}。 
特殊的色彩方格模式:开启后方格底色将会带有颜色,以此来增加难度。


四、源码和APK下载

          源码:

                 github:  https://github.com/Mei-Bin/MyShulteProject

                 百度云:链接:https://pan.baidu.com/s/1pMZqNov 密码:oqqn

          APK:

                  百度云:链接:https://pan.baidu.com/s/1dFPl8FB 密码:oejm

五、最后的话:

              舒尔特这个游戏也挺有意思的,主要锻炼注意力................



    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发实例系列:一、舒尔特方格小游戏,付源码和APK 的相关文章

随机推荐

  • 什么是obj文件?

    百度百科 程序编译时生成的中间代码文件 目标文件 一般是程序编译后的二进制文件 再通过链接器 LINK EXE 和资源文件链接就成可执行文件了 OBJ只给出了程序的相对地址 而可执行文件是绝对地址 1 这个问题不是很简单 你只看到了文件从源
  • rename函数的用法

    import pandas as pd df pd DataFrame A 1 2 3 B 4 5 6 print df df1 df rename columns A a B c print df1 结果 A B 0 1 4 1 2 5
  • tensorflow的Data Pipeline系列教程(一)——Dataset类的属性即常用方法

    前言 在tensorflow中 训练数据常常需要经过随机打乱 分成一个一个的batch来进行训练 当然有很多的方式可以完成 比如我们可以通过传统的python方法构建迭代器 我们也可以使用其它的一些方法 但是tensorflow本身提供了强
  • 2.管理者的分类与角色

    管理者及其分类 什么是管理者 管理者是组织中那些指挥别人活动的人 管理者工作绩效的好坏直接关系着组织的兴衰成败 管理者处于组织中的不同层次 其头衔也各式各样 但他们工作具有一个共同的特征 即都是通过协调他人的努力来是组织活动更加有效并实现组
  • 328. 奇偶链表-链表拆分合并

    一 题目描述 给定单链表的头节点 head 将所有索引为奇数的节点和索引为偶数的节点分别组合在一起 然后返回重新排序的列表 第一个节点的索引被认为是 奇数 第二个节点的索引为 偶数 以此类推 请注意 偶数组和奇数组内部的相对顺序应该与输入时
  • 坏苹果是团队的毒药

    最近一期的 美国生活 采访了WillFelps 他是华盛顿大学的一位教授 曾经组织过一次社会学实验来证明 坏苹果 的出奇强大的影响力 译者注 美国生活 This American Life 是一档叙事类的广播节目 每周一期 在超过500家电
  • ubuntu10.04和12.04 上cpan的安装步骤及常见问题解决方法

    在我们用 perl 编写程序的时候 会要用到很多的 perl module 这种情况下就需要安装程序所需要的 module 然而这些module通常都是在www cpan org网站上面抓的 所以我们可以通过安装cpan来安装perl程序需
  • mysql 备忘录

    文章目录 rownum 版本 DDL DML insert insert into x with recursive mysql8 0 临时表 常用 存储过程 数据导出 导入 mysqldump load data csv 比 insert
  • Go语言并发之美:解释其中内核、外延

    多核处理器越来越普及 那有没有一种简单的办法 能够让我们写的软件释放多核的威力 答案是 Yes 随着Golang Erlang Scale等为并发设计的程序语言的兴起 新的并发模式逐渐清晰 正如过程式编程和面向对象一样 一个好的编程模式需要
  • 短信消息通知服务-spring定时计划任务quartz(一)

    集成短信消息与平台服务 希望能够在工作台中的每天的值班计划安排表中获取相关数据通知到每个当天值班人员 达到消息的畅通及时性 当中涉及到的技术有spring quartz等 具体步骤如下 一 编写业务类 package com greedc
  • 在微信小程序中怎样阻止冒泡事件?

    在微信小程序当中 当两个包含的视图都使用了bindtap函数来绑定点击事件的话 就会发生冒泡事件 即点击内部事件时将同时触发外部事件 如果我们要想阻止冒泡事件的发生 将被包含在内部的bindtap该为catchtap即可 下面请看具体事例
  • win10远程连接win7 使用win自带远程连接

    1 右键计算机打开属性 2 点击高级设置 3 勾选容许连接 确定 4 win r 打开运行输入cmd 5 查看机器ip地址 6 在另一台电脑打开远程连接 6 打开之后输入刚才查看的IP地址 7 输入用户名和密码 如果没有就在被连接的电脑创建
  • 构造BufferWriter和BufferReader实现高效的对象序列化和反序列化

    在之前的文章讲术了如何设计一个简单的网络缓冲区和缓冲池 在 net网络应用中有一个普遍的问题就是如何把对象写入缓冲和从缓冲中读取数据还原对象 在这里会实现一个Writer和Reader方便地把信息写入缓冲区和从缓冲区读取 先看下Writer
  • C语言基础入门48篇_38_函数指针与typedef(函数指针即指向函数的指针、函数指针定义int (*pfn)(int)、typedef给数据类型起别名,起到的作用一致、typedef简化函数指针)

    1 函数指针的定义 函数就是在内存中的一段机器码 也是有地址的 函数名即为函数的首地址 使用 函数名也可以得到函数地址 include
  • chrome去广告插件 &去掉百度热搜

    1 每次查资料 一堆很乱的广告 脱发 牙齿 甚是恐怖 2 每次百度搜东西 每次右侧都有百度热搜 总是忍不住点进去 浪费时间 推荐 使用前 使用后
  • QT操作excel的两种方式 QT基础入门【Excel的操作】

    QT操作excel的方式有两种 QAxObject 和QtXlsx QAxObject是通过调用office或者wps组件来实现对excel图表的操作的 只有装office软件或者wps软件就可以实现 但是 如果只装了office软件 有时
  • validform表单验证插件最终版

    做个笔记 以后直接用吧 报名界面
  • C++类上使用属性(__declspec property)

    原始代码如下 class A private int m nIndex public int getIndex return m nIndex void setIndex int value m nIndex value 如果采用属性方式实
  • JSP页面forEach使用

    1 在jsp页面引入jstl标签 2 后端传入前端list ServletActionContext getRequest setAttribute List别名 detailList 3 前端jsp接收 table tr th 列名称A
  • 开发实例系列:一、舒尔特方格小游戏,付源码和APK

    舒尔特方格 生成随机数 从小到大依次点击 时间越短越好 底部带源码和apk下载 注意功能点 一 使用TableLayout自动生成表格 这一部分是参考网上的帖子 找不到原连接了 自定义TableLayout 以下是源码 public cla