几十行代码写完数独APP
生活随笔
收集整理的這篇文章主要介紹了
几十行代码写完数独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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【win+黑苹果双系统①】小新黑苹果图文
- 下一篇: 首版次高端软件申报流程