java小游戏-双人五子棋小案例

最近谢了几个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 实现落子

游戏默认   黑子   先行


游戏运行效果图和资源图片














你可能感兴趣的:(原理)