预览效果


对角棋


游戏简介:双方执不同颜色棋子,每人3颗棋子,只要将自己的三个棋子走成一条线,并且这条直线是对角直线,对方就算输了。

完整代码部分

package demo01;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class AnglesChess003 extends JFrame implements KeyListener, ActionListener, MouseListener {
    //    定义一个内部类用来创建坐标
    class Point{
        public int x;
        public int y;
        public Point (int x,int y){
            this.x=x;
            this.y=y;
        }
    }

    //    行数(高)
    int height=3;
    //    列数(宽)
    int width=3;
    //    格子的大小
    int size=150;
    //    标题栏的高度
    int title=100;

//    创建一个棋盘  0表示空 1表示黑子 2表示白子
    int[][]qipan ={{1,1,1},{0,0,0},{2,2,2}};

    //    设置游戏状态 1表示等待黑方落子 2表示等待白方落子 3表示黑子胜 4表示白字胜
    int zhuangtai =1;

//    定义一个点 记录选中的位置  初始值设置为-1-1,表示无效值(为选中)
//    记录最后一次鼠标点击的位置
    int x=-1;
    int y=-1;

//    选中时棋子大小改变的范围值
    int size_qizi_max=105;
    int size_qizi_min=100;
    int size_qizi_cur=100;
//    定义棋子动画的状态 0表示动画停止 1表示棋子变小 2表示棋子变大
    int zhuangtai_qizi=0;

//    棋子移动动画
    int zhuangtai_moue=0;
    Point point1=new Point(-1,-1);
    Point point2=new Point(-1,-1);
    int moue_jingdu=0;

    Point point_cur=new Point(-1,-1);


    //    设置图片
    private Image image=null;
    Graphics gf=null;


    //    设置计时器
    Timer timer=new Timer(30,this);
    public void Tian(){

        //设置窗口的宽高
        this.setSize(width*size ,height*size+title);
//        设置标题
        this.setTitle("对角棋");
        //设置窗口能看见
        this.setVisible(true);
//        设置窗口顶点坐标的位置
        this.setLocation(100,100);
        //设置鼠标监听事件(也就是当鼠标有什么反应都会调用此函数)
        this.addMouseListener(this);



    }

    public void paint(Graphics g){
        image=this.createImage(width*size,height*size+title);
        this.gf =image.getGraphics();

        //        擦除背景
        gf.setColor(Color.gray);
        gf.fill3DRect(0,0,width*size,title+height*size,true);

//        绘制背景
        gf.setColor(Color.orange);
        gf.fill3DRect(0,title+0,width*size,title+height*size,true);


        //        绘制提示信息

        gf.setFont(new Font("华文新魏", 10, 35)); //设置字体
        if(zhuangtai==1){
            gf.setColor(Color.black);
//            提示黑方移子
            gf.drawString("黑方移子",width*size/2-(35*2),title-17);
        }else if(zhuangtai==2){
            gf.setColor(Color.white);
//            提示白方移子
            gf.drawString("白方移子",width*size/2-(35*2),title-17);
        }else if(zhuangtai==3){
            gf.setColor(Color.black);
//            黑方获胜
            gf.drawString("黑方棋赢",width*size/2-(35*2),title-17);
        }else if(zhuangtai==4){
            gf.setColor(Color.white);
//            白方获胜
            gf.drawString("白方棋赢",width*size/2-(35*2),title-17);
        }



//        绘制棋盘线
        gf.setColor(new Color(109, 65, 46, 176));
        int x1=0+size/2;
        int y1=title+size/2;
        gf.drawRect(x1,y1,2*size,2*size);
        gf.drawLine(x1,y1+size,2*size+x1,y1+size);
        gf.drawLine(x1+size,y1,x1+size,y1+2*size);
        gf.drawLine(x1,y1,x1+2*size,y1+2*size);
        gf.drawLine(x1,y1+2*size,x1+2*size,y1);




//        绘制棋子
//        设置棋子的宽度
        int size_qizi=100;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if(qipan[i][j]==1){
//                    当前选中的棋子
//                    移动效果
                    if(zhuangtai_moue==1&&i==point2.y&&j==point2.x){
                        gf.setColor(Color.black);
                        double x=point1.x+((double)point2.x-point1.x)/100*moue_jingdu;
                        double y=point1.y+((double)point2.y-point1.y)/100*moue_jingdu;
                        gf.fillOval((int)(x*size+(size-size_qizi)/2),(int)(y*size+title+(size-size_qizi)/2),size_qizi,size_qizi);
                    } else if (y==i&&x==j){//选中效果
                        gf.setColor(Color.black);
                        gf.fillOval(j*size+(size-size_qizi_cur)/2,i*size+title+(size-size_qizi_cur)/2,size_qizi_cur,size_qizi_cur);
                    }else{
                        gf.setColor(Color.black);
                        gf.fillOval(j*size+(size-size_qizi)/2,i*size+title+(size-size_qizi)/2,size_qizi,size_qizi);
                    }

                }
                if(qipan[i][j]==2){
                    //                    当前选中的棋子
                    //                    移动效果
                    if(zhuangtai_moue==1&&i==point2.y&&j==point2.x){
                        gf.setColor(Color.white);
                        double x=point1.x+((double)point2.x-point1.x)/100*moue_jingdu;
                        double y=point1.y+((double)point2.y-point1.y)/100*moue_jingdu;
                        gf.fillOval((int)(x*size+(size-size_qizi)/2),(int)(y*size+title+(size-size_qizi)/2),size_qizi,size_qizi);
                    } else if(y==i&&x==j){
                        gf.setColor(Color.white);
                        gf.fillOval(j*size+(size-size_qizi_cur)/2,i*size+title+(size-size_qizi_cur)/2,size_qizi_cur,size_qizi_cur);
                    }else{
                        gf.setColor(Color.white);
                        gf.fillOval(j*size+(size-size_qizi)/2,i*size+title+(size-size_qizi)/2,size_qizi,size_qizi);
                    }

                }
            }
        }
//        绘制选中棋子
        int size_tishi=20;
        if(x!=-1&&y!=-1){
//            gf.setColor(Color.green);
//            gf.fillOval(x*size+size/4,y*size+size/4+title,size/2,size/2);
            Point points[]=getMove(new Point(x,y));
            if(qipan[y][x]==1){
                gf.setColor(new Color(0,0,0, 129));
            }else if(qipan[y][x]==2){
                gf.setColor(new Color(245, 241, 241, 186));
            }

            for (int i = 0; i <points.length ; i++) {
                if(qipan[points[i].y][points[i].x]==0){
//                    gf.setColor(new Color(213, 119, 194, 136));
                  gf.fillOval(points[i].x*size+(size-size_tishi)/2,points[i].y*size+title+(size-size_tishi)/2,size_tishi,size_tishi);
                }
            }
        }


        g.drawImage(image,0,0,null);
    }
    public void actionPerformed(ActionEvent e) {
        if(zhuangtai_qizi==1){
            size_qizi_cur-=2;
            if(size_qizi_cur<size_qizi_min){
                zhuangtai_qizi=2;
            }
        }else if (zhuangtai_qizi==2){
            size_qizi_cur++;
            if (size_qizi_cur>size_qizi_max){
                zhuangtai_qizi=1;
            }
        }

        if (zhuangtai_moue==1){
            moue_jingdu+=10;
            if (moue_jingdu>100){
                zhuangtai_moue=0;
            }
        }

        repaint();
    }
    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {

    }
    public void keyReleased(KeyEvent e) {
    }
//    鼠标店家事件
    public void mouseClicked(MouseEvent e) {
    }
    //    鼠标按压事件
    public void mousePressed(MouseEvent e) {
        //        处理鼠标左键
        if(e.getButton()==e.BUTTON1){
//            鼠标点击的真实坐标
            int realx=e.getX();
            int realy=e.getY();

            int gezix=-1;
            int geziy=-1;

//            将真是坐标转换为格子坐标
            if(realx<0 ||realx>width*size||realy<title||realy>height*size+title){
                x=-1;
                y=-1;
                //                    停止定时器
//                关闭计时器后恢复棋子的大小
                size_qizi_cur=size_qizi_max;
//                棋子的动画状态设置为0
                zhuangtai_qizi=0;
                System.out.println("你点在棋盘外面了");
            }else{//说明这个点在棋盘里
                gezix=realx/size;
                geziy=(realy-title)/size;
//                第二步移动棋子
                if(x!=-1&&y!=-1){
                    if(qipan[geziy][gezix]==0){
                        Point [] points=getMove(new Point(x,y));
                        for (int i = 0; i < points.length; i++) {
                            if(points[i].x==gezix&&points[i].y==geziy){
//                            移动棋子
                                point1.x=x;
                                point1.y=y;
                                point2.x=gezix;
                                point2.y=geziy;
                                point_cur.x=x;
                                point_cur.y=y;
                                moue_jingdu=0;
                                zhuangtai_moue=1;
                                timer.start();
                                qipan[geziy][gezix]=qipan[y][x];
                                qipan[y][x]=0;
                                x=-1;
                                y=-1;
//                            改变游戏状态
                                if (zhuangtai==1){
                                    zhuangtai=2;

                                }else if (zhuangtai==2){
                                    zhuangtai=1;
                                }

//                            判断胜负
                                if(shenfu()==1){
                                    zhuangtai=3;
//                                    System.out.println("黑子胜");
                                }else if(shenfu()==2){
                                    zhuangtai=4;
//                                    System.out.println("白子胜");

                                }

                                break;
                            }
                    }
                    }


                    当前选中的格子为空格
//                    if(qipan[geziy][gezix]==0){
                        当前选中的格子为空格且在之前选中的格子的附近
//                        if((gezix+1==x||gezix-1==x||gezix==x)&&(geziy==y||geziy+1==y||geziy-1==y)){

//                        }
//                    }
                }


                //第一步选中棋子
                if(qipan[geziy][gezix]==zhuangtai){
                    x=gezix;
                    y=geziy;
                    zhuangtai_qizi=1;
                    timer.start();
                }else{
                    x=-1;
                    y=-1;

                    //                关闭计时器后恢复棋子的大小
                    size_qizi_cur=size_qizi_max;
//                棋子的动画状态设置为0
                    zhuangtai_qizi=0;
                }


                System.out.println("你点了"+x+y);

            }
        }
        repaint();
    }
    public void mouseReleased(MouseEvent e) {
    }
    public void mouseEntered(MouseEvent e) {
    }
    public void mouseExited(MouseEvent e) {
    }

//    得到所有可以移动的格子
    public Point[] getMove(Point point){
        if(point.y==0){
            if(point.x==0){
                return new Point[]{new Point(1,0),new Point(1,1),new Point(0,1)};
            }else if(point.x==1){
                return new Point[]{new Point(0,0),new Point(1,1),new Point(2,0)};
            }else if(point.x==2){
                return new Point[]{new Point(1,0),new Point(1,1),new Point(2,1)};
            }

        }else  if(point.y==1){
            if(point.x==0){
                return new Point[]{new Point(0,0),new Point(1,1),new Point(0,2)};
            }else if(point.x==1){
                return new Point[]{new Point(0,0),new Point(1,0),new Point(2,0),new Point(0,1),new Point(2,1),new Point(0,2),new Point(1,2),new Point(2,2)};
            }else if(point.x==2){
                return new Point[]{new Point(2,0),new Point(1,1),new Point(2,2)};
            }
        }else if(point.y==2){
            if(point.x==0){
                return new Point[]{new Point(0,1),new Point(1,1),new Point(1,2)};
            }else if(point.x==1){
                return new Point[]{new Point(0,2),new Point(1,1),new Point(2,2)};

            }else if(point.x==2){
                return new Point[]{new Point(1,2),new Point(1,1),new Point(2,1)};
            }
        }
        return new  Point[0];

    }

    public int shenfu(){
//        0表示平手  1表示黑棋胜 2表示白棋胜
//        判断黑棋是否胜利
        if(qipan[0][0]==1&&qipan[1][1]==1&&qipan[2][2]==1){
            return 1;
        }else if(qipan[0][2]==1&&qipan[1][1]==1&&qipan[2][0]==1){
            return 1;
        }
//        判断白棋是否胜利
        if(qipan[0][0]==2&&qipan[1][1]==2&&qipan[2][2]==2){
            return 2;
        }else if(qipan[0][2]==2&&qipan[1][1]==2&&qipan[2][0]==2){
            return 2;
        }

        return 0;
    }

    public static void main(String[] args) {
        AnglesChess003 anglesChess=new AnglesChess003();
        anglesChess.Tian();
    }
}