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

来源:互联网 发布:设有数组定义 编辑:程序博客网 时间:2024/04/30 06:34

最近谢了几个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;}@Overridepublic 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<Piece> heilist=new ArrayList<Piece>();//黑子集合private List<Piece> bailist=new ArrayList<Piece>();//白子集合private List<Piece> alllist=new ArrayList<Piece>();//所有集合//绘制线条 坐标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:按键监听的方法  */@Overridepublic 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<Piece> lists){//判断查找那个数组List<Piece> 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;}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}}

整个小案例实现的功能不全,不喜勿喷,对您有帮助的话希望能给我点个赞或者给个评论,谢谢您的支持

下面是我五子棋的源码+资源+可直接运行的jar包的下载连接

http://download.csdn.net/download/yzf11/10153492    本来为了方便给为下载,想要设置为零分的,但是由于用户无法更改下载分,而且最低分有是两分,所以这里很抱歉无法设置为零分下载,


游戏操作方式:  白子通过A S D W,来控制落子位置,通过E键落子,

黑子通过 上 下 左 右 方向键来控制落子的位置,通过按键 L 实现落子

游戏默认   黑子   先行


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