五子棋,是我们大家都喜爱玩的智力棋类游戏,在学完了界面以及绘图之后便一直想做一个,如今终于如愿以偿,虽然还没有更好的美化该游戏,但是大局已定。高兴!
五子棋我们需要很多常量,比如说棋子的大小,棋盘格子的间距,棋盘行列的其实位置。所以我们需要首先定义一个借口来存储这些常量,以便我们能更好的使用它,以及更快捷的改变其值的大小。
package com.czh130708; public interface Config { public static final int x=45; public static final int y=45;//x,y的起始位置 public static final int row=15; public static final int columns=15; public static final int csize=30; public static final int size=45; public static final int[][] chess = new int[row][columns]; }
其次我们要定义一个棋盘界面,该界面类继承了JFrame。在该类中我们获取了画布,实例化了鼠标事件对象。重写了paint方法,并在该方法中调用了画棋盘的方法,以及棋子和棋盘的重绘方法。
package com.czh130708; import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; public class MyDraw extends JFrame{ Graphics g; public static void main(String [] args){ MyDraw dl = new MyDraw(); dl.initUI(); } private void initUI() { this.setName("五子棋"); this.setSize(1100,730);//设置窗口大小 this.setDefaultCloseOperation(3); this.setLocation(00,00);//设置窗口位置 this.setVisible(true); this.g=this.getGraphics(); ChessL cl=new ChessL(g); this.addMouseListener(cl); } public void paint(Graphics g){ //调用父类的重绘方法 super.paint(g); drawChessTable(g); draw(g); } public void drawChessTable(Graphics g){ //绘制棋盘 super.paint(g); //绘制15条横线 for(int i=0;i<Config.row;i++) g.drawLine(Config.x, Config.y+Config.size*i,Config.row*Config.size,Config.y+Config.size*i); //绘制15条竖线 for(int j=0;j<Config.columns;j++) g.drawLine(Config.x+Config.size*j, Config.y,Config.x+Config.size*j,Config.columns*Config.size); } //棋子重绘的方法 public void draw(Graphics g){ for(int i=0;i<Config.chess.length;i++){ //数组的每一个元素其实是一个一维数组 for(int j=0;j<Config.chess[i].length;j++){ if(Config.chess[i][j]==1){ //如果是黑子,就为1 g.setColor(Color.black); g.fillOval(Config.x+Config.size*i-Config.size/2, Config.y+Config.size*j-Config.size/2, Config.size, Config.size); }else if(Config.chess[i][j]==-1){ //如果是白子,就是-1 g.setColor(Color.WHITE); g.fillOval(Config.x+Config.size*i-Config.size/2, Config.y+Config.size*j-Config.size/2, Config.size, Config.size); } } } } }
五子棋游戏的重中之重我觉得就是两个人交互下棋的方法定义。
首先我们要获得鼠标事件发生时,所得到的位置,并循环遍历棋盘,得到该位置最接近的横纵直线的焦点位置,并在该位置上画上一颗棋子。
当下第二颗棋子时,颜色不能与上一颗一样,并且切记已经下过棋子的地方不能再次下棋,所以我们需要一个数组来记住所有下过棋子的地方,并且给该位置设置一个权值,该权值会记住该位置下的是黑棋还是白旗。
判定胜负方式也是重点。因为我们需要判断横向斜向纵向每一条线上是否有五颗棋子相连,若有五颗棋子相连则提示胜出!
在棋子重绘的方法中我们也会用到数组。
五子棋的代码实现如下!
package com.czh130708; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JOptionPane; public class ChessL extends MouseAdapter { private Graphics g; private int c=0;//计数器 public ChessL(Graphics g) { this.g=g; } //定义一个鼠标监听器 public void mouseReleased(MouseEvent e){ int x1 = e.getX(); int y1 = e.getY(); for(int i=0;i<Config.columns;i++){ for(int j=0;j<Config.row;j++){ if(Config.chess[i][j] == 0){ int x=Config.x+Config.size*i;//横坐标 int y=Config.y+Config.size*j;//纵坐标 //与圆心的误差为三分之一size/3 if(x1>x-Config.size/3 && x1 < x+Config.size/3 && y1>y-Config.size/3 && y1<y+Config.size/3){ if(c == 0){ Config.chess[i][j]=1;//如果是黑子,就为1 g.setColor(Color.black); c++; }else{ Config.chess[i][j]=-1;//如果是白子,就是-1 g.setColor(Color.WHITE); c--; } //以交叉点为圆心画圆 g.fillOval(x-Config.size/2, y-Config.size/2, Config.size, Config.size); this.checkrow(i,j); this.checkcolumns(i,j); this.checkrowc(i,j); this.checkrcolumns(i,j); } } } } } //检查横向是否有五子相连向右 public int checkrow(int x,int y){ int count=0; for(int i=x;i<Config.row;i++){ if(Config.chess[i][y]==Config.chess[x][y]){ count++; } else{ break; } } //向左 for(int i=x-1;i>=0;i--){ if(Config.chess[i][y]==Config.chess[x][y]){ count++; } else{ break; } } if(count>=5){ JOptionPane.showMessageDialog(null, "大神,你胜利了"); } return count; } //检查纵向是否有五子相连 public int checkcolumns(int x,int y){ int count=0; for(int i=y;i<Config.columns;i++){ if(Config.chess[x][i]==Config.chess[x][y]){ count++; } else{ break; } } for(int i=y-1;i>=0;i--){ if(Config.chess[x][i]==Config.chess[x][y]){ count++; } else{ break; } } if(count>=5){ JOptionPane.showMessageDialog(null, "大神,你胜利了"); } return count; } //斜向方向是否有棋子 public int checkrowc(int x,int y){ int count=0; for(int i=x,j=y;i<Config.row&&j<Config.columns;i++,j++){ if(Config.chess[x][y]==Config.chess[i][j]){ count++; } else{ break; }} for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--){ if(Config.chess[x][y]==Config.chess[i][j]){ count++; } else{ break; }} if(count>=5){ JOptionPane.showMessageDialog(null, "大神,你胜利了"); } return count; } public int checkrcolumns(int x,int y){ int count=0; for(int i=x,j=y;i<Config.row&&j>=0;i++,j--){ if(Config.chess[x][y]==Config.chess[i][j]){ count++;} else{ break; }} for(int i=x-1,j=y+1;i>=0&&j<Config.columns;i--,j++){ if(Config.chess[x][y]==Config.chess[i][j]){ count++; } else{ break; }} if(count>=5){ JOptionPane.showMessageDialog(null, "大神,你胜利了"); } return count; } }
相关推荐
java五子棋的实现,适合学生的课程设计,希望能够帮到大家,实现人机对战,和人人对战功能模式,有时间统计
java做的五子棋,非常不错!总共三个还有算法!
用Java实现的五子棋的对战小游戏,实现了人人网络对战,人机对战,拥有界面,在使用的时候记得将src下面的所有素材放到bin目录下方可正常运行,导入Eclipse即可运行。
本人亲自编写,经老师检查,成绩A+ 由于老师要求交程序实验报告手写板,所以没有做电子版。
NULL 博文链接:https://hafuokas.iteye.com/blog/1836195
很好玩的小游戏,代码清晰明了,希望对大家能够有所帮助
帮同学做的,没有第一次发的功能强 由于老师要求交程序实验报告手写板,所以没有做电子版。
五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。 棋具与围棋通用,...
主要介绍了Java编程实现五子棋人人对战代码示例,具有一定借鉴价值,需要的朋友可以参考下。
五子棋,人人对战,可重置游戏, 代码是相当的简单,适合初学者阅读吧
用java开发的五子棋,使用了java的awt和swing,其中没有AI,粗略的看了网上的AI算法,看的头都大了。
人人对战的五子棋,比较简单的程序。希望大家看看
本程序是用java语言开发的,功能有开始,重开,悔棋等,有计时功能,并且可以设置计时的时间限制。界面美观,按钮排列整齐
基于java实现的五子棋,可以实现人机对战,人人对战两种模式
这是一个五子棋小代码,只有人人对战,没有智能.
主要是一个五子棋游戏,利用java swing技术编写,总共只有一个类,两个内部类。人机对战
用java写的可视化五子棋,背景和棋子都是一张图片,用到了java1.5以后的双缓冲技术,实现人人对战,最简单的实现算法!
java写的五子棋小程序,界面优美,人机对战,人人对战。
本源码文件包是一个基于Java的五子棋手机网络对战游戏的设计与实现,适用于毕业设计或课程设计。该游戏采用了客户端-服务器架构,实现了多人在线对战功能。游戏中,玩家可以选择人机对战或人人对战模式,实时与对手...
这是我花了两天写的一个java程序,界面的处理是运用了Graphics绘图的方法,为了让显示更流畅,采用了双缓冲技术,功能的实现有两种模式,一种是人人对战,一种是人机对战 希望这个程序能对新手的学习起到一定的帮助 ...