首页 > 其他分享 >五子棋v2.0

五子棋v2.0

时间:2024-12-03 11:32:24浏览次数:10  
标签:int 五子棋 v2.0 final gf static public SIZE

在基本绘制出五子棋之后,我们发现,拖动窗体之后,五子棋会消失,并且可以在同一位置下多个棋子,今天就来解决以下问题:

1.重绘功能

2.怎么判断某一个位置上有没有棋子

方法:

  • 1.使用二维数组,将表格上的棋子转换为数组中的数据进行判定,运用chessType,为0时可以落子,为1,2时都不能落子
  • 2.运用该二维数组中的0,1,2数据,进行棋子的重新绘制,实现重绘功能
public class GoBangUI{
    GoListener gl=new GoListener();
    public void showUI(){
        GoFrame gf=new GoFrame();
        gf.setTitle("五子棋v1.0");
        gf.setSize(850,900);
        gf.setLocation(500,100);
        gf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gf.setVisible(true);
        gf.addMouseListener(gl);
        gl.g=gf.getGraphics;
    }
    public static void main(String[]args){
        GoBangUI goBangUI=new GoBangUI();
        goBangUI.showUI();
    }
}
public class GoFrame extends JFrame{
    public void paint(Graphics g){//重写Paint方法
        super.paint(g);

        //绘制棋盘
        GoUtils.drawChessPad(g);
        GoUtils.drawAllChess(g);
    }
}
public class GoUtils{
    static final int X=50;
    static final int Y=75;
    static final int ROW=15;
    static final int COL=15;
    static final int SIZE=50;//间距
    static int [][]chessArray=new int[ROW+1][COL+1];
    static int chessType=1;
  //static 静态,程序一开始时就开始执行;final,常量,不可变
    public static void drawChessPad(Graphics g){
        Color color=new Color(194, 188, 126);//设置背景颜色
        g.setColor(color);
        g.fillRect(X-SIZE/2,Y-SIZE/2,(COL+1)*SIZE,(ROW+1)*SIZE);
        g.setColor(Color.BLACK);
        for(int i=0;i<=COL;i++){
            g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+ROW*SIZE);
            g.drawLine(X,Y+i*SIZE,X+COL*SIZE,Y+i*SIZE);
        }
   
    }
    public static void drawAllChess(Graphics g){
        for(int i=0;i<=ROW;i++){
            for(int j=0;j<=COL;j++){
                int n=chessArray[i][j];
                if(n!=0){
                    if(n==1){
                        g.setColor(Color.BLACK);
                    }else{
                        g.setColor(Color.WHITE);
                    }
                    //还原标准坐标
                    int chessX=j*SIZE+X-SIZE/2;
                    int chessY=i*SIZE+Y-SIZE/2;
                    g.fillOval(chessX,chessY,SIZE,SIZE);
                }
            }
        }
    }

}
public class GoListener extends GoUtils implements MouseListener{
    Graphics g;
    //int chessType=1;//1:黑棋,2:白棋,0,不能落子


    @Override
    public void mousePressed(MouseEvent e) {
        int x=e.getX();
        int y=e.getY();
        //换算行列值
        int c=(x-X+SIZE/2)/SIZE;
        int r=(y-Y+SIZE/2)/SIZE;
        //验证落子的范围
        if(c>COL||r>ROW||x<X-SIZE/2||y<Y-SIZE/2){
            JOptionPane.showMessageDialog(null,"请在棋盘内落子");
            return;
        }
        //看在r行c列的数据标识如果不为零,那么在这个地方已经有棋子存在,不能再落子
        if(chessArray[r][c]!=0){
            JOptionPane.showMessageDialog(null,"不能重复落子");
        }
        //chessArray是与棋盘同等规格大小的整数数组,16*16,所有元素初始默认值都为0,将0看成空位,将1看成黑棋,2看成白棋
        //r.c为行列值,取值范围是0-15,正好与数组的下标吻合,我们可以直接以r,c为数组的下标存储当前棋子所对应的数字标识
        chessArray[r][c]=chessType;//用0,1,2表示棋子
        for (int i = 0; i <=ROW; i++) {//打印出数组
            for (int j = 0; j <=COL; j++) {
                System.out.print(chessArray[i][j]+" ");

            }
            System.out.println();
        }

         //交替落子
        if (chessType == 1) {
            g.setColor(Color.BLACK);
            chessType = 2;

        } else if (chessType == 2) {
            g.setColor(Color.WHITE);
            chessType = 1;
        }
        //还原标准坐标
        int chessX=c*SIZE+X-SIZE/2;
        int chessY=r*SIZE+Y-SIZE/2;
        g.fillOval(chessX,chessY,SIZE,SIZE);

    }

   

    @Override
    public void mouseClicked(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}

}

标签:int,五子棋,v2.0,final,gf,static,public,SIZE
From: https://blog.csdn.net/lxyfight/article/details/144187474

相关文章

  • 【老白学 Java】Warship v2.0(七)
    Warshipv2.0(七)文章来源:《HeadFirstJava》修炼感悟。上一篇文章中,Warshipv2.0项目最后一个类的完成,意味着整个项目也即将结束。本篇文章的主要内容是编译、调试所有代码,以及进行代码整理。如果有精力的同学可以在项目完工后,继续升级v3.0,实现中文版、菜单选项、提......
  • 【老白学 Java】Warship v2.0(一)
    Warshipv2.0(一)文章来源:《HeadFirstJava》修炼感悟。上一篇,简版的「Warship」项目终于完工。从本章开始,老白准备在简版基础上进行升级改造,逐步打造出「Warshipv2.0」。开篇前,老白先介绍一下「数组列表」对象,它是这个项目不可缺少的重要工具。如果师兄们感兴趣,可以......
  • Java基于微信小程序的校园跑腿平台(V2.0)
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • PPTAutoPlay V2.0--制作具有自动语音朗读功能的PPT
    前言:前些年,单位每年年终总结,各科室都要PPT汇报,时限5分钟。如果时间太短,显得不够认真,时间太长,又对他人不尊重,所以制作了这个能生成自动进行语音朗读的PPT的软件,一方面,自己可以预览一下演讲的效果,最主要的是可获取ppt演讲的时长。2023-9-9今日新闻:PowerPoint发明者丹尼斯·奥斯汀......
  • 米扬约课健身管理系统小程序V2.0.2
    米扬约课健身管理系统,应用于健身房,健身工作室,运动会所,运动场馆,瑜伽馆,拳馆等泛健身行业的场馆中。米扬约课健身致力于为各种健身场馆打造真正有效的营销系统,简洁易用的客户信息管理系统,适合多门店、多角色、多场景的服务系统,紧跟健身行业的进步与升级,为广大客户提供优质的服务。V2.0......
  • 类设计方法:以五子棋为例
    概述本篇将讨论一下如何进行面向对象编程(OOP),并将其分为了提取对象、描述对象行为、定义字段和方法、设计函数句柄等多个步骤。什么是面向对象(OOP)?面向过程编程(POP)基本思想:将程序视为一系列的操作步骤,重点在于如何解决问题,按顺序执行这些操作。结构:程序由函数(或过程)和数据......
  • Blazor开发框架Known-V2.0.10
    Known今天迎来了2.0的第11个版本,同时网站网址和板块也进行了一次升级改造,虽不完美,但一直在努力改变,之前一直在完善框架功能,忽略了文档的重要性,所以这次更新了文档和API。交流互动板块也在进行当中,尽请期待。官方网站:http://known.org.cn最新版本:V2.0.10下面是本次版本的更新......
  • CMS内容管理系统V2.0.9
    CMS内容管理系统,自定义内容模型、自定义单页、自定义表单、专题、统计报表、会员发布等,提供全部前后台无加密源代码和数据库私有化部署,UniAPP版本提供全部无加密UniAPP源码V2.0.9新增内容管理栏目联动功能修复api写入数据报错的问题修复展开折叠失效的BUG修复定时发布判断模式为后......
  • 8---阶段项目:五子棋(附带源码)
    8阶段项目:五子棋8.1-技术实现1.静态变量静态变量只能定义在类中,不能定义在方法中。静态变量可以在static修饰的方法中使用,也可以在非静态的方法中访问。主要解决在静态方法中不能访问非静态的变量。2.静态方法静态方法就相当于一个箱子,只是这个箱子中装的是代码,需要使用......
  • 五子棋AI 任务1:实现棋盘类
    绪论本篇将引导读者如何构建一个五子棋棋盘类,并且在结尾给出了已经写好关键接口的类定义,使得读者将注意力聚焦在功能的实现上。下载代码文件任务要求详解对于需要填写的部分,用#define语句定义宏进行了替代,以保证通过编译,在编写代码时删掉即可。#defineQUEST_BOOLtrue#d......