看了几个网上的数独的游戏,感觉设计上,总是比较麻烦。特别一些是通过绘图函数来实现数独的,对新手来说不太友好。于是乎想到了用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相关推荐

  1. 十行代码写个摸鱼神器,帮你自动化操作Excel

    十行代码写个摸鱼神器,帮你自动化操作Excel 为啥要做这个? 代码基于Python,行数很少,不重复代码十行左右 相关的视频: 为啥要做这个? 现在很多公司会监控员工行为,包括上厕所的时长,不在座位 ...

  2. python代码写完怎么运行-Python 项目代码写完了,然后怎么打包和发布?

    你把你的代码写完了,是不是要给别人使用下,怎么打包你的项目代码呢? 喂,开源么? 接下来小帅b就跟你说说,如何打包你的代码. 就拿我们上次演示的 用 Python 开发一个 「个人计划 todolis ...

  3. 十行代码写个彩票随机生成器(双色球+大乐透)

    前言 自己动手丰衣足食,平时买彩票总是不中,回想起来是不是他那个机器机选的就是不中的号??? 那就自己code一个试试吧! 偷偷告诉你,我写完 就去买了,结果真就中了! CSDN下载链接:免费的免费的 ...

  4. 十行代码写春联?快来学习程序员独有拉满春节氛围“妙招”

    离春节只剩一周, 路边已经开始挂起了红灯笼,挨家挨户也贴上了春联和福字.每每入夜,红色与黄色的灯光星星点点,相融交错,伴随着熙熙攘攘的家常细碎.让这个漆黑寒冷的冬日突然变得格外温暖. 身为当代程序员, ...

  5. 真香!如何用300行代码写完一个Spring基本框架?

    Spring是一个非侵入性(non-invasive)框架,其目标是使应用程序代码对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行. 看spring的源码,学习spring, ...

  6. python代码写完怎么运行-教你如何编写、保存与运行 Python 程序

    第一步 接下来我们将看见如何在 Python 中运行一个传统的"Hello World"程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Pyth ...

  7. 据说程序员写完代码是这个样子,99%的人都中枪了

    点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 1.当你改错一行代码的时候 2.当你想要重构别人的代码时 3.当你尝试想要修复一个bug时 ...

  8. 4.关于 “ 写完括号里面代码,如何快速跳出 ”

    比如说if()中的代码写完你要跳出来,一般去按键盘上的右方向键,这个很不舒服的. 解决办法1.直接再输入一个右括号,智能一点的编辑器都会把这个括号当作一次方向键. 解决办法2.shift + ente ...

  9. 【趣图】测试刚写完的代码...

    1.被老板委派接手刚刚离职同事的项目... 2.当他们要求我测试所有应用功能时 3.准备下班的时候,测试又提bug过來了- 4.使用新框架却忘记阅读文档 5.测试实习生的代码 6.网络延迟的危害.. ...

最新文章

  1. LLVM一些语法规则
  2. java堆内存与栈内存区别
  3. Jquery的一个特效 仿照flash放大图片
  4. 如何删除写保护的文件_如何找回已删除或永久删除的Office Excel文件
  5. ubuntu16.04字体安装
  6. 商业智能常见名词浅释(转载)
  7. linux 监听日志_Linux系统取证概述
  8. 数据结构复习之【线性表】
  9. Python3 安装RobotFramework
  10. 如何用python 巡检华为交换机?
  11. python rbf神经网络_RBF神经网络是什么?
  12. 记一次python cpu100%分析记录
  13. unity3d shader之Julia集和Mandelbrot集绘制美丽图案
  14. pentestbox基础设置
  15. postgresql统一把字段小写转大写
  16. zabbix4.4 使用自动发现监测web网站健康状态(通过mysql表获取web地址)
  17. Mesh 无线自组网系统
  18. 自己的电脑出现在别人的电脑的网络位置中
  19. 非上市公司的期权激励方案
  20. php 打赏,php怎么得到打赏的用户信息 - 免签支付接口

热门文章

  1. 解决eclipse复制代码到word中出现底色问题
  2. L298N 直流电机驱动模块与 Arduino
  3. 如何写好科研论文 (第一章习题 Quiz 1)
  4. latex 伪代码 elseif怎么写
  5. 使用 Python 快速扫描局域网中活动的 IP
  6. 室内地图有哪些用途?
  7. YoLoV5学习(5)-- Train.py 程序文件与yolov5s模型文件讲解
  8. 【转】前端开发 – 我们的职业
  9. 金杉号:40岁—55岁人的创业项目有哪些?
  10. PendSV中断服务函数