Java实现小程序简单五子棋

本程序适用于java初学者巩固类与对象、事件响应、awt包中各种工具的相关概念以及对逻辑能力的锻炼

需要注意的有:

  • ①要加入java界面的重绘(基本原则)
  • ②由于玩家需要通过鼠标点击,计算机响应出棋子的位置,但却不能保证每次点击都正中棋盘点位,所以要有一定的误差范围
  • ③要保存更新棋盘上的棋子信息,因为棋盘格数是固定的故本例中采取最简单的数组

直接上代码:

分为三个类,同一包下:

package Study0326;

public interface WZQConfig {
 /*
  * 起始位置X
  */
 public static final int START_X = 60;
 /*
  * 起始位置Y
  */
 public static final int START_Y = 60;
 /*
  * 五子棋盘线条数
  */
 public static final int H_LINE = 15;
 /*
  * 五子棋盘竖线条数
  */
 public static final int V_LINE = 15;
 /*
  * 五子棋盘格子大小
  */
 public static final int SIZE = 60;
 /*
  * 储存棋子的x位置信息
  */
 public static final int[][] bx = new int[17][17];
}
package Study0326;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;

public class LoginListener implements MouseListener, WZQConfig, ActionListener {
 private int x, y;// 鼠标点击的位置
 private int x1, y1, xx, yy;// 鼠标点击附近格子交点的坐标
 private Graphics g;
 private int a = 0, i = 0, j = 0, count1 = 0;// count统计当前下的棋子数
 private String Str;// 定义全局变量获取按钮上的字符串
 private JButton jbu1, jbu2;
 private int GetX[] = new int[256];
 private int GetY[] = new int[256];
 WZQFrame ui;

 public void setG(Graphics g) {
  this.g = g;
 }

 public void setT(JButton b) {
  jbu1 = b;
 }

 public void setU(WZQFrame u) {
  ui = u;
 }

 public void mouseClicked(MouseEvent e) {

 }

 public void mousePressed(MouseEvent e) {

 }

 public void mouseReleased(MouseEvent e) {
  x = e.getX();
  y = e.getY();
  x1 = Math.abs(x - START_X);
  y1 = Math.abs(y - START_Y);
  xx = x1 % SIZE;
  if (xx >= SIZE / 2) {
   x1 = (x1 / SIZE) + 2;
  } else {
   x1 = (x1 / SIZE) + 1;
  }

  yy = y1 % SIZE;// 判断横坐标是否超过格子长度的一半(防止玩家点偏)
  if (yy >= SIZE / 2) {
   y1 = (y1 / SIZE) + 2;
  } else {
   y1 = (y1 / SIZE) + 1;
  }

  if ((count1 + 1) % 2 == 1) {// 单数步数时下黑棋,双数时下白棋
   g.setColor(Color.BLACK);
   if (bx[x1][y1] == 0) {
    bx[x1][y1] = 1;// 表示黑棋
    g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
      50, 50);
    count1++;// 所下棋子数加一
    GetX[count1] = x1;// 记录第count1步的棋子x值
    GetY[count1] = y1;// 记录第count1步的棋子y值
    if (CheckRow(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
    if (CheckList(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
    if (UpperRight(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
    if (UpperLeft(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
   }
  } else {
   g.setColor(Color.WHITE);
   if (bx[x1][y1] == 0) {
    bx[x1][y1] = 2;// 表示白棋
    g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
      50, 50);
    count1++;// 所下棋子数加一
    GetX[count1] = x1;// 记录第count1步的棋子x值
    GetY[count1] = y1;// 记录第count1步的棋子y值
    if (CheckRow(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
    if (CheckList(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
    if (UpperRight(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
    if (UpperLeft(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
   }
  }
 }

 public void actionPerformed(ActionEvent e) {
  setT(jbu1);
  Str = e.getActionCommand();// 读取点击按钮上的字符串
  if ("悔棋".equals(Str)) {
   if (g.getColor() == Color.BLACK) {
    g.setColor(Color.WHITE);
   }
   if (g.getColor() == Color.WHITE) {
    g.setColor(Color.BLACK);
   }
   Regret();
   ui.repaint();
  } else if ("重新开始".equals(Str)) {
   Restart();
   ui.repaint();
  }
 }

 public void mouseEntered(MouseEvent e) {

 }

 public void mouseExited(MouseEvent e) {

 }

 public int CheckRow(int x, int y)// 横着五子连成一条直线
 {
  int count = 0;
  for (int i = x + 1; i < bx.length; i++)// 向右判断是否棋子一样
  {
   if (bx[i][y] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = x; i >= 0; i--)// 向右判断是否棋子一样
  {
   if (bx[i][y] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }

 public int CheckList(int x, int y)// 竖着五子连成一条直线
 {
  int count = 0;
  for (int i = y + 1; i < bx.length; i++)// 向下判断是否棋子一样
  {
   if (bx[x][i] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = y; i >= 0; i--)// 向上判断是否棋子一样
  {
   if (bx[x][i] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }

 public int UpperRight(int x, int y)// 右上到左下五子连成一条直线
 {
  int count = 0;
  for (int i = x + 1, j = y - 1; i < bx.length && j >= 0; i++, j--)// 向下判断是否棋子一样
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = x, j = y; i >= 0 && j < bx.length; i--, j++)// 向上判断是否棋子一样
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }

 public int UpperLeft(int x, int y)// 左上到右下五子连成一条直线
 {
  int count = 0;
  for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--)// 向下判断是否棋子一样
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = x, j = y; i < bx.length && j < bx.length; i++, j++)// 向上判断是否棋子一样
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }

 public void Regret() {// 悔棋
  bx[GetX[count1]][GetY[count1]] = 0;
  if (count1 > 0) {
   count1--;
  }
 }

 public void Restart() {//重新开始
  {
   for (int k = 0; k <= count1; k++) {
    bx[GetX[k]][GetY[k]] = 0;
   }
  }
 }
}
package Study0326;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
/*
 * 五子棋的界面类,该类继承JFrame,然后实现WZQConfig接口
 */
import javax.swing.JPanel;

public class WZQFrame extends JPanel implements WZQConfig {
 public void WZQFrame() {
  // WZQFrame ui = new WZQFrame();
  JFrame jf = new javax.swing.JFrame();
  jf.setTitle("五子棋");
  jf.setDefaultCloseOperation(3);
  jf.setSize(1246, 1080);
  jf.setLocationRelativeTo(null);
  jf.setResizable(false);

  jf.setLayout(new FlowLayout());
  this.setLayout(new FlowLayout());

  this.setPreferredSize(new Dimension(1030, 1080));

  // this.setBackground(Color.CYAN);
  // 把面板对象添加到窗体上
  jf.add(this);
  JPanel jp1 = new JPanel();
  jp1.setPreferredSize(new Dimension(200, 1080));
  jp1.setLayout(new FlowLayout());
  jf.add(jp1);
  LoginListener ll = new LoginListener();
  String[] str = { "悔棋", "重新开始" };
  for (int i = 0; i < str.length; i++) {
   JButton jbu1 = new JButton(str[i]);
   jbu1.setPreferredSize(new Dimension(150, 80));
   jbu1.setFont(new Font("楷体", Font.BOLD,20));//设置字体
   jp1.add(jbu1);
   jbu1.addActionListener(ll);
  }

  jf.setVisible(true);

  Graphics g = this.getGraphics();

  this.addMouseListener(ll);

  ll.setG(g);
  ll.setU(this);
 }

 /*
  * 重写窗体绘制容器的方法
  */
 public void paint(Graphics g) {
  super.paint(g);

  ImageIcon im2 = new ImageIcon(this.getClass().getResource("2.jpg"));

  g.drawImage(im2.getImage(), 0, 0, 1030, 1080, null);

  for (int i = 1; i < 17; i++) {
   Graphics2D g2 = (Graphics2D) g;
   g2.setStroke(new BasicStroke(4));
   g2.drawLine(START_X, START_Y * i, START_X + SIZE * V_LINE, START_Y
     * i);// 横线
   g2.drawLine(START_X * i, START_Y, START_X * i, START_Y + SIZE
     * V_LINE);// 竖线

   g2.setStroke(new BasicStroke(8));
   // 画边框
   g2.drawLine(35, 35, 990, 35);
   g2.drawLine(35, 990, 990, 990);
   g2.drawLine(35, 35, 35, 990);
   g2.drawLine(990, 35, 990, 990);
  }
  for (int k = 0; k < 17; k++) {
   for (int k1 = 0; k1 < 17; k1++) {
    if (bx[k][k1] == 1) {
     g.setColor(Color.BLACK);
     g.fillOval(Math.abs(k * SIZE - 25),
       Math.abs(k1 * SIZE - 25), 50, 50);

    } else if (bx[k][k1] == 2) {
     g.setColor(Color.WHITE);
     g.fillOval(Math.abs(k * SIZE - 25),
       Math.abs(k1 * SIZE - 25), 50, 50);
    }

   }

  }

 }

 public static void main(String[] args) {
  WZQFrame l = new WZQFrame();
  l.WZQFrame();

 }

}

到此这篇关于Java实现小程序简单五子棋的文章就介绍到这了,更多相关Java实现简单五子棋内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现五子棋游戏(控制台版)

    本项目为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 该项目为Java编程语言编写的五子棋游戏(控制台版),用到二维数组.for循环.if语句.while()语句.Scanner Until包,此项目主要是对数组的使用.该项目的功能有落子.输出棋盘.判断输赢. 代码条: package edu.qizi.gam; import java.util.Scanner; public class GobangTest { public static void main(Stri

  • Java实现五子棋游戏

    本文实例为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 一.功能分析 五子棋的实现还是较为简单的,通过下期的流程我们可以知道大概要实现一下功能: 1.格界面 2.点击下棋 3.悔棋 4.判断输赢 二.功能实现 根据之前的功能分析,要有网格先要有窗体,我们先重新写一个类,来继承JFrame类,以便在窗口变动的情况下,对窗口进行重绘(防止在窗口大小发生改变的时候,之前的绘画会消失),这里我们重写paint方法,画出网格线 public class MyFrame extend

  • java swing实现简单的五子棋游戏

    用java swing写的一个简单的五子棋游戏. 下面是Main.java. package com.crossing.main; import com.crossing.view.GameWindow; public class Main { /** * @param args */ public static void main(String[] args) { GameWindow gameWindow = new GameWindow(); } } 下面是GameWindow.java.

  • Java初学者之五子棋游戏实现教程

    本文为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 1.图形化界面的创建 1.1创建JFrame窗体容器 1)JFrame窗体需要设置基本的大小.布局.默认的关闭方式,以及最重要的设置可见. 1.2在JFrame上添加组件,用来绘制棋盘棋子和游戏操作. 1)棋盘棋子的绘制:自定义一个类去继承JPanel,把绘制棋盘和棋子的方法重写进入paint()方法里,这样当窗体发生变化(放大.缩小.移动等操作时,棋盘棋子不会消失,棋局得以保存). 2)悔棋.认输等操作通过JButto

  • java五子棋小游戏实现代码

    前言 之前学完java基础课程,试着简单做了一下java的一个五子棋小游戏,记录下来. 界面 由于直接用的java库中的一些基本控件写的一个GUI,并没有做过多优化,感觉比较丑 下面是界面展示: 黑子先行,但是我这边简化规则,并没有考虑黑子先行的一些禁手. 下面直接贴代码 接口类 我把五子棋界面的一些常量都定义在了这个接口类中,包括棋盘的起始坐标,棋盘线的间距和棋子半径 public interface constant { int[][] chessLocation = new int[15]

  • java实现简易的五子棋游戏

    本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 先上效果图 一.问题分析 1.五子棋游戏分析: 五子棋作为较为普遍且简易的娱乐游戏,受到众多人的热爱,且五子棋AI也是一个较为容易实现的AI.下面我们先来分析游戏规则.(哈哈,虽然大家都知道,但我还是想写写)双方分别使用黑白两色棋子,下在棋盘横线交叉处,先连成五子者胜利.(黑棋禁手啥的规则在我的程序里没加,就不赘述了). 2.程序分析: (1)首先,五子棋开始,我们需要一个棋盘,15*15的棋盘,需要黑白棋子.

  • java开发实现五子棋游戏

    本文实例为大家分享了java实现五子棋游戏的具体代码,供大家参考,具体内容如下 此游戏具有双人对战功能和人机对战功能 一.游戏界面的实现 一个游戏首先从设计界面开始 1.首先创建一个类,作用是通过对窗体组件的一些设置来实现简单游戏界面 public void gameUI(){ //窗体组件 MyFrame jf = new MyFrame(); jf.setSize(900, 800); jf.setTitle("冷丁-五子棋"); //居中显示 jf.setLocationRela

  • Java实现小程序简单五子棋

    本程序适用于java初学者巩固类与对象.事件响应.awt包中各种工具的相关概念以及对逻辑能力的锻炼 需要注意的有: ①要加入java界面的重绘(基本原则) ②由于玩家需要通过鼠标点击,计算机响应出棋子的位置,但却不能保证每次点击都正中棋盘点位,所以要有一定的误差范围 ③要保存更新棋盘上的棋子信息,因为棋盘格数是固定的故本例中采取最简单的数组 直接上代码: 分为三个类,同一包下: package Study0326; public interface WZQConfig { /* * 起始位置X

  • 微信小程序简单实现form表单获取输入数据功能示例

    本文实例讲述了微信小程序简单实现form表单获取输入数据功能.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 index.wxml <form bindsubmit="formBindsubmit" bindreset="formReset"> <view style="display:flex;"> <label>用户名:</label> <input name="u

  • java微信小程序步数encryptedData和开放数据解密的实现

    前提: 三个参数, 1.sessionKey(拿openId的时候可以得到) 2.encryptedData(前端提供) 3.iv(前端提供) 一个类,一个方法. 1.类: import java.nio.charset.Charset; import java.util.Arrays; /** * 微信小程序加解密 * @author liuyazhuang * */ public class WxPKCS7Encoder { private static final Charset CHAR

  • 微信小程序实现五子棋游戏

    本文实例为大家分享了微信小程序实现五子棋游戏的具体代码,供大家参考,具体内容如下 效果图 .wxml <view class="title">   <view wx:if="{{currindex < 324 || defeat}}">   {{defeat?'胜出方:'+(outindex?'黑棋':'白棋'):'轮到了:'+(outindex?'白棋':'黑棋')}}   </view>   <view wx:el

  • Java微信小程序医院挂号系统

    目录 一.前言介绍 二.系统功能分析 2.1用户的功能设计 2.2管理员的功能设计 2.3医生的操作界面为 2.4系统功能结构 三.微信端登录界面的实现 3.1用户注册功能的实现 3.2登录功能的界面实现 四.用户角色功能的界面实现 4.1医生浏览功能的界面实现 4.2医生预约挂号功能的实现界面 4.3挂号记录管理功能的实现界面 4.4就诊记录功能的界面实现 4.6疾病料普浏览功能的实现界面 4.7在线答疑功能的实现 五.医生角色功能的设计界面 六.管理员功能的设计实现 6.1用户管理功能的实现

  • 学习Java中的日期和时间处理及Java日历小程序的编写

    Java 在 java.util 包中提供了 Date 类,这个类封装了当前的日期和时间. Date 类支持两种构造函数.第一个构造函数初始化对象的当前日期和时间. Date( ) 下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数 Date(long millisec) 一旦有一个可用的日期对象,可以调用以下任何一种支持的方法使用时间: SN 方法和描述 1 boolean after(Date date) 如果调用Date对象包含或晚于指定的日期则返回true,否则,返回

  • java 微信小程序code获取openid的操作

    最近有个小程序的项目 需要前端传code 后端获取openid 这里是纯后端 在这里记录一下吧 主要代码: 这里是获取openid的实现类 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.moszk.frame.basic.utils.HttpRequest; import org.springframework.web.bind.annotation.RequestMapp

  • 微信小程序 简单教程实例详解

    刚接触到微信小程序开发,这里做一个简单的教程: 1. 获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的"设置"-"开发者设置"中,查看到微信小程序的 AppID 了,注意不可直接使用服务号或订阅号的 AppID . 注意:如果要以非管理员微信号在手机上体验该小程序,那么我们还需要操作"绑定开发者".即在"用户身份"-"开发者"模块,绑定上需要体验该小程序

  • 微信小程序简单的canvas裁剪图片功能详解

    小程序miniso的一个发布内容截图功能,话不多,先上代码 wxml文件: <view class="cut-1-1 t-c {{cutSelect == 1? 'cut-select':''}}" data-cut="1" bindtap="selectCutType">1:1</view> <view class="cut-3-4 t-c {{cutSelect == 2? 'cut-select':'

  • 小程序简单两栏瀑布流效果的实现

    瀑布流又称瀑布流式布局,是比较流行的一种网站页面布局方式.视觉表现为参差不齐的多栏布局,即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次放入到高度最低的那一栏. 先上代码:https://developers.weixin.qq.com/s/Fgm5s1mz7Wdm 所谓简单,是指只考虑图片,图片之外的其他元素高度固定,不在考虑范围内. 说一下基本的实现思路: 1.加载列表数据 2.在一个隐藏的view中加载图片,通过image组件的bin

随机推荐