java实现五子棋小游戏

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有所帮助。

(0)

相关推荐

  • java使用OGEngine开发2048

    最近有一款2048的游戏非常火,本文将来介绍一下使用OGEngine游戏引擎开发游戏2048. OGEngine引擎是开源的,我们很容易找到,搭建起来也很方便,我们只需在Android工程下添加OGEngine的jar包或者直接引用源码就可以了. 源码下载:http://www.ogengine.com/download/resources.jsp private void initView() { // 游戏背景 AnimatedSprite game_bg = new AnimatedSpr

  • Java制作智能拼图游戏原理及代码

    今天突发奇想,想做一个智能拼图游戏来给哄女友. 需要实现这些功能 第一图片自定义 第二宫格自定义,当然我一开始就想的是3*3 4*4 5*5,没有使用3*5这样的宫格. 第三要实现自动拼图的功能,相信大家知道女人耍游戏都不是很厉害,所以这个自动拼图功能得有. 其他什么暂停.排行就不写了! 现在重点问题出来了 要实现自动拼图功能似乎要求有点高哦!计算机有可不能像人一样只能: 先追究下本质 拼图游戏其实就是排列问题: 排列有这么一个定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺

  • Java基于swing实现的弹球游戏代码

    本文实例讲述了Java基于swing实现的弹球游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package Game; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Random;

  • java版实现2048游戏功能

    本文实例为大家分享了java实现2048游戏功能的具体代码,供大家参考,具体内容如下 功能要求:2048的基本界面,能够实现2048的游戏功能. 总思路:两个类:Game和GameListener. Game负责界面的实现和paint方法的重写 GameListener负责实现键盘和鼠标事件的处理.移动方法,相加方法,输赢判断和随机数的出现都要在键盘监听的方法中实现. 实现分析:要实现2048游戏,首先需要考虑2048都有些什么? 界面实现: 2048的游戏界面很简单,就是一些方格和数字.要实现

  • Java编写掷骰子游戏

    废话不多说了,直接奔主题. **多线程&&观察者模式 题目要求:<掷骰子>窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰子的总点数小于等于9,则开小,否则开大,然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱. 分析:这个题目要求灵活运用多线程的相关知识,达到点击开始按钮时,有3个线程启动,分别控制3颗骰子的转动,在3颗骰子全部转完以后,回到主线程计算游戏结果. //个

  • Java编写迷宫小游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树是比较合适的,从根节点到每一个子节点都只有一条路径.假设入口是根节点,出口是树中某个子节点,那么,从根节点到该子节点的路径肯定是唯一的. 所以如果能构造一棵树把所有的格子都覆盖到,也就能够做出一个迷宫了. 另外还要求树的父节点和子节点必须是界面上相邻的格子. 在界面显示时,父节点和子节点之间共用的边

  • java实现的简单猜数字游戏代码

    本文实例讲述了java实现的简单猜数字游戏代码.分享给大家供大家参考. 具体代码如下: 复制代码 代码如下: import java.util.InputMismatchException; import java.util.Scanner; public class Main {         public static void main(String[] args) {                 // 产生一个随机数                 int number = (in

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • Java完美实现2048小游戏

    完美地模仿了2048游戏,是根据网友的一个2048改的. Block.java import javax.swing.*; import java.awt.*; public class Block extends JLabel { private int value; public Block() { value = 0;//初始化值为0 setFont(new Font("font", Font.PLAIN, 40));//设定字体 setBackground(Color.gray

  • java编写贪吃蛇小游戏

    废话不多说,直接奉上代码: Frame.java package snake; import java.awt.Graphics; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import

随机推荐