Java版本实现五子棋小游戏

效果预览图

视频预览

五子棋

代码部分

package demo01;

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

public class Gobang003 extends JFrame implements KeyListener, ActionListener, MouseListener {
    //设置宽为800,高为1000
    int width=800;
    int height=950;
//    格子的大小
    int size=50;
//    棋盘
    int qipan[]=new int[256];

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

//    认输按钮的坐标
    int x_renshu = 550;
    int y_renshu = 60;
    int width_renshu = 150;
    int height_renshu = 70;

//    悔棋按钮的坐标
    int x_huiqi = 100;
    int y_huiqi = 60;
    int width_huiqi = 150;
    int height_huiqi = 70;

    //    开始按钮的坐标
    int x_kaishi = 100;
    int y_kaishi = 60;
    int width_kaishi = 150;
    int height_kaishi = 70;

//记录下棋的步骤
    int []buzhou=new int[256];
    int buzhoulength=0;



    public void Tian(){
        for(int e:qipan) {
            System.out.println(e+",");
        }

        //设置宽为800,高为1000
        this.setSize(width,height);
        //设置窗口能看见
        this.setVisible(true);
        //设置键盘监听事件(也就是当键盘有什么反应都会调用此函数)
        this.addKeyListener(this);
        //设置鼠标监听事件(也就是当鼠标有什么反应都会调用此函数)
        this.addMouseListener(this);
    }

    public void paint(Graphics g){
//        绘制棋盘网格
        g.setColor(Color.orange);
        g.fill3DRect(0,0,width,height,true);
//        网格颜色
        g.setColor(Color.darkGray);
        //        画竖线
        for (int j = 0; j <=width ; j+=size) {
            g.drawLine(j,0,j,height);
        }
//          画横线
        for (int i = 0; i <=height ; i+=size) {
            g.drawLine(0,i,width,i);
        }

        g.setColor(Color.GRAY);
        g.fill3DRect(0,0, width,height-800,true);


//        g.setColor(Color.black);
//        g.fillOval(1*size,(height-800)+1*size,size,size);
//        g.setColor(Color.white);
//        g.fillOval(3*size,(height-800)+1*size,size,size);
//                绘制棋子
        for (int y = 0; y < 16; y++) {
            for (int x = 0; x < 16; x++) {
                if(qipan[y*16+x]==1){// 绘制黑子
                    g.setColor(Color.black);
                    g.fillOval(x*size,(height-800)+y*size,size,size);
                }else if(qipan[y*16+x]==2){//绘制白字
                    g.setColor(Color.white);
                    g.fillOval(x*size,(height-800)+y*size,size,size);
                }
            }
        }


//        绘制提示信息

        g.setFont(new Font("华文新魏", 10, 35)); //设置字体
        if(zhuangtai==1){
            g.setColor(Color.black);
//            提示黑方落子
           g.drawString("黑方请落子",315,100);
        }else if(zhuangtai==2){
            g.setColor(Color.white);
//            提示白方落子
            g.drawString("白方请落子",315,100);
        }else if(zhuangtai==3){
            g.setColor(Color.black);
//            黑方获胜
            g.drawString("黑方棋子赢",315,100);
        }else if(zhuangtai==4){
            g.setColor(Color.white);
//            白方获胜
            g.drawString("白方棋子赢",315,100);
        }

        if(zhuangtai==1||zhuangtai==2){
            g.setColor(Color.darkGray);
            g.fill3DRect(x_huiqi,y_huiqi,width_huiqi,height_huiqi,true);
            g.setFont(new Font("华文新魏", 10, 55)); //设置字体
            g.setColor(Color.white);
            g.drawString("悔棋",x_huiqi+20,y_huiqi+50);

            g.setColor(Color.darkGray);
            g.fill3DRect(x_renshu,y_renshu,width_renshu,height_renshu,true);
            g.setFont(new Font("华文新魏", 10, 55)); //设置字体
            g.setColor(Color.white);
            g.drawString("认输",x_renshu+20,y_renshu+50);
        }else if (zhuangtai==3||zhuangtai==4){
            g.setColor(Color.darkGray);
            g.fill3DRect(x_kaishi,y_kaishi,width_kaishi,height_kaishi,true);
            g.setFont(new Font("华文新魏", 10, 55)); //设置字体
            g.setColor(Color.white);
            g.drawString("开始",x_kaishi+20,y_kaishi+50);
        }

    }


    public void actionPerformed(ActionEvent e) {

    }
    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){
//            鼠标点击的像素坐标
//            鼠标点击的x坐标位置
            int x=e.getX();
//            鼠标点击的y坐标位置
            int y=e.getY();

//            鼠标点击格子数坐标


        //    System.out.println(fanggex+","+fanggey);
        //    System.out.println(x+","+y);
//            判断鼠标是否点击在棋盘内
          //  if(fanggex>=0&&fanggex<16&&fanggey>=0&&fanggey<16){
              if(x>=0&&x<=width&&y>=150&&y<height){

                int fanggex=x/size;
                int fanggey=(y-150)/50;
//                判断棋盘上是否是空位子,空位子才允许落子
                if(qipan[fanggey*16+fanggex]==0){

//                    游戏状态为等待黑方落子
                    if(zhuangtai ==1){
//                        黑方落子
                        qipan[fanggey*16+fanggex]=1;

                        buzhou[buzhoulength]=fanggey*16+fanggex;
                        buzhoulength++;
//                        扫描棋盘,判断黑方是否有五子相连
                        if (panduanshuying()==1) {
//                            游戏状态改为黑方胜
                            zhuangtai = 3;
                        }else {
                            // 游戏状态改为等待白方落子
                            zhuangtai =2;
                        }

//                    强制重绘窗口
                        repaint();


//                        游戏状态为等待白方落子
                    }else if(zhuangtai ==2){
//                        白方落子
                        qipan[fanggey*16+fanggex]=2;
                        //记录落子
                        buzhou[buzhoulength]=fanggey*16+fanggex;
                        buzhoulength++;
//                        扫描棋盘,判断白方是否有五子相连 2为白棋胜
                        if (panduanshuying()==2){
//                            游戏状态设置为白棋胜
                            zhuangtai=4;
                        }else {
                            // 游戏状态改为等待黑方落子
                            zhuangtai =1;
                        }

//                    强制重绘窗口
                        repaint();
                    }
                }

            }


//            处理点击认输
            if(x_renshu<x&&(x_renshu+width_renshu)>x&&y_renshu<y&&(y_renshu+height_renshu)>y){
//                如果状态是黑子请落子,此时点击了认输,那么状态改为白方胜
                if(zhuangtai==1){
                    zhuangtai=4;
                }else if(zhuangtai==2){
                    zhuangtai=3;
                }
                repaint();
            }

//            处理点击开始
            if(x_kaishi<x&&(x_kaishi+width_kaishi)>x&&y_kaishi<y&&(y_kaishi+height_kaishi)>y){
//                如果状态是黑子请落子,此时点击了认输,那么状态改为白方胜
                if(zhuangtai==3||zhuangtai==4){
                    zhuangtai=1;
                    buzhoulength = 0;
                    for (int i = 0; i < qipan.length; i++) {
                        qipan[i]=0;
                    }
                }
                repaint();
            }

//            处理点击悔棋
            if(x_huiqi<x&&(x_huiqi+width_huiqi)>x&&y_huiqi<y&&(y_huiqi+height_huiqi)>y){
//                如果状态是黑子请落子,此时点击了认输,那么状态改为白方胜

                if(buzhoulength>0){
                    qipan[buzhou[buzhoulength-1]]=0;
                    buzhoulength--;
                    if(zhuangtai==1){
                        zhuangtai=2;
                    }else if(zhuangtai==2){
                        zhuangtai=1;
                    }
                }
                repaint();
            }


        }
    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }
//    0表示平手 1表示黑子胜 2表示白字胜
    public int panduanshuying(){
        int black=0;
        int white=0;
        //水平方向检测是否有连续的5个棋子
        for (int y = 0; y < 16; y++) {
            // 每一行开头,棋子连子数目设置为0
            black=0;
            white=0;
            for (int x = 0; x < 16; x++) {
                if(qipan[y*16+x]==1){// 绘制黑子
                    black++;
                    white=0;
                    if (black>=5){
                        return 1;
                    }
                }else if(qipan[y*16+x]==2){//绘制白字
                   white++;
                   black=0;
                    if (white>=5){
                        return 2;
                    }
                }else{
                    black=0;
                    white=0;
                }
            }
        }

        //竖直方向检测是否有连续的5个棋子
        black=0;
        white=0;
        for (int x = 0; x < 16; x++) {
            // 每一行开头,棋子连子数目设置为0
            black=0;
            white=0;
            for (int y = 0; y < 16; y++) {
                if(qipan[y*16+x]==1){// 绘制黑子
                    black++;
                    white=0;
                    if (black>=5){
                        return 1;
                    }
                }else if(qipan[y*16+x]==2){//绘制白字
                    white++;
                    black=0;
                    if (white>=5){
                        return 2;
                    }
                }else{
                    black=0;
                    white=0;
                }
            }
        }

//        左下到右上的判断
        for (int i = 0; i <= 15; i++) {
            black=0;
            white=0;
            for(int x=0,y=i;x<=i;x++,y--)
            {
                if(qipan[y*16+x]==1){// 绘制黑子
                    black++;
                    white=0;
                    if (black>=5){
                        return 1;
                    }
                }else if(qipan[y*16+x]==2){//绘制白字
                    white++;
                    black=0;
                    if (white>=5){
                        return 2;
                    }
                }else{
                    black=0;
                    white=0;
                }
            }
            black=0;
            white=0;
            for (int y = 15,x=i; y >= i; y--,x++) {

                    if(qipan[y*16+x]==1){// 绘制黑子
                        black++;
                        white=0;
                        if (black>=5){
                            return 1;
                        }
                    }else if(qipan[y*16+x]==2){//绘制白字
                        white++;
                        black=0;
                        if (white>=5){
                            return 2;
                        }
                    }else{
                        black=0;
                        white=0;
                    }

            }
        }
//        左上到右下的判断
        for (int i = 0; i <=15; i++) {
            black=0;
            white=0;
            for(int y=0,x=15-i;y<=i;y++,x++) {
                if(qipan[y*16+x]==1){// 绘制黑子
                    black++;
                    white=0;
                    if (black>=5){
                        return 1;
                    }
                }else if(qipan[y*16+x]==2){//绘制白字
                    white++;
                    black=0;
                    if (white>=5){
                        return 2;
                    }
                }else{
                    black=0;
                    white=0;
                }
            }
            black=0;
            white=0;
            for (int x=0,y=15-i;x<=i;y++,x++){
                if(qipan[y*16+x]==1){// 绘制黑子
                    black++;
                    white=0;
                    if (black>=5){
                        return 1;
                    }
                }else if(qipan[y*16+x]==2){//绘制白字
                    white++;
                    black=0;
                    if (white>=5){
                        return 2;
                    }
                }else{
                    black=0;
                    white=0;
                }
            }
        }
        return 0;
    }

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值