Java小项目之:五子棋,你下棋下得过电脑吗?

Java五子棋功能要求:

1.创建窗口和设计一个棋盘界面

2.实现鼠标点击,棋子出现,黑白棋轮流下

3.能够判断五子相连输赢

4.添加重新开始,悔棋,退出按钮功能

这个java五子棋玩法丰富,但是界面简陋,十分适合java小白上手。界面是这样子的:

代码:

package fivechess1;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.util.Arrays;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

public class GamePanel extends JPanel {

/**

*

*/

private static final long serialVersionUID = 5372121135068238487L;

private final int w = 20, h = 20, s = 20;

private int X, Y;

private int[] x = {}, y = {};

private Color[] c = {};

private String[][] str = new String[w][h];

private String white = "w", black = "b";

private String display = "开始游戏,黑棋先下";

private Controller controller;

public void setController(Controller controller) {

this.controller = controller;

}

public void init() {

display = "开始游戏,黑棋先下";

x = Arrays.copyOf(x, 0);

y = Arrays.copyOf(y, 0);

c = Arrays.copyOf(c, 0);

getStr();

}

public int getW() {

return w;

}

public int getH() {

return h;

}

public int getS() {

return s;

}

public GamePanel() {

this.setSize(w * s, h * s + 50);

getStr();

repaint();

this.addMouseListener(new MouseListener() {

@Override

public void mouseReleased(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

X = e.getX();

Y = e.getY();

startGame();

}

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseEntered(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

}

});

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(Color.RED);

for (int x = 0; x < w; x++) {

for (int y = 0; y < h; y++) {

g.fill3DRect(x * s, y * s, s, s, true);

}

}

if (x.length > 0 && y.length > 0) {

for (int i = 0; i < x.length; i++) {

g.setColor(c[i]);

g.fillOval(x[i] / s * s, y[i] / s * s, s, s);

}

}

Font f = new Font("楷书", Font.PLAIN, 20);

g.setColor(Color.BLUE);

g.setFont(f);

g.drawString(display, 10, h * s + 25);

}

public void startGame() {

if (c.length % 2 == 0) {

if (str[X / s][Y / s].equals("*")) {

display = "黑方已下子,请白方下子";

str[X / s][Y / s] = black;

x = Arrays.copyOf(x, x.length + 1);

x[x.length - 1] = X;

y = Arrays.copyOf(y, y.length + 1);

y[y.length - 1] = Y;

c = Arrays.copyOf(c, c.length + 1);

c[c.length - 1] = Color.BLACK;

repaint();

if (isSuccess(black)) {

int options = JOptionPane.showConfirmDialog(GamePanel.this,

"黑方胜,是否新开一局");

if (options == JOptionPane.YES_OPTION) {

controller.returnButton();

} else if (options == JOptionPane.NO_OPTION) {

System.exit(0);

}

}

}

else if (str[X / s][Y / s].equals(white)) {

display = "所下位置被白方所占,请黑方重新下子";

repaint();

} else {

display = "所下位置黑方已经占了,请黑方重新下子";

repaint();

}

} else {

if (str[X / s][Y / s].equals("*")) {

display = "白方已下子,请黑方下子";

str[X / s][Y / s] = white;

x = Arrays.copyOf(x, x.length + 1);

x[x.length - 1] = X;

y = Arrays.copyOf(y, y.length + 1);

y[y.length - 1] = Y;

c = Arrays.copyOf(c, c.length + 1);

c[c.length - 1] = Color.WHITE;

repaint();

if (isSuccess(white)) {

int option = JOptionPane.showConfirmDialog(GamePanel.this,

"白方胜,是否新开一局");

if (option == JOptionPane.YES_OPTION) {

controller.returnButton();

} else if (option == JOptionPane.NO_OPTION) {

System.exit(0);

}

}

}

else if (str[X / s][Y / s].equals(black)) {

display = "所下位置被黑方所占,请白方重新下子";

repaint();

} else {

display = "所下位置白方已經占了,请白方重新下子";

repaint();

}

}

}

public void getStr() {

for (int i = 0; i < str.length; i++) {

for (int j = 0; j < str[i].length; j++) {

str[i][j] = "*";

}

}

}

public boolean isSuccess(String player) {

int left, right, up, down, lu, rd, ld, ru;

left = getLeft(player);

right = getRight(player);

up = getUp(player);

down = getDown(player);

lu = getLU(player);

rd = getRD(player);

ld = getLD(player);

ru = getRU(player);

return left + right >= 4 || up + down >= 4 || lu + rd >= 4

|| ld + ru >= 4;

}

public int getLeft(String player) {

int left = 0;

int i = X / s, j = Y / s;

while (true) {

if (i == 0) {

break;

}

i--;

if (!str[i][j].equals(player)) {

break;

}

left++;

}

return left;

}

public int getRight(String player) {

int right = 0;

int i = X / s, j = Y / s;

while (true) {

if (i == w - 1) {

break;

}

i++;

if (!str[i][j].equals(player)) {

break;

}

right++;

}

return right;

}

public int getUp(String player) {

int up = 0;

int i = X / s, j = Y / s;

while (true) {

if (j == 0) {

break;

}

j--;

if (!str[i][j].equals(player)) {

break;

}

up++;

}

return up;

}

public int getDown(String player) {

int down = 0;

int i = X / s, j = Y / s;

while (true) {

if (j == h - 1) {

break;

}

j++;

if (!str[i][j].equals(player)) {

break;

}

down++;

}

return down;

}

public int getLU(String player) {

int lu = 0;

int i = X / s, j = Y / s;

while (true) {

if (i == 0 || j == 0) {

break;

}

i--;

j--;

if (!str[i][j].equals(player)) {

break;

}

lu++;

}

return lu;

}

public int getRD(String player) {

int rd = 0;

int i = X / s, j = Y / s;

while (true) {

if (i == w - 1 || j == h - 1) {

break;

}

i++;

j++;

if (!str[i][j].equals(player)) {

break;

}

rd++;

}

return rd;

}

public int getRU(String player) {

int ru = 0;

int i = X / s, j = Y / s;

while (true) {

if (j == 0 || i == w - 1) {

break;

}

i++;

j--;

if (!str[i][j].equals(player)) {

break;

}

ru++;

}

return ru;

}

public int getLD(String player) {

int ld = 0;

int i = X / s, j = Y / s;

while (true) {

if (i == 0 || j == h - 1) {

break;

}

i--;

j++;

if (!str[i][j].equals(player)) {

break;

}

ld++;

}

return ld;

}

}

完整源码与素材可以私信我领取!

喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力!

祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早生贵子,从不掉发!

Java小项目之:五子棋,你下棋下得过电脑吗?的更多相关文章

  1. JAVA小项目之五子棋

    五子棋V1.0 功能: 人人对战,人机对战(初级) 记录双方分数: 主要知识点: 二维坐标系中,各方向坐标的关系及规律. 效果图: 主框架类: package com.gxlee.wzq; /** * ...

  2. Java小项目--坦克大战(version1.0)

    Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...

  3. java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  4. Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...

  5. Java小项目之:教你做个聊天系统!

    Java小项目之:聊天系统 今天给大家带来的java练手小项目是一个简单的聊天室,界面简单,操作不难. 分为注册系统,登录系统和聊天系统三部分,很适合java小白练手. 完整的源码和素材请关注并私信我 ...

  6. java小项目之:扫雷,这游戏没有你想的那么简单!

    扫雷 我之前分享的小项目和小游戏,电影购票.坦克大战.捕鱼达人.贪吃蛇等,虽然已经是耳熟能详人尽皆知的项目和游戏,但是保不齐真的有人没接触过. 今天分享的这个项目,我不相信没人接触过(仅限80后-00 ...

  7. Python小项目之五子棋

    1.项目简介 在刚刚学习完python套接字的时候做的一个五子棋小游戏,可以在局域网内双人对战,也可以和电脑对战 2.实现思路 局域网对战 对于局域网功能来说,首先建立连接(tcp),然后每次下棋时将 ...

  8. java web项目中 获取resource路径下的文件路径

    public GetResource{ String path = GetResource.class.getClassLoader().getResource("xx/xx.txt&quo ...

  9. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序

    如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置.参考配置如下:<?xml version="1.0" enco ...

随机推荐

  1. LA 4973 Ardenia (3D Geometry + Simulation)

    ACM-ICPC Live Archive 三维几何,题意是要求求出两条空间线段的距离.题目难度在于要求用有理数的形式输出,这就要求写一个有理数类了. 开始的时候写出来的有理数类就各种疯狂乱套,TLE ...

  2. React事件用法

    一.事件处理函数的使用 1.1 绑定事件处理函数 1.2 使用 <HelloWorld onClick={this.handleClick}/> 大括号中指定的是this对象即当前组件引用 ...

  3. 给radio添加点击事件

    1.单独给每个radio添加点击事件 <fieldset id="form-gra-time"> <legend>请选择日期粒度:</legend&g ...

  4. PyCharm indexing goes into infinite loop pycharm 不同的indexing

    https://stackoverflow.com/questions/24955896/pycharm-indexing-goes-into-infinite-loop 5 1 I opened u ...

  5. 在SuperSocket中启用TLS/SSL传输层加密

    关键字: TLS, SSL, 传输层加密, 传输层安全, 证书使用, X509Certificate SuperSocket 支持传输层加密(TLS/SSL) SuperSocket 有自动的对TLS ...

  6. rsa加密(非对称加密)

    rsa加密 是非对称加密 需要公钥 与 私钥 这个公钥私钥的具体值需要与后端协商定下 rsa js代码如下 代码太多不插入了 html代码如下 <!DOCTYPE html> <ht ...

  7. java 两种进程创建方式比较

    A extends Thread: 简单 不能再继承其他类了(Java单继承) 同份资源不共享 A implements Runnable:(推荐) 多个线程共享一个目标资源,适合多线程处理同一份资源 ...

  8. centos7搭建集群必知:centos7已经无iptables,只有firewall

    1.防火墙概述 centos7搭建集群,发现没有iptables,需要安装.防火墙为firewalle CentOS7默认的防火墙不是iptables,而是firewalle. CentOS 7.0默 ...

  9. P1052 国王放置问题

    题目描述 在n*m的棋盘上放置k个国王,要求k个国王互相不攻击,有多少种不同的放置方法.假设国王放置在第(x,y)格,国王的攻击的区域是:(x-1,y-1), (x-1,y),(x-1,y+1),(x ...

  10. RabbitMQ-事务和Confirm消息确认

    ,如果要保证消息的可靠性,需要对消息进行持久化处理,然而消息持久化除了需要代码的设置之外,还有一个重要步骤是至关重要的,那就是保证你的消息顺利进入Broker(代理服务器),如图所示: 正常情况下,如 ...