java五子棋判断_java-----五子棋小游戏(三)-----判断输赢

本文介绍了一个使用Java实现的五子棋小游戏,详细展示了代码实现,包括棋盘绘制、落子判断、游戏胜负检测等功能。游戏会根据玩家落子情况实时检查是否形成五子连线,一旦出现五子连珠则宣布游戏结束并显示获胜者。
摘要由CSDN通过智能技术生成

一、代码实现

package org.like.game.frame;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Toolkit;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

public class FiveChessFrame extends JFrame implements MouseListener

{

int width = Toolkit.getDefaultToolkit().getScreenSize().width;

int height = Toolkit.getDefaultToolkit().getScreenSize().height;

BufferedImage bgImage = null;

int x = 0;

int y = 0;

int[][] allChess = new int[19][19];

boolean isBlack = true;

boolean canPlay = true;//判断游戏可以继续落子,如果哪一方胜利,就置为false,不执行mousePressed的主体

public FiveChessFrame()

{

this.setTitle("五子棋");

this.setSize(500,500);

this.setLocation((width-500)/2,(height-500)/2);

this.setResizable(false);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

this.addMouseListener(this);

try

{

bgImage = ImageIO.read(new File("F:/mypicture/java/background.jpg"));

}

catch (IOException e)

{

e.printStackTrace();

}

}

public void paint(Graphics g)

{

g.drawImage(bgImage,3,20,this);

g.setFont(new Font("黑体",Font.BOLD,20));

g.drawString("游戏信息:", 150, 50);

g.setFont(new Font("宋体",0,14));

g.drawString("黑方时间:无限制", 45, 470);

g.drawString("白方时间:无限制", 260, 470);

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

{

g.drawLine(13, 70+20*i, 372, 70+20*i);

g.drawLine(13+20*i,70,13+20*i,430);

}

g.fillOval(71, 128, 4, 4);

g.fillOval(311, 128, 4, 4);

g.fillOval(311, 368, 4, 4);

g.fillOval(71, 368, 4, 4);

g.fillOval(311, 248, 4, 4);

g.fillOval(191, 128, 4, 4);

g.fillOval(71, 248, 4, 4);

g.fillOval(191, 368, 4, 4);

g.fillOval(191, 248, 4, 4);

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

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

{

if(allChess[i][j] == 1)

{

x = i * 20 + 13;

y = j * 20 + 70;

g.fillOval(x-7, y-7, 14, 14);

}

if(allChess[i][j] == 2)

{

x = i * 20 + 13;

y = j * 20 + 70;

g.setColor(Color.WHITE);

g.fillOval(x-7, y-7, 14, 14);

g.setColor(Color.BLACK);

g.drawOval(x-7, y-7, 14, 14);

}

}

}

@Override

public void mouseClicked(MouseEvent e)

{

}

@Override

public void mousePressed(MouseEvent e)

{

if(canPlay == true)

{

x = e.getX();

y = e.getY();

if(x >= 13 && x <= 372 && y >= 70 && y <= 430)

{

x = (x - 13) / 20;

y = (y - 70) / 20;

if(allChess[x][y] == 0)

{

if(isBlack)

{

allChess[x][y] = 1;

isBlack = false;

}

else

{

allChess[x][y] = 2;

isBlack = true;

}

this.repaint();

boolean winFlag = this.checkWin();//每下一个棋子就判断输赢

if(winFlag == true)//哪一方获胜就弹出窗口并将canPlay置为false

{

JOptionPane.showMessageDialog(this, "游戏结束"+(allChess[x][y] == 1?"黑方":"白棋")+"获胜!");

canPlay = false;

}

}

else

{

JOptionPane.showMessageDialog(this, "当前位置已经有旗子了,请重新落子!");

}

}

}

}

@Override

public void mouseReleased(MouseEvent e)

{

}

@Override

public void mouseEntered(MouseEvent e)

{

}

@Override

public void mouseExited(MouseEvent e)

{

}

public static void main(String[] args)

{

FiveChessFrame ff = new FiveChessFrame();

}

private boolean checkWin()//判断输赢

{

boolean flag = false;

int count = 1;

int color = allChess[x][y];

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 (x + xChange >= 0 && x + xChange <= 18 && y + yChange >= 0&& y + yChange <= 18

&& color == allChess[x + xChange][y + yChange])

{//下一个需要判断的棋子在边界内并且与上一个棋子颜色相同则执行,这是判断x的右边和y的下边

count++;

if (xChange != 0)//xChange不为零,就判断x的右上和左下

xChange++;

if (yChange != 0) {

if (yChange > 0)

yChange++;

else {

yChange--;

}

}

}

xChange = tempX;

yChange = tempY;

while (x - xChange >= 0 && x - xChange <= 18 && y - yChange >= 0&& y - yChange <= 18

&& color == allChess[x - xChange][y - yChange])

{//继续判断x的左边和y的上边

count++;

if (xChange != 0)//xChange不为零,就判断x的左上和右下

xChange++;

if (yChange != 0) {

if (yChange > 0)

yChange++;

else {

yChange--;

}

}

}

return count;//返回当前判断的方向共有多少个同色棋子相连,共四个方向,横竖对角线四个

}

}

二、

效果展示

0818b9ca8b590ca3270a3433284dd417.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值