练习八数码的一些体会

在实现八数码游戏的过程中,遇到了空指针异常的问题,主要由于未实例化数组和直接使用数组调用方法引起。原本尝试通过面向对象设计来解决问题,但因逻辑漏洞和编码习惯不佳,如过多使用while循环和switch语句,导致程序复杂且难以维护。需要改进面向对象的设计思路,并注重降低代码耦合性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一。空指针异常问题
1.在工程中,我定义了几个自定义类的数组,在使用数组前,没有实例化,导致应用数组空指针异常
2.直接使用数组加下标代替引用变量,调用类的方法,而没有将引用变量指向某个对象,也没有实例化,导致变量使用异常
3.原来计划是,在进行空格试探性移动时,将动作保留在Num类中,即保证谁的动作归谁,但是在实现是,出现很多问题,导致很小的程序调试时间很长,最终妥协,使用 了一些面向结构的思想来实现

二。构思程序时,片面的希望能完全是面向对象思想的产物,但是个人能力所累,设计的逻辑有很大漏洞,
本来一个数组就解决的事,却被面向对象所累,好多函数共同作用才实现。

编码习惯也存在很多毛病,switch语句中,case快中没有break;
使用太多while语句,导致多次出现无法跳出循环
变成耦合性太强,不注意降低,编程思路是以功能驱动,导致代码又长又乱,修改很费劲

    ``
    package homework.ai;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/*
 * 八数码入口
 */
public class EightPuzzle implements ActionListener{
   
   
    private static int count=0,x=5,y=5; //统计路径输出时已经输出Grid的个数
    JFrame frame ;
    JPanel jPanel;
    JButton ensureButton;
    JButton resetButton;
    JButton fillButton;
    JTextField[][] jTextFields ;
    private void initFrame(){
        //初始化面板
                frame = new JFrame("八数码");
                Toolkit tool = frame.getToolkit();
                Dimension dimension = tool.getScreenSize();
                frame.setBounds( (((int)dimension.getWidth()-200)/2) , (((int)dimension.getHeight()-200)/2) ,200, 200);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                //创建布局管理器
                GridLayout gridLayout = new GridLayout(4,3);
                //初始化面板
                jPanel = new JPanel(gridLayout);
                frame.add(jPanel);
                //在面板中加入文本框,并将文本框保存在一个二维数组中
                jTextFields = new JTextField[4][3];
                for(int i=0; i<3;i++){
                    for(int j=0; j<3; j++){
                        jTextFields[i][j] = new JTextField();
                        jTextFields[i][j].setFont(new Font("楷体",Font.PLAIN,20));
                        jPanel.add(jTextFields[i][j]);
                    }
                }//for
                ensureButton = new JButton("确定");
                ensureButton.addActionListener(this);
                resetButton = new JButton("重置");
                resetButton.addActionListener(this);
                fillButton = new JButton("填充");
                fillButton.addActionListener(this);
                jPanel.add(ensureButton);
                jPanel.add(resetButton);
                jPanel.add(fillButton);
                    frame.setVisible(true);
    }//initFrame    
    //实现按钮监听
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==ensureButton){
            Num[][] nums = new Num[3][3];   //创建nums数组,放置从屏幕中得到的九个数字
            for(int i=0; i<3;i++){
                for(int j=0; j<3; j++){
                        Pattern pattern = Pattern.compile("[1-8]");     //确定每个位置输入的是数字
                        String str = jTextFields[i][j].getText();
                        Matcher isNum = pattern.matcher(str);
                        if( isNum.matches() ){   
                            nums[i][j] = new Num(i, j, Integer.parseInt(str));  //实例化一个Num对象,存入nums数组中
                        }else{   
                            nums[i][j] = new Num(i, j, 0);
                        }
                }
            }//for
            //创建第一个八数码对象,深度为1,得到的方式为空,数组信息是从屏幕获得
            Grid firstGrid = new
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值