java实现五子棋小游戏

作者:hebedich 时间:2021-12-25 06:58:56 

java实现五子棋小游戏


package Gomoku;

import java.awt.Toolkit;

import javax.swing.JFrame;

public class GomokuFrame extends JFrame
{
 //定义一个操作面板
 OperatorPane op=null;

public GomokuFrame()
 {
   //设置名称
   this.setTitle("五子棋");
   //设置窗口大小
   this.setSize(510,510);
   //设置窗口位置
     //取得电脑屏幕大小
   int computer_width=Toolkit.getDefaultToolkit().getScreenSize().width;
   int computer_height=Toolkit.getDefaultToolkit().getScreenSize().height;
   System.out.println("电脑屏幕的宽度:\n"+computer_width+"\n电脑屏幕的高度:\n"+computer_height);
       //居中
   this.setLocation((computer_width-510)/2, (computer_height-510)/2);    

//实例化幕布
   op=new OperatorPane();
   //导入幕布
   this.add(op);
   //添加鼠标监听
   this.addMouseListener(op);

//设置窗口的显示
   this.setVisible(true);
   //设置窗口的正常关闭
   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

//执行测试
 public static void main(String[] args)
 {
   new GomokuFrame();
 }

}
 

package Gomoku;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageFilter;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class OperatorPane extends JPanel implements MouseListener,Runnable
{
 //定义背景图片对象
 Image imageBackground = null;
 //定义棋盘的格子的行数
 int boardrows=18;
 //定义棋盘的格子的列数
 int boardcols=18;
 //定义棋盘的格子的大小
 int boardsize=20;
 //保存棋子坐标
 int x=0,y=0;
 //保存之前下过的全部棋子坐标
 // 其中数据内容 0: 表示这个点并没有棋子, 1: 表示这个点是黑子, 2:表示这个点是白子
 int allchess[][]=new int [19][19];
 //标记下一步下黑棋还是白棋
 boolean isBlack=true;
 //判断游戏是否能够继续
 boolean canPlay=true;
 //保存显示信息
 String message="黑方先行";
 // 保存最多拥有多少时间(秒)
 int maxTime = 0;
 // 做倒计时的线程类
 Thread t = new Thread(this);
 // 保存黑方与白方的剩余时间
 int blackTime = 0;
 int whiteTime = 0;
 // 保存双方剩余时间的显示信息
 String blackMessage = "无限制";
 String whiteMessage = "无限制";

@SuppressWarnings("deprecation")
 public OperatorPane()
 {

t.start();
   t.suspend();

imageBackground=new ImageIcon("image/background.jpg").getImage();
 }

public void paint(Graphics g)
 {
   //双缓冲技术
   BufferedImage b1=new BufferedImage(495,475,BufferedImage.TYPE_INT_ARGB);
   Graphics g2=b1.createGraphics();

// 画出背景图片
   g2.drawImage(imageBackground, 0, 0,495,475,null);

//画出棋盘线
   Color c=g2.getColor();
   g2.setColor(Color.BLACK);
   for(int i=0;i<=boardrows;i++)
   {
     g2.drawLine(10,50+boardsize*i,10+boardsize*boardrows,50+boardsize*i);
   }
   for(int i=0;i<=boardcols;i++)
   {
     g2.drawLine(10+boardsize*i,50,10+boardsize*i,50+boardsize*boardcols);
   }

//画出三三位置
   g2.fillOval(67, 107, 6, 6);
   g2.fillOval(67, 347, 6, 6);
   g2.fillOval(307, 107, 6, 6);
   g2.fillOval(307, 347, 6, 6);
   //画出附点
   g2.fillOval(67, 227, 6, 6);
   g2.fillOval(307, 227, 6, 6);
   g2.fillOval(187, 107, 6, 6);
   g2.fillOval(187, 347, 6, 6);

//画出天元
   g2.fillOval(187, 227, 6, 6);

//画出文字提示
   /*Font f=new Font("黑体", Font.BOLD, 24);
   g.setFont(f);*/
   g2.setFont(new Font("黑体", Font.BOLD, 20));
   g2.setColor(Color.BLACK);
   g2.drawString("游戏信息:"+message, 130, 40);
   g2.setFont(new Font("宋体", Font.ITALIC, 15));
   g2.drawString("黑方时间:"+blackMessage,25, 445);
   g2.drawString("白方时间:"+whiteMessage,245, 445);

//绘制全部棋子
   for(int i=0;i<=boardrows;i++)
   {
     for(int j=0;j<=boardcols;j++)
     {
       //存储黑棋
       if(allchess[i][j]==1)
       {
         int tempX=i*20-10;
         int tempY=j*20+30;
         //画出黑棋
         g2.setColor(Color.BLACK);
         g2.fillOval(tempX+12, tempY+13, 15, 15);
       }

//存储白棋
       if(allchess[i][j]==2)
       {
         int tempX=i*20-10;
         int tempY=j*20+30;
         //画出白棋
         g2.setColor(Color.BLACK);
         g2.drawOval(tempX+12, tempY+13, 15, 15);
         g2.setColor(Color.WHITE);
         g2.fillOval(tempX+12, tempY+13, 15, 15);
       }
     }

}

g2.setColor(c);

g.drawImage(b1,0,0,this);
 }

private boolean checkWin()
 {
   boolean flag=false;

int color = allchess[x][y];

/*// 保存共有相同颜色多少棋子相连
   int count1=1;
   int count2=1;
   int count3=1;
   int count4=1;

// 判断横向是否有5个棋子相连,特点 纵坐标 是相同, 即allChess[x][y]中y值是相同
   // 通过循环来做棋子相连的判断      
   int i = 1;
   while (color == allchess[x+i][y])
   {
     count1++;
     i++;
   }
   //将i值复位
   i = 1;
   while (color == allchess[x-i][y])
   {
     count1++;
     i++;
   }
   if(count1 >= 5)
   {
     flag = true;
   }

//判断纵向 ,即allChess[x][y]中x值是相同
   int j = 1;
   while (color == allchess[x][y+j])
   {
     count2++;
     j++;
   }
   //将j值复位
   j = 1;
   while (color == allchess[x][y-j])
   {
     count2++;
     j++;
   }
   if(count2>= 5)
   {
     flag = true;
   }

//判断斜向"\"
   int m1=1;
   int n1=1;
   while (color == allchess[x+m1][y+n1])
   {
     count3++;
     m1++;
     n1++;
   }
   m1=1;
   n1=1;
   while (color == allchess[x-m1][y-n1])
   {
     count3++;
     m1++;
     n1++;
   }
   if(count3>= 5)
   {
     flag = true;
   }

//判断斜向"/"
   int m2=1;
   int n2=1;
   while (color == allchess[x+m2][y-n2])
   {
     count4++;
     m2++;
     n2++;
   }
   m2=1;
   n2=1;
   while (color == allchess[x-m2][y+n2])
   {
     count4++;
     m2++;
     n2++;
   }
   if(count4>= 5)
   {
     flag = true;
   }

*/
   int count;
   //横向判断
   count=this.checkCount(1, 0, color);
   if(count>=5)
   {
     flag = true;
   }
   else
   {
     //纵向判断
     count=this.checkCount(0, 1, color);
     if(count>=5)
     {
       flag = true;
     }
     else
     {
       //斜向“/”
       count=this.checkCount(1, 1, color);
       if(count>=5)
       {
         flag = true;
       }
       else
       {
         //斜向“\”
         count=this.checkCount(1, -1, color);
         if(count>=5)
         {
           flag = true;
         }
       }
     }
   }

return flag;
 }

private int checkCount(int xChange,int yChange,int color)
 {
   int count=1;
   int tempX=xChange;
   int tempY=yChange;

while (color==allchess[x+xChange][y+yChange])
   {
     count++;
     if(xChange!=0)
     {
       xChange++;
     }
     if(yChange!=0)
     {
       if(yChange<0)
       {
         yChange--;
       }  
       else
         {
         yChange++;
         }

}

}
   //复位
   xChange=tempX;
   yChange=tempY;
   while (color==allchess[x-xChange][y-yChange])
   {
     count++;
     if(xChange!=0)
     {
       xChange++;
     }
     if(yChange!=0)
     {
       if(yChange<0)
       {
         yChange--;
       }  
       else
       {
         yChange++;
       }
     }  
   }
   return count;

}

public void mouseClicked(MouseEvent e)
 {

System.out.println("x:"+e.getX()+"y:"+e.getY());
   x=e.getX();
   y=e.getY();
   if(x>=10&&x<=(10+boardsize*boardrows+20)&&y>=50&&y<=(50+boardsize*boardcols+40))
   {
     //System.out.println("点在棋盘内。");
     x=(x-10)/20;
     y=(y-50-20)/20;

if(canPlay==true)
     {
       //判断当前要下什么颜色
       if(allchess[x][y]==0)
       {
         if(isBlack==true)
         {
           allchess[x][y]=1;
           isBlack=false;
           message="轮到白方";
         }
         else
         {
           allchess[x][y]=2;
           isBlack=true;
           message="轮到黑方";
         }

// 判断这个棋子是否和其他的棋子连成5连,即判断游戏是否结束
         boolean winFlag=this.checkWin();
         if(winFlag==true)
         {

JOptionPane.showMessageDialog(this,"游戏结束!"+
               (allchess[x][y]==1?"黑方":"白方")+"获胜。");
           canPlay=false;
         }
       }
       else
       {
         JOptionPane.showMessageDialog(this,"当前位置已经有棋子,请重新落子!");
       }
     }
     this.repaint();
   }

//点击,游戏开始按钮
       //重新开始新的游戏
   if(e.getX()>=400&&e.getX()<=470&&e.getY()>=80&&e.getY()<=110)
   {
     int result=JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?");
     if(result==0)
     {
       //重新开始的操作,allchess[][]数组中的信息全部为0
       //清空棋盘
       for (int i = 0; i < 19; i++)
       {
         for (int j = 0; j < 19; j++)
         {
           allchess[i][j] = 0;
         }
       }
       //另一种方式 allChess = new int[19][19];
       blackTime = maxTime;
       whiteTime = maxTime;
       if (maxTime > 0)
       {
         blackMessage = maxTime / 3600 + ":"
             + (maxTime / 60 - maxTime / 3600 * 60) + ":"
             + (maxTime - maxTime / 60 * 60);
         whiteMessage = maxTime / 3600 + ":"
             + (maxTime / 60 - maxTime / 3600 * 60) + ":"
             + (maxTime - maxTime / 60 * 60);
         t.resume();
       }
       else
       {
         blackMessage = "无限制";
         whiteMessage = "无限制";
       }
       message = "黑方先行";
       isBlack = true;
       this.canPlay = true;
       this.repaint();
     }
   }

//点击 游戏设置按钮
   if(e.getX()>=400&&e.getX()<=470&&e.getY()>=130&&e.getY()<=160)
   {
     String input = JOptionPane
         .showInputDialog("请输入游戏的最大时间(单位:分钟),如果输入0,表示没有时间限制:");
     try {
       maxTime = Integer.parseInt(input) * 60;
       if (maxTime < 0)
       {
         JOptionPane.showMessageDialog(this, "请输入正确信息,不允许输入负数!");
       }
       if (maxTime == 0)
       {
         int result = JOptionPane.showConfirmDialog(this,
             "设置完成,是否重新开始游戏?");
         if (result == 0)
         {
           for (int i = 0; i < 19; i++)
           {
             for (int j = 0; j < 19; j++)
             {
               allchess[i][j] = 0;
             }
           }
           // 另一种方式 allChess = new int[19][19];
           message = "黑方先行";
           isBlack = true;
           blackTime = maxTime;
           whiteTime = maxTime;
           blackMessage = "无限制";
           whiteMessage = "无限制";
           this.canPlay = true;
           this.repaint();
         }
       }
       if (maxTime > 0)
       {
         int result = JOptionPane.showConfirmDialog(this,
             "设置完成,是否重新开始游戏?");
         if (result == 0)
         {
           for (int i = 0; i < 19; i++)
           {
             for (int j = 0; j < 19; j++)
             {
               allchess[i][j] = 0;
             }
           }
           // 另一种方式 allChess = new int[19][19];
           message = "黑方先行";
           isBlack = true;
           blackTime = maxTime;
           whiteTime = maxTime;
           blackMessage = maxTime / 3600 + ":"
               + (maxTime / 60 - maxTime / 3600 * 60) + ":"
               + (maxTime - maxTime / 60 * 60);
           whiteMessage = maxTime / 3600 + ":"
               + (maxTime / 60 - maxTime / 3600 * 60) + ":"
               + (maxTime - maxTime / 60 * 60);
           t.resume();
           this.canPlay = true;
           this.repaint();
         }
       }
     }
     catch (NumberFormatException e1)
     {
       // TODO Auto-generated catch block
       JOptionPane.showMessageDialog(this, "请正确输入信息!");
     }
   }

//点击 游戏说明按钮
   if(e.getX()>=400&&e.getX()<=470&&e.getY()>=180&&e.getY()<=210)
   {
     JOptionPane.showMessageDialog(this,"这个一个五子棋游戏程序,黑白双方轮流下棋,当某一方连到五子时,游戏结束。");
   }

//点击 认输按钮
   if(e.getX()>=400&&e.getX()<=470&&e.getY()>=280&&e.getY()<=310)
   {
     int result=JOptionPane.showConfirmDialog(this,"是否确定认输?");
     if (result == 0)
     {
       if (isBlack)
       {
         JOptionPane.showMessageDialog(this, "黑方已经认输,游戏结束!");
       }
       else
       {
         JOptionPane.showMessageDialog(this, "白方已经认输,游戏结束!");
       }
       canPlay = false;
     }
   }

//点击 关于按钮
   if(e.getX()>=400&&e.getX()<=470&&e.getY()>=330&&e.getY()<=360)
   {
     JOptionPane.showMessageDialog(this,"本游戏由南木工作室制作,有相关问题可以访问www.yiyiinformation.com");
   }

//点击 退出按钮
   if(e.getX()>=400&&e.getX()<=470&&e.getY()>=380&&e.getY()<=410)
   {
     JOptionPane.showMessageDialog(this, "游戏结束");
     System.exit(0);
   }

}

//************************//
 @Override
 public void mouseEntered(MouseEvent arg0)
 {
   // TODO Auto-generated method stub

}

@Override
 public void mouseExited(MouseEvent arg0)
 {
   // TODO Auto-generated method stub

}

@Override
 public void mousePressed(MouseEvent arg0)
 {
   // TODO Auto-generated method stub

}

@Override
 public void mouseReleased(MouseEvent arg0) {
   // TODO Auto-generated method stub

}

@Override
 public void run()
 {
   if (maxTime > 0)
   {
     while (true)
     {
       if (isBlack)
       {
         blackTime--;
         if (blackTime == 0)
         {
           JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");
         }
       }
       else
       {
         whiteTime--;
         if (whiteTime == 0)
         {
           JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");
         }
       }
       blackMessage = blackTime / 3600 + ":"
           + (blackTime / 60 - blackTime / 3600 * 60) + ":"
           + (blackTime - blackTime / 60 * 60);
       whiteMessage = whiteTime / 3600 + ":"
           + (whiteTime / 60 - whiteTime / 3600 * 60) + ":"
           + (whiteTime - whiteTime / 60 * 60);
       this.repaint();
       try
       {
         Thread.sleep(1000);
       }
       catch (InterruptedException e)
       {
         // TODO Auto-generated catch block
         e.printStackTrace();
       }
       System.out.println(blackTime + " -- " + whiteTime);
     }
   }
 }

}

演示图:

java实现五子棋小游戏

以上所述就是本文的全部内容了,希望能够对大家熟练掌握java有所帮助。

标签:java,五子棋,小游戏
0
投稿

猜你喜欢

  • Android利用GridView实现单选效果

    2022-08-12 03:31:50
  • C# TabControl手动触发DrawItem的实现

    2023-12-27 17:01:27
  • 使用Java编写一个简单的Web的监控系统

    2023-02-18 04:00:19
  • SpringMVC通过模型视图ModelAndView渲染视图的实现

    2023-02-28 03:36:54
  • Java截取字符串的方法

    2023-11-07 09:30:02
  • 千万不要被阶乘吓倒

    2021-10-06 22:35:45
  • Java Spring的使用注解开发详解

    2023-04-27 03:00:40
  • Entity Framework模型优先与实体对象查询

    2022-11-18 07:19:36
  • 浅谈Java中方法参数传递的问题

    2021-11-06 04:24:46
  • Java后台线程操作示例【守护线程】

    2023-11-25 01:35:44
  • C#使用Selenium+PhantomJS抓取数据

    2022-09-13 23:18:02
  • Java数据结构之优先级队列(堆)图文详解

    2021-06-25 13:47:58
  • C#中ManualResetEvent用法总结

    2023-01-21 23:41:41
  • 详解C#如何实现读写ini文件

    2022-02-04 23:15:27
  • Android4.4 WebAPI实现拍照上传功能

    2023-08-17 00:46:21
  • 关于重写equals()方法和hashCode()方法及其简单的应用

    2023-08-01 06:48:13
  • 深入浅析Java 抽象类和接口

    2022-12-17 19:19:27
  • Android基于ImageView绘制的开关按钮效果示例

    2023-02-22 19:39:11
  • java与scala数组及集合的基本操作对比

    2022-03-03 05:52:27
  • java自动装箱拆箱深入剖析

    2023-09-03 08:45:19
  • asp之家 软件编程 m.aspxhome.com