java 五子棋原理_Java制作五子棋的大概思路是什么?怎样能简单的判断胜利?

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.awt.image.*;

import javax.imageio.*;

import java.io.*;

public class Gobang

{

// 下面三个位图分别代表棋盘、黑子、白子

BufferedImage table;

BufferedImage black;

BufferedImage white;

// 当鼠标移动时候的选择框

BufferedImage selected;

// 最后获胜时

BufferedImage shengli;

// 定义棋盘的大小

private static int BOARD_SIZE = 15;

// 定义棋盘宽、高多少个像素

private final int TABLE_WIDTH = 535;

private final int TABLE_HETGHT = 536;

// 定义棋盘坐标的像素值和棋盘数组之间的比率。

private final int RATE = TABLE_WIDTH / BOARD_SIZE;

// 定义棋盘坐标的像素值和棋盘数组之间的偏移距。

private final int X_OFFSET = 5;

private final int Y_OFFSET = 6;

// 定义一个二维数组来充当棋盘

private String[][] board = new String[BOARD_SIZE][BOARD_SIZE];

// 五子棋游戏的窗口

JFrame f = new JFrame("五子棋游戏");

// 五子棋游戏棋盘对应的Canvas组件

ChessBoard chessBoard = new ChessBoard();

// 当前选中点的坐标

private int selectedX = -1;

private int selectedY = -1;

//定义是否该黑色棋子,true代表是

private boolean flag = true;

//定义获胜方棋子,未分胜负时用"╋"表示

private String qizi = "╋";

public void init()throws Exception

{

f.setLocation(415,95);

f.setResizable(false);

table = ImageIO.read(new File("image/board.jpg"));

black = ImageIO.read(new File("image/black.gif"));

white = ImageIO.read(new File("image/white.gif"));

selected = ImageIO.read(new File("image/selected.gif"));

// 把每个元素赋为"╋","╋"代表没有棋子

for (int i = 0 ; i < BOARD_SIZE ; i++)

{

for ( int j = 0 ; j < BOARD_SIZE ; j++)

{

board[i][j] = "╋";

}

}

chessBoard.setPreferredSize(new Dimension(

TABLE_WIDTH , TABLE_HETGHT));

chessBoard.addMouseListener(new MouseAdapter()

{

public void mouseClicked(MouseEvent e)

{

// 将用户鼠标事件的坐标转换成棋子数组的坐标。

int xPos = (int)((e.getX() - X_OFFSET) / RATE);

int yPos = (int)((e.getY() - Y_OFFSET ) / RATE);

//判断对应位置有没有棋子

if (board[xPos][yPos].equals("╋"))

{

if (true == flag)

{

board[xPos][yPos] = "●";

flag = false;

}

else

{

board[xPos][yPos] = "○";

flag = true;

}

}

chessBoard.repaint();

//判断是否出现胜负

judge();

}

// 当鼠标退出棋盘区后,复位选中点坐标

public void mouseExited(MouseEvent e)

{

selectedX = -1;

selectedY = -1;

chessBoard.repaint();

}

});

chessBoard.addMouseMotionListener(new MouseMotionAdapter()

{

// 当鼠标移动时,改变选中点的坐标

public void mouseMoved(MouseEvent e)

{

selectedX = (e.getX() - X_OFFSET) / RATE;

selectedY = (e.getY() - Y_OFFSET) / RATE;

chessBoard.repaint();

}

});

f.add(chessBoard);

f.pack();

f.setVisible(true);

}

public static void main(String[] args)throws Exception

{

Gobang gb = new Gobang();

gb.init();

}

class ChessBoard extends JPanel

{

// 重写JPanel的paint方法,实现绘画

public void paint(Graphics g)

{

// 将绘制五子棋棋盘

g.drawImage(table , 0 , 0 , null);

// 绘制选中点的红框

if (selectedX >= 0 && selectedY >= 0)

g.drawImage(selected , selectedX * RATE + X_OFFSET ,

selectedY * RATE + Y_OFFSET, null);

// 遍历数组,绘制棋子。

for (int i = 0 ; i < BOARD_SIZE ; i++)

{

for ( int j = 0 ; j < BOARD_SIZE ; j++)

{

// 绘制黑棋

if (board[i][j].equals("●"))

{

g.drawImage(black , i * RATE + X_OFFSET

, j * RATE + Y_OFFSET, null);

}

// 绘制白棋

if (board[i][j].equals("○"))

{

g.drawImage(white, i * RATE + X_OFFSET

, j * RATE + Y_OFFSET, null);

}

}

}

if (!"╋".equals(qizi))

{

try

{

System.out.println("-------------------------------------------");

switch (qizi)

{

case "●":

{

System.out.println("-----------------------------------黑棋获胜");

shengli = ImageIO.read(new File("image/黑子获胜.png"));

break;

}

case "○":

{

System.out.println("-----------------------------------白棋获胜");

shengli = ImageIO.read(new File("image/白子获胜.png"));

break;

}

default:

{

System.out.println("------------------------------------系统Bug");

break;

}

}

}

catch (Exception e)

{

}

g.drawImage(shengli,105,120,null);

}

}

}

private boolean judge()

{

String temp = null; //记录当前位置

int x,y; //记录当前坐标

for (int i = 0 ; i < BOARD_SIZE ; i++) //横向遍历棋盘

{

for ( int j = 0 ; j < BOARD_SIZE ; j++)//纵向遍历棋盘

{

temp = board[i][j]; //

if (!temp.equals("╋")) //判断是否有棋子

{

for (int k=0;k<4 ;k++ ) //按向右、向下、右下、左下四个方向判断

{

x = i;

y = j;

switch (k)

{

case 0: //向右判断

{

for (int t=0;t<5 ;t++ )//判断另外四个棋子

{

if (4 == t)//t值等于4说明前面四个子和

{

qizi = temp;

return true;

}

if (BOARD_SIZE == ++y||!temp.equals(board[x][y]))//y值等于BOARD_SIZE表明已超出棋盘边界

{

break;

}

}

break;

}

case 1: //向下判断

{

for (int t=0;t<5 ;t++ )//判断另外四个棋子

{

if (4 == t)//t值等于4说明前面四个子

{

qizi = temp;

return true;

}

if (BOARD_SIZE == ++x||!temp.equals(board[x][y]))//y值等于BOARD_SIZE表明已超出棋盘边界

{

break;

}

}

break;

}

case 2: //向右下方向判断

{

for (int t=0;t<5 ;t++ )//判断另外四个棋子

{

if (4 == t)//t值等于4说明前面四个子

{

qizi = temp;

return true;

}

if (BOARD_SIZE == ++x||BOARD_SIZE == ++y||!temp.equals(board[x][y]))//x、y值等于BOARD_SIZE表明已超出棋盘边界

{

break;

}

}

break;

}

case 3: //向左下放下判断

{

for (int t=0;t<5 ;t++ )//判断另外四个棋子

{

if (4 == t)//t值等于4说明前面四个子

{

qizi = temp;

return true;

}

if (BOARD_SIZE == ++x||-1 == --y||!temp.equals(board[x][y]))//x等于BOARD_SIZE或者y值等于-1表明已超出棋盘边界

{

break;

}

}

break;

}

default:

{

break;

}

}

}

}

}

}

return false;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值