几十行代码写完数独APP
看了几个网上的数独的游戏,感觉设计上,总是比较麻烦。特别一些是通过绘图函数来实现数独的,对新手来说不太友好。于是乎想到了用GridLayout去实现一个简单的数独。
本文涉及的内容
一个基本的数独包含了数独界面设计,题目的生成,数独的填入,结果的判断
这里只涉及数独界面的设计和数独的填入。
主要代码
布局设计
利用动态生成9x9的textView,插入到GridLayout控件里面。这里控件要设置为水平优先,即插入的控件首先在水平方向上逐个分布,直到超出最大列数。这两个按钮的功能这里没有去实现,可以忽略。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><GridLayoutandroid:id="@+id/gl"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"></GridLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1"android:text="检查结果" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1"android:text="自动完成" /></LinearLayout>
</LinearLayout>
代码逻辑
onCreate事件里面生成TextView数组tile,并设置上下文菜单。这个菜单是通过长按textview控件会自动跳出的。内置一个int[][] suduku数组,作为数独的题目。0表示空格,程序只在这些位置上设置相应textview的上下文菜单。最后,利用setLayoutParams去实现数独格子之间的间隔,还要注意宫格之间的间隔要宽一些,具体参考下面的代码
实现代码
public class MainActivity extends AppCompatActivity {private GridLayout mGl;private TextView[][] tile = new TextView[9][9];private TextView mCurrTextView = null;private final String[] TxtMenu = {" ", "1", "2", "3", "4", "5", "6", "7", "8", "9"};//内置的数独题目private int[][] suduku = {{0, 1, 5, 2, 6, 8, 7, 9, 3},{3, 2, 9, 7, 4, 1, 5, 6, 8},{6, 7, 8, 3, 5, 9, 2, 1, 4},{0, 3, 2, 5, 7, 4, 1, 8, 6},{8, 5, 4, 9, 1, 6, 3, 7, 2},{1, 6, 7, 8, 3, 2, 4, 5, 9},{5, 8, 3, 6, 2, 0, 0, 4, 1},{2, 9, 1, 4, 0, 5, 6, 3, 7},{7, 4, 6, 1, 9, 3, 8, 2, 5}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mGl = (GridLayout) findViewById(R.id.gl);mGl.setColumnCount(9);mGl.setRowCount(9);mGl.setBackgroundColor(Color.BLUE);for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {tile[i][j] = new TextView(this);tile[i][j].setText(TxtMenu[suduku[i][j]]);//txt[(9*i+j)%10]tile[i][j].setTag(9 * i + j);if (suduku[i][j] == 0) {tile[i][j].setTextColor(Color.BLUE);registerForContextMenu(tile[i][j]);}GridLayout.LayoutParams para = new GridLayout.LayoutParams();para.width = 118;para.height = para.width;para.setMargins(1, 1, 1, 1);if (i % 3 == 2 && j % 3 == 2) {para.setMargins(1, 1, 8, 8);}tile[i][j].setLayoutParams(para);tile[i][j].setGravity(Gravity.CENTER);tile[i][j].setBackgroundColor(Color.WHITE);tile[i][j].setTextSize(36);tile[i][j].setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));mGl.addView(tile[i][j]);}}}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);MenuInflater menuInflater = new MenuInflater(this);int col = (int) (v.getTag()) % 9;int row = (int) (v.getTag()) / 9;mCurrTextView = tile[row][col];for (int i = 0; i < TxtMenu.length; i++) {menu.add(TxtMenu[i] == " " ? "X" : TxtMenu[i]);}}@Overridepublic boolean onContextItemSelected(MenuItem item) {//Log.i("onContextItemSelected",item.getTitle().toString());String str = item.getTitle().toString();mCurrTextView.setText(str == "X" ? " " : str);int tag = (int) mCurrTextView.getTag();int row = tag / 9;int col = tag % 9;suduku[row][col] = str == "X" ? 0 : Integer.parseInt(str);return super.onContextItemSelected(item);}
}
实现效果
总结
这是一个极简单的数独设计,代码非常少。不过,代码不是按照面向对象的思路设计的,所以要复用比较麻烦。既然求简,那就这样吧
几十行代码写完数独APP相关推荐
- 十行代码写个摸鱼神器,帮你自动化操作Excel
十行代码写个摸鱼神器,帮你自动化操作Excel 为啥要做这个? 代码基于Python,行数很少,不重复代码十行左右 相关的视频: 为啥要做这个? 现在很多公司会监控员工行为,包括上厕所的时长,不在座位 ...
- python代码写完怎么运行-Python 项目代码写完了,然后怎么打包和发布?
你把你的代码写完了,是不是要给别人使用下,怎么打包你的项目代码呢? 喂,开源么? 接下来小帅b就跟你说说,如何打包你的代码. 就拿我们上次演示的 用 Python 开发一个 「个人计划 todolis ...
- 十行代码写个彩票随机生成器(双色球+大乐透)
前言 自己动手丰衣足食,平时买彩票总是不中,回想起来是不是他那个机器机选的就是不中的号??? 那就自己code一个试试吧! 偷偷告诉你,我写完 就去买了,结果真就中了! CSDN下载链接:免费的免费的 ...
- 十行代码写春联?快来学习程序员独有拉满春节氛围“妙招”
离春节只剩一周, 路边已经开始挂起了红灯笼,挨家挨户也贴上了春联和福字.每每入夜,红色与黄色的灯光星星点点,相融交错,伴随着熙熙攘攘的家常细碎.让这个漆黑寒冷的冬日突然变得格外温暖. 身为当代程序员, ...
- 真香!如何用300行代码写完一个Spring基本框架?
Spring是一个非侵入性(non-invasive)框架,其目标是使应用程序代码对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行. 看spring的源码,学习spring, ...
- python代码写完怎么运行-教你如何编写、保存与运行 Python 程序
第一步 接下来我们将看见如何在 Python 中运行一个传统的"Hello World"程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Pyth ...
- 据说程序员写完代码是这个样子,99%的人都中枪了
点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 1.当你改错一行代码的时候 2.当你想要重构别人的代码时 3.当你尝试想要修复一个bug时 ...
- 4.关于 “ 写完括号里面代码,如何快速跳出 ”
比如说if()中的代码写完你要跳出来,一般去按键盘上的右方向键,这个很不舒服的. 解决办法1.直接再输入一个右括号,智能一点的编辑器都会把这个括号当作一次方向键. 解决办法2.shift + ente ...
- 【趣图】测试刚写完的代码...
1.被老板委派接手刚刚离职同事的项目... 2.当他们要求我测试所有应用功能时 3.准备下班的时候,测试又提bug过來了- 4.使用新框架却忘记阅读文档 5.测试实习生的代码 6.网络延迟的危害.. ...
最新文章
- LLVM一些语法规则
- java堆内存与栈内存区别
- Jquery的一个特效 仿照flash放大图片
- 如何删除写保护的文件_如何找回已删除或永久删除的Office Excel文件
- ubuntu16.04字体安装
- 商业智能常见名词浅释(转载)
- linux 监听日志_Linux系统取证概述
- 数据结构复习之【线性表】
- Python3 安装RobotFramework
- 如何用python 巡检华为交换机?
- python rbf神经网络_RBF神经网络是什么?
- 记一次python cpu100%分析记录
- unity3d shader之Julia集和Mandelbrot集绘制美丽图案
- pentestbox基础设置
- postgresql统一把字段小写转大写
- zabbix4.4 使用自动发现监测web网站健康状态(通过mysql表获取web地址)
- Mesh 无线自组网系统
- 自己的电脑出现在别人的电脑的网络位置中
- 非上市公司的期权激励方案
- php 打赏,php怎么得到打赏的用户信息 - 免签支付接口