PH的五子棋

来源:互联网 发布:姚明赛季数据统计 编辑:程序博客网 时间:2024/05/17 09:40

 从八月六日晚上到现在已经有5天时间了,5天的时间里,我制作了五子棋,学习了数组队列,掌握了包括窗体的制作,布局,画布的绘制,数组队列的定义,使用数组队列进行对象数组的存储,重绘等等等等,写技术博客不仅仅是雄哥交给我的任务,更是一次让我复习,整合,升华的过程;

一.窗体:

         1.定义:想要弹出一个窗体,需要先创建一个窗体,五子棋的界面的类我定义为Fivechess,并将其继承JFrame类以便于在接下来的编写中无需输入javax.swing.包,可以直接使用jframe类中的按钮,输入框等组件。然后FiveChess fc=new FiveChess();定义对象fc用于承载组件。

         2.背景图片的设置:ImageIcon image=new ImageIcon("。。。。")

用于创建一个组建 承载图片,“”中为你要设置的背景图片的绝对路径,建议在五子棋的project下新建一个image包用于存放图片,图片格式建议为jpg格式,名称建议为英文,假如名称为wallpaper那么“”中为image/wallpaper.jpg.

        JLabel jl=new JLabel()

        jl.setIcon(image);

        jl.setBounds(0, 0, 800, 700);前两个数字为图片的起始坐标(从窗体的左上角开始),后两个数字为图片的大小

        //创建JFrame的深度面板。获取JFrame的深度 并且将组件添加至最底层

        this.getLayeredPane().add(jl,new Integer(Integer.MIN_VALUE))

        //获取到窗体的内容面板 

        Container panel=this.getContentPane();

        //将内容面板转化为JPanel类型并且设置透明

        ((JPanel)panel).setOpaque(false);

这样就可以将窗体的背景设为自定义的图片并且可以在图片上绘制其他内容

       3.窗体的其他设置:this.setSize(800, 700);用来设置窗体大小

        this.setDefaultCloseOperation(3);设置窗体关闭后程序停止,否则,程序会一直在后台运行

        this.setResizable(false);设置窗体不可调节·大小

        this.setVisible(true); 设置窗体可见(必须设置,否则,窗体不会被显示)

二.按钮:

               this.setLayout(null);设置按钮为可以自由设置按钮大小,位置,我比较喜欢这种方式,不受流体布局之类的控制,虽然比较麻烦。。。。

                 JButton jbt=new JButton("***");设置按钮名称,“”内为按钮上的字

        jbt.setBounds(690, 450, 80, 60);//设置按钮位置,大小,前两个为按钮坐标,,后两个为按钮大小

        jbt.setBackground((new Color(50,90,120)));//设置按钮的背景颜色,如果想要设置成单一的红色等系统中本身存在的颜色,只需要将()中改为Color.red即可。

        jbt.setForeground((new Color(100,200,120)))   //设置按钮上的字的颜色

        jbt.addActionListener(bot);//在按钮上添加动作监听器,bot为自定义的监听器名称

        this.add(jbt);//将按钮添加到窗体上,否则,按钮不会显示

 三,画布   

        窗体上只能添加按钮,输入框等组件,如果想要在窗体上绘制线条之类的需要添加画布

Graphics g = this.getGraphics();//获得窗体上的画布,获取窗体上的画布需要在设置窗体可见之后

g.setColor(new Color(*,*,*);用于设置画布中画笔的颜色

G.filloval(*,*,*,*)用于画实心圆,前两个数为圆的外切正方形的左上点的坐标,后两个数为正方形的高和宽

g.drawLine***,)用于画直线,前两个数为其实坐标,后两个数为终点坐标

四 窗体的重绘

   窗体类中存在 paint(Graphics g)函数,在窗体大小发生变化时系统自动调用该函数,如果想要将你自己添加的按钮,画布等组件也显示出来,则需要对该函数进行重写

   public void paint(Graphics g){

     super.paint(g);//这个语句不可缺少,为原paint函数中的语句,重写时不可缺少     

        。。。。。。。

}。。。。中为你需要重绘时出现的图案的语句 

注意,paint函数只能被定义,无法被调用,如果想要自己调用重绘,可以调用frame.repaint()函数(frame为自定义的当前窗体的名称)

五.监听器:

            监听器其实是一个接口,所以他需要对他继承的类中的所有函数进行重写,我们希望的它在我们执行某个动作时的反应就是在重写过程中添加至对应函数中的,它的继承为implents,有键盘监听器,鼠标监听器,动作监听器等等,五子棋中需要用到的有动作监听器和鼠标监听器,实际使用中虽然有多个不同的动作需要监听,但是为了方便高效,我们使用只使用一个监听器对象,通过多重继承的方式完成多个动作,具体使用时为public class BottonLister implements MouseListener,ActionListener{

       1.监听器的声明,使用

             定义好的监听器是一个类不能直接调用,需要先创建其对象,再将其添加到组件中,具体如下: BottonLister bot=new BottonLister();jbt1.addActionListener(bot);,

        2.动作监听器 

           动作监听器主要对应的是按钮被点击后的反应,所以它主要被添加至按钮中,它中只有一个函数public void actionPerformed(ActionEvent e) { ,在使用时首先对其进行重写,它主要是通过if(e.getActionCommand().equals("。。。")){   来判断是否为点击的按钮的(。。。为点击的按钮的名称),getActionCommand()函数用于获得动作的对象的名称。

      3.鼠标监听器

              鼠标监听器对应鼠标发生的改变,他有多个函数 

              public void mouseClicked(MouseEvent e) {//点击的时候监听

              }public void mousePressed(MouseEvent e) {//按下的时候监听

               public void mouseReleased(MouseEvent e){//释放的时候监听

              public void mouseEntered(MouseEvent e) {

          }public void mouseExited(MouseEvent e) {  //不知道干嘛的

          在该程序中,为了防止出现鼠标被拖拽之后再释放的情况,我们使用  public void mouseReleased(MouseEvent e)函数进行监听,int x = e.getX();/int y = e.getY(); 来获得释放时的鼠标位置,然后在函数中添加各种功能。

六.音乐的加入

             首先AudioClip audio4;(如果需要该音乐在整个类中都可以使用,则将其定义为全局变量,否则,定义为函数体内的局部变量即可

            java.net.URL url4 = null;

      URI uri4;

            try {      

 File f4 = new File("music/regret.wav"); //引号里面的是音乐文件所在的绝对路径,建议使用wav格式的音乐并在project下建立music资源包,将音乐名称定义为英文后放入

 uri4 =f4.toURI();

 url4 = uri4.toURL(); 

 } catch (Exception f) {  

 f.printStackTrace();

 }

使用时,audio.play();即可播放,audio.stop();为停止

七.对象数组的定义及使用 

        将对象数组定义为一个类,如果我要在数组中存储的对象所在的类为Shapes,那么在数组类中定义数组为public Shapes[] array;  ,并且将在类中写的关于数组中对象的增删,返回数组长度,返回指定位置的对象的函数中关于数组元素的属性都设为Shapes,然后在监听器中创对象数组的对象 Array array=new Array();,并通过array对象来调用数组中的函数

八.主要算法

           定义Shapes类用于存放棋子的位置,颜色,定义flag用于判断棋子黑白并初始化为1设为黑棋现走,定义数组chessstatue[x][y]用于存放x,y位置棋子的信息并将该数组初始化为0设为x,y位置没有棋子,程序开始时,首先对点击的位置的 x,y进行取整操作使其能够落在格子交叉处,然后如果该点的chessstatue[x][y]0,则可以落点,如果此时flag1,则落黑子并flag++,使下一子的flag2落白子 ,并把flag赋值给chessstatue[x][y]保存改点的颜色信息,如果该点flag2则落白子,flag--其他与黑子相同。判断胜负时需要设四个方向的count并初始化为1,  水平方向:分别求得该点向右和向左的连续同颜色子的数目并加入count,如果等于5则分颜色提示胜利,其他竖直,左斜,右斜同上。然后把对象加入对象数组中,重绘时,调用对象数组中的对象信息进行重绘,悔棋时使用对象数组中的删除函数删除最后一个对象再进行重绘

九 总结

       这是我第一个完成的完整的作品,希望我能在java这条路上越走越远,在蓝杰的生活每天都快乐,鉴于本人刚刚接触java,文章中必然存在各种错误,望各位大神包涵并提出建议,谢谢!

0 0