数独游戏app制作拆解(之三)——数字候选区实现

所谓的数据候选区就是这个:

数字候选区功能及实现:

说明:这部分其实也是textview.

本区功能:

一、实现数字显示到显示区。点击显示区选定某个格子后,再点击这里的数字,会在格子内显示相应的数字。在编辑题目的时候textview的text字体为黑色,解题的时候是红色,在解题的时候直接就是红色字体。如图:

逻辑:其实就是选择的textview的text等于候选数字区的textview的text.只不过在不同的状态下显示不同的颜色,没什么难的。

代码实现(这里面包括其他功能,看后面拆解。):

java 复制代码
 // 遍历设置每个数字(1,2,3,,,)的textview功能
        for (TextView viewnum : anniushuzi) {
            viewnum.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:// 当按下时的处理
                            //如果是空的才能修改
                            if (mytextview.getText().toString() == "") {
                                mytextview.setText(viewnum.getText());//修改选定的textvie的text等于点击的数字。
                                //stopSound();
                                mediaplayer.start();//播放声音
                            }
                            paichong(mytextview);//行列宫排重
                            out.println("标志为:"+biaozhi);
                            if (biaozhi==false){//biaozhi==false表示未出错,才保存,最后一步出错不保存。
                                save();
                            }

                            showsamenum(mytextview, viewnum);//找相同的数字并设置背景灰色,
                            //通过计数空值判断是否全部填写完成,空值为0完成,弹窗。
                            int i=0;
                            for (TextView textView : textViews) {
                                if (textView.getText().toString() == "") {
                                    i++;
                                }
                            }
                            if(i==0&&biaozhi==false){
                                AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
                                builder1.setTitle("恭喜完成!");
                                builder1.setMessage("今年发大财!!!");
                                builder1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {//点击确定后操作

                                    }
                                });
                                AlertDialog dialog = builder1.create();
                                dialog.show();
                            }


                    }
                    return false; // 返回true表示已消费事件,不再传递
                }
            });
        }

其实实现显示数字就一条就够了:

复制代码
mytextview.setText(viewnum.getText());

这里面的mytextview就是上篇我提到的一个public变量,表示的是当前点击的格子。但有多个条件限制这个功能实现。比如:只有当这个格子为空的情况下才可以填写,不然就会覆盖。下面判断代码实现:

复制代码
if (mytextview.getText().toString() == "") {
    mytextview.setText(viewnum.getText());//修改选定的textvie的text等于点击的数字。
    //stopSound();
    mediaplayer.start();//播放声音
}

这里面用到了tostring(),因为textview的text不是字符型数据,必须转化为字符才能和""进行比较。

(播放声音后面说明 。)

上面代码的anniushuzi是1-9这几个数字textview组成的数组:

java 复制代码
anniushuzi = new TextView[]{textview1, textview2, textview3, textview4, textview5, textview6, textview7, textview8, textview9};

通过循环实现单个数字的点击功能也是挺巧妙的,之前我一个数字写一个,没把我累死,出错了,改也麻烦,整个代码臃肿无比,后来也不知道脑子咋想的代码就成一块了,很好。

二、排重。无论是在题目编辑还是在解题的时候,由于操作错误还是思考错误"行,列,宫"内都可以出现重复数字,这是违反规则的,所以必须要显示出来。这个功能实现是先排重再弹窗提示。

1、排重。(函数:paichong())这个功能的实现就是通过对每行,每列,每宫的数字进行轮循比较,实现只要行内、列内,宫内有两个数字相同就属于重复。

代码:

java 复制代码
public void paichong(TextView view) {//view为点击的textview,即mytextview.通过点击赋值,每次点击都会变。
        //行内重复判定,列宫的判定方法相同。
        biaozhi=false;
        for (int i = 0; i < 9; i++) {//遍历textviewhang数组
            for (int j = 0; j < 9; j++) {//遍历textviewhang内每行数组内的元素,即每行的textview。
                if (textViewshang[i][j] == view) {//定位点击的textview所在行,如果相等则textviewshang[i]即为mytextview所在行。
                    int k = 0;//计数初始化
                    for (TextView viewhang : textViewshang[i]) {//遍历行
                        if (viewhang.getText().toString().equals(view.getText().toString())) {//找到与输入的数值(1,2,3..。)相等的textview并计数。转下行。。
                            k++;//计数+1,与k+=1相同                                          //==比较的是地址,可能不相同,equals()比较的是值,此处只能用equals(),否则排重出错。
                        };
                        if (viewhang.getText().toString().equals(view.getText().toString()) && k == 2) {//如果值(1,2,3..)相同并且计数等于2(重复)则背景改为红色
                            biaozhi=true;//如果填写重复数字(两个数字相同)的标志
                            //弹窗
                            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                            builder.setTitle("二货!");
                            builder.setMessage("行内输入重复!!!");
                            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {//点击确定后操作
                                    //view1.setBackgroundColor(Color.GRAY);
                                    view.setBackgroundColor(Color.GRAY);//颜色改为灰
                                    view.setText("");//清空输入的重复值

                                }
                            });
                            AlertDialog dialog = builder.create();
                            dialog.show();
                            break;
                        }
                    }
                }
            }
        }
        //列内重复判定
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (textViewslie[i][j] == view) {
                    int k = 0;
                    for (TextView viewlie : textViewslie[i]) {
                        if (viewlie.getText().toString().equals(view.getText().toString())) {
                            k++;
                        }
                        ;
                        if (viewlie.getText().toString().equals(view.getText().toString()) && k == 2) {
                            view.setBackgroundColor(Color.RED);
                            biaozhi=true;
                            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                            builder.setTitle("二货!");
                            builder.setMessage("列内输入重复!!!");
                            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //view1.setBackgroundColor(Color.GRAY);
                                    view.setBackgroundColor(Color.GRAY);
                                    view.setText("");

                                }
                            });
                            AlertDialog dialog = builder.create();
                            dialog.show();
                            break;
                        }
                    }
                }
            }
        }
        //宫内重复判定
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (textViewsgong[i][j] == view) {
                    int k = 0;
                    for (TextView viewgong : textViewsgong[i]) {
                        if (viewgong.getText().toString().equals(view.getText().toString())) {
                            k++;
                        }
                        ;
                        if (viewgong.getText().toString().equals(view.getText().toString()) && k == 2) {
                            //view.setBackgroundColor(Color.RED);
                            biaozhi=true;
                            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                            builder.setTitle("二货!");
                            builder.setMessage("宫内输入重复!!!");
                            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //view1.setBackgroundColor(Color.GRAY);
                                    view.setBackgroundColor(Color.GRAY);
                                    view.setText("");

                                }
                            });
                            AlertDialog dialog = builder.create();
                            dialog.show();
                            break;
                        }
                    }
                }
            }
        }
    }

(其实代码应该还可以简化,懒得改,看,之前显示区的81个格子就是这样的代码,好恐怖。)

复制代码
textViewshang[i][j] 是个二维数组。textViewslie[i][j],textViewsgong[i][j]也一样,就是行列宫都使用二级数组,在这里很好用。
java 复制代码
        textViewshang = new TextView[][]{textViewshang1, textViewshang2, textViewshang3, textViewshang4, textViewshang5, textViewshang6, textViewshang7, textViewshang8, textViewshang9};
        textViewslie = new TextView[][]{textViewslie1, textViewslie2, textViewslie3, textViewslie4, textViewslie5, textViewslie6, textViewslie7, textViewslie8, textViewslie9};
        textViewsgong = new TextView[][]{textviewgonh1, textviewgonh2, textviewgonh3, textviewgonh4, textviewgonh5, textviewgonh6, textviewgonh7, textviewgonh8, textviewgonh9};

而里面的每个元素又是一个一维数组,看看有多恐怖:

java 复制代码
         //行
        textViewshang1 = new TextView[]{textview11, textview12, textview13, textview14, textview15, textview16, textview17, textview18, textview19};
        textViewshang2 = new TextView[]{textview21, textview22, textview23, textview24, textview25, textview26, textview27, textview28, textview29};
        textViewshang3 = new TextView[]{textview31, textview32, textview33, textview34, textview35, textview36, textview37, textview38, textview39};
        textViewshang4 = new TextView[]{textview41, textview42, textview43, textview44, textview45, textview46, textview47, textview48, textview49};
        textViewshang5 = new TextView[]{textview51, textview52, textview53, textview54, textview55, textview56, textview57, textview58, textview59};
        textViewshang6 = new TextView[]{textview61, textview62, textview63, textview64, textview65, textview66, textview67, textview68, textview69};
        textViewshang7 = new TextView[]{textview71, textview72, textview73, textview74, textview75, textview76, textview77, textview78, textview79};
        textViewshang8 = new TextView[]{textview81, textview82, textview83, textview84, textview85, textview86, textview87, textview88, textview89};
        textViewshang9 = new TextView[]{textview91, textview92, textview93, textview94, textview95, textview96, textview97, textview98, textview99};
        //列
        textViewslie1 = new TextView[]{textview11, textview21, textview31, textview41, textview51, textview61, textview71, textview81, textview91};
        textViewslie2 = new TextView[]{textview12, textview22, textview32, textview42, textview52, textview62, textview72, textview82, textview92};
        textViewslie3 = new TextView[]{textview13, textview23, textview33, textview43, textview53, textview63, textview73, textview83, textview93};
        textViewslie4 = new TextView[]{textview14, textview24, textview34, textview44, textview54, textview64, textview74, textview84, textview94};
        textViewslie5 = new TextView[]{textview15, textview25, textview35, textview45, textview55, textview65, textview75, textview85, textview95};
        textViewslie6 = new TextView[]{textview16, textview26, textview36, textview46, textview56, textview66, textview76, textview86, textview96};
        textViewslie7 = new TextView[]{textview17, textview27, textview37, textview47, textview57, textview67, textview77, textview87, textview97};
        textViewslie8 = new TextView[]{textview18, textview28, textview38, textview48, textview58, textview68, textview78, textview88, textview98};
        textViewslie9 = new TextView[]{textview19, textview29, textview39, textview49, textview59, textview69, textview79, textview89, textview99};
        //宫
        textviewgonh1 = new TextView[]{textview11, textview12, textview13, textview21, textview22, textview23, textview31, textview32, textview33};
        textviewgonh2 = new TextView[]{textview14, textview15, textview16, textview24, textview25, textview26, textview34, textview35, textview36};
        textviewgonh3 = new TextView[]{textview17, textview18, textview19, textview27, textview28, textview29, textview37, textview38, textview39};
        textviewgonh4 = new TextView[]{textview41, textview42, textview43, textview51, textview52, textview53, textview61, textview62, textview63};
        textviewgonh5 = new TextView[]{textview44, textview45, textview46, textview54, textview55, textview56, textview64, textview65, textview66};
        textviewgonh6 = new TextView[]{textview47, textview48, textview49, textview57, textview58, textview59, textview67, textview68, textview69};
        textviewgonh7 = new TextView[]{textview71, textview72, textview73, textview81, textview82, textview83, textview91, textview92, textview93};
        textviewgonh8 = new TextView[]{textview74, textview75, textview76, textview84, textview85, textview86, textview94, textview95, textview96};
        textviewgonh9 = new TextView[]{textview77, textview78, textview79, textview87, textview88, textview89, textview97, textview98, textview99};

个人觉得这里的思路也挺牛逼的,我------挺牛逼:)。其实逻辑简单,实现比较麻烦。view为点击的textview,即mytextview.通过点击赋值,每次点击都会变。然后轮循81个格子,发现一样的就弹窗警告重复。但这里实际不是只重复了81次,是三个81次,因为行,列,宫各81次,也就是说每填写一个数字都进行三个81次的轮循。当然有重复的不会循环这么多次,但没有重复一定都会轮循完成。

复制代码
biaozhi=false;

这是一个标志,给别的地方用的,就是有重复的情况下为true,否则为false.暂时不讲。

计数和弹窗:

java 复制代码
if (viewhang.getText().toString().equals(view.getText().toString())) {//找到与输入的数值(1,2,3..。)相等的textview并计数。转下行。。
                            k++;//计数+1,与k+=1相同                                          //==比较的是地址,可能不相同,equals()比较的是值,此处只能用equals(),否则排重出错。
                        };
                        if (viewhang.getText().toString().equals(view.getText().toString()) && k == 2) {//如果值(1,2,3..)相同并且计数等于2(重复)则背景改为红色
                            biaozhi=true;//如果填写重复数字(两个数字相同)的标志
                            //弹窗
                            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                            builder.setTitle("二货!");
                            builder.setMessage("行内输入重复!!!");
                            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {//点击确定后操作
                                    //view1.setBackgroundColor(Color.GRAY);
                                    view.setBackgroundColor(Color.GRAY);//颜色改为灰
                                    view.setText("");//清空输入的重复值

                                }
                            });
                            AlertDialog dialog = builder.create();
                            dialog.show();
                            break;
复制代码
if (viewhang.getText().toString().equals(view.getText().toString())) {(
    k++;
};

上面代码,有相同计数加1。后面:

复制代码
if (viewhang.getText().toString().equals(view.getText().toString()) && k == 2) {}

如果"行内"某个格子与点击的格子的text相同,并且值为2,则为重复。(个人感觉不用这么麻烦,但现在懒得想,懒得改,反正正常能跑。

弹窗不说了,正常的警告窗口,上个图吧。

三、显示复制数字。这个跟显示区功能相同,填写完成后也需要显示所有相同数字。

四、保存当前题目完成度。其实每填写一个数字都会保存,防止玩半截退出再打开的时候进度不一样。save()函数。

代码:

java 复制代码
public void save() {
        File file = new File(getFilesDir(), "1000.txt");
        try (PrintWriter out = new PrintWriter(new FileWriter(file))) {

            for (TextView textView : textViews) {
                String strings = textView.getText().toString();
                out.print(strings);
                out.print(",");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

(关于文件保存读取看之前的博客)

文件路径:/data/data/包名/files/1000.txt

这里面要讲的是保存的文件格式。以","为分隔的字符串。看图:

这就是81个格子的信息,读写都按这个格式。

保存到文件的地方app还插多,反正方式都一样,调用函数就行了。

五、完成所有数字填写后弹窗。

代码:

java 复制代码
if(i==0&&biaozhi==false){
                                AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
                                builder1.setTitle("恭喜完成!");
                                builder1.setMessage("今年发大财!!!");
                                builder1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {//点击确定后操作

                                    }
                                });
                                AlertDialog dialog = builder1.create();
                                dialog.show();
                            }

这里面用到了两个判定标准,1、所有格子都填完了;2、没有出错。如果出错不保存,如果出错了也保存了,还退出了,再打开 的时候显示的就是错的。只有两个条件都成立才保存。

这部分也就这样了,app的关键功能都完成了,下一篇是其他几个功能按键,可能的话一起说完。

相关推荐
xiaobai12 37 分钟前
植物大战僵尸辅助【控制台版本】
windows·安全·游戏
sheng12345678rui2 小时前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
努力d小白4 小时前
leetcode45.跳跃游戏II
游戏
lover_putter5 小时前
非vip版opengl
开发语言·c++·算法·游戏·ai
清风夜半6 小时前
把鸽鸽放到地图上唱跳rap篮球需要几步?
前端·游戏·three.js
向宇it17 小时前
【从零开始入门unity游戏开发之——C#篇13】命名规范——驼峰命名法和帕斯卡命名法,函数(方法)的使用介绍
java·开发语言·游戏·unity·c#·游戏引擎
向宇it1 天前
【从零开始入门unity游戏开发之——C#篇05】转义字符、@处理多行文本或者不使用转义字符、随机数
开发语言·vscode·游戏·unity·c#·游戏引擎
宇宙第一小趴菜1 天前
分享两个爬虫练习网站+一个python游戏网站
游戏
半夏知半秋1 天前
unity中获取游戏物体和组件的方式
笔记·学习·游戏·unity·c#·游戏引擎