最近谢了几个java的小案例,在这里跟大家分享一下,现在说的是一个java的五子棋的小案例,案例之实现了基础的下棋和盘点胜负的功能,至于悔棋的功能和提示的功能,因为本人比较懒,代码就没有添加,如果有需要的朋友,可以练习我,我来补全相应的代码,其实最基本的数据已经实现了,至于信息展示和悔棋功能,不过是重载对象罢了,项目写的不好,多多包涵,希望有大神给出优化的好的方案
废话不多说。直接上代码
下面的是棋子类。之所以封装成一个实体类,主要是为了操作方便,也可以使用数组或多维数组代替。
package cn.wuzi;
/**
*
* @ClassName: Piece
* @Description: 棋子类
* @author 少天
* @date 2017年12月8日 下午3:56:30
*
*/
public class Piece {
//坐标
private int x;
private int y;
public Piece() {
super();
}
public Piece(int x, int y, boolean pieceColor) {
super();
this.x = x;
this.y = y;
this.pieceColor = pieceColor;
}
//颜色 false 为白子 true为 黑子
private boolean pieceColor;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean isPieceColor() {
return pieceColor;
}
public void setPieceColor(boolean pieceColor) {
this.pieceColor = pieceColor;
}
@Override
public String toString() {
return "Piece [x=" + x + ", y=" + y + ", pieceColor=" + pieceColor + "]";
}
}
窗口类,也是程序的入口,这个类里面主要是实现创建游戏运行的窗口,和将游戏效果的画布添加到窗口上
package cn.wuzi;
import javax.swing.JFrame;
/**
*
* @ClassName: WuZiJFrame
* @Description: 悔棋功能尚未开发
* @author 少天
* @date 2017年12月10日 下午1:46:35
*
*/
public class WuZiJFrame {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setTitle("五子棋");
frame.setBounds(10, 10, 650, 720);
frame.setResizable(false);
WuziJPanle wuziJPanle=new WuziJPanle();
frame.add(wuziJPanle);
frame.setVisible(true);
}
}
package cn.wuzi;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import org.omg.CORBA.PRIVATE_MEMBER;
public class WuziJPanle extends JPanel implements KeyListener{
private static final long serialVersionUID = 1L;
private ImageIcon hd=new ImageIcon("point.png");//黑点
private ImageIcon gb=new ImageIcon("gb.png");//红色光标,默认在中心
private ImageIcon heizi=new ImageIcon("heizi.png");//黑子
private ImageIcon baizi=new ImageIcon("baizi.png");//白子
private Piece piece;//棋子
private List heilist=new ArrayList();//黑子集合
private List bailist=new ArrayList();//白子集合
private List alllist=new ArrayList();//所有集合
//绘制线条 坐标
private int hangx=0;
private int hangy=0;
//红色光标 坐标
private int gbx=0;
private int gby=0;
//定义变量,判断轮到谁落子,默认黑子
private boolean isBlack=true;
//游戏是否结束
private boolean isFaild=false;
//连子数
private int conSize=1;
//查询落点是否冲突
boolean isHave =false;
private String str;
public WuziJPanle(){
this.setFocusable(true);
this.addKeyListener(this);
initView();
}
//初始化方法
public void initView(){
hangx=0;
hangy=0;
gbx=9*30+50-11;
gby=9*30+110-11;
isBlack=true;
isFaild=false;
isHave =false;
conSize=1;
}
protected void paintComponent(Graphics g) {
g.setColor(Color.GRAY);
g.fillRect(20, 80, 600, 600);
for (int i = 0; i <= 18; i++) {
//设置绘制坐标
hangx=i*30+50;
hangy=i*30+110;
int xk=1;
//网格线加粗
if (i==0||i==18) {
xk=3;
}
else{
xk=1;
}
//绘制网格
g.setColor(Color.BLACK);
g.fillRect(50,hangy , 543, xk);
g.fillRect(hangx,110 , xk, 543);
//绘制黑点
if (i==3||i==9||i==15) {
hd.paintIcon(this, g, hangx-3, 3*30+110-3);
hd.paintIcon(this, g, hangx-3, 9*30+110-3);
hd.paintIcon(this, g, hangx-3, 15*30+110-3);
}
}
for (int i = 0; i < heilist.size(); i++) {
heizi.paintIcon(this, g, heilist.get(i).getX(), heilist.get(i).getY());
}
for (int i = 0; i < bailist.size(); i++) {
baizi.paintIcon(this, g, bailist.get(i).getX(), bailist.get(i).getY());
}
if (isFaild==false) {
gb.paintIcon(this, g, gbx, gby);
}
if (isFaild==true) {
if (isBlack==true) {
str=" white ";
}else{
str=" black ";
}
g.setColor(Color.green);
g.setFont(new Font("arial",Font.BOLD, 30));
g.drawString("GameOver"+str+"isWiner", 150, 350);
}
}
/**
*
* @Title: keyPressed
* @Description:按键监听的方法
*/
@Override
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
if (keyCode==KeyEvent.VK_SPACE) {
if (isFaild==true) {
initView();
heilist.clear();
bailist.clear();
alllist.clear();
}
}
isHave=false;
//在外层判断是黑子还是白字
// 判断是否 非黑子 及是否是白子
if (isBlack==false) {
//白子走
switch (keyCode) {
case 87://点击 W 按键
if (gby > 110-11) {
gby=gby-30;
}
break;
case 65://点击 A 按键
if (gbx > 50-11) {
gbx=gbx-30;
}
break;
case 83://点击 S 按键
if (gby < 18*30+110-11) {
gby=gby+30;
}
break;
case 68://点击 D 按键
if (gbx < 18*30+50-11) {
gbx=gbx+30;
}
break;
case 69://点击 E 按键 白子落子
for (int i = 0; i < alllist.size(); i++) {
if (gbx-1==alllist.get(i).getX()&&gby-1==alllist.get(i).getY()) {
isHave=true;
break;
}
}
if (isHave==false) {
piece=new Piece(gbx-1, gby-1, false);
bailist.add(piece);
alllist.add(piece);
isBlack=true;
//计算胜负的方法
isFaild=this.isWin(piece,bailist);
}
break;
}}else {
//黑子走
switch (keyCode) {
case KeyEvent.VK_UP://点击 向上 按键
if (gby > 110-11) {
gby=gby-30;
}
break;
case KeyEvent.VK_LEFT://点击 <-- 按键
if (gbx > 50-11) {
gbx=gbx-30;
}
break;
case KeyEvent.VK_DOWN://点击 向下 按键
if (gby < 18*30+110-11) {
gby=gby+30;
}
break;
case KeyEvent.VK_RIGHT://点击-->按键
if (gbx < 18*30+50-11) {
gbx=gbx+30;
}
break;
case 76://点击 L 按键 黑子落子
if (alllist.size()>0) {
for (int i = 0; i < alllist.size(); i++) {
if (gbx-1==alllist.get(i).getX()&&gby-1==alllist.get(i).getY()) {
isHave=true;
break;
}
}
if (isHave==false) {
piece=new Piece(gbx-1, gby-1, true);
heilist.add(piece);
alllist.add(piece);
isBlack=false;
//计算胜负的方法
isFaild=this.isWin(piece,heilist);
break;
}
}else {
piece=new Piece(gbx-1, gby-1, true);
heilist.add(piece);
alllist.add(piece);
isBlack=false;
break;
}
break;
}
}
//刷新视图
repaint();
}
/**
*
* @Title: isWin
* @Description:查询棋子,判断是否有五个棋子形成连子
* @param @param piece 最新棋子
* @param @return 设定文件
* @return boolean 连子数达到5 则游戏结束,
* @throws
*/
public boolean isWin(Piece piece, List lists){
//判断查找那个数组
List list=lists; //转存集合
boolean isOver=false;
//循环查询
//横向
for (int i = 1; i < 6; i++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getY()==piece.getY()) {
//向前
if (list.get(j).getX()+(i*30)==piece.getX()) {
conSize++;
}
if (list.get(j).getX()-(i*30)==piece.getX()) {
conSize++;
}
}
}
if (conSize==5) {
isOver=true;
break;
}
if (i==5&&conSize!=5) {
isOver=false;
conSize=1;
}
}
//纵向
if (isOver==false) {
for (int k = 1; k < 6; k++) {
for (int k2 = 0; k2 < list.size(); k2++) {
//纵向
if (list.get(k2).getX()==piece.getX()) {
if (list.get(k2).getY()+(k*30)==piece.getY()) {
conSize++;
}
if (list.get(k2).getY()-(k*30)==piece.getY()) {
conSize++;
}
}
}
if (conSize==5){
isOver=true;
System.out.println("isOver="+isOver);
break;
}
if (k==5&&conSize!=5) {
isOver=false;
conSize=1;
}
}
//左斜
for (int k = 1; k < 6; k++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getX()+(k*30)==piece.getX()&&list.get(j).getY()+(k*30)==piece.getY()) {
conSize++;
}
if (list.get(j).getX()-(k*30)==piece.getX()&&list.get(j).getY()-(k*30)==piece.getY()) {
conSize++;
}
}
if (conSize==5){
isOver=true;
break;
}
if (k==5&&conSize!=5) {
isOver=false;
conSize=1;
}
}
//右斜
for (int k = 1; k < 6; k++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getX()+(k*30)==piece.getX()&&list.get(j).getY()-(k*30)==piece.getY()) {
conSize++;
}
if (list.get(j).getX()-(k*30)==piece.getX()&&list.get(j).getY()+(k*30)==piece.getY()) {
conSize++;
}
}
if (conSize==5){
isOver=true;
break;
}
if (k==5&&conSize!=5) {
isOver=false;
conSize=1;
}
}
}
return isOver;
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
下面是我五子棋的源码+资源+可直接运行的jar包的下载连接
http://download.csdn.net/download/yzf11/10153492 本来为了方便给为下载,想要设置为零分的,但是由于用户无法更改下载分,而且最低分有是两分,所以这里很抱歉无法设置为零分下载,
游戏操作方式: 白子通过A S D W,来控制落子位置,通过E键落子,
黑子通过 上 下 左 右 方向键来控制落子的位置,通过按键 L 实现落子
游戏默认 黑子 先行
游戏运行效果图和资源图片