Java五子棋单机版源码分享
初学JavaGUI编程,就写了一个小游戏–五子棋。
目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊。
此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的。
源码已提交至GitHub,点击此处GitHub源码
以下列出其中的五子棋类:
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Container;
importjava.awt.Graphics;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.util.Vector;
importjavax.swing.JFrame;
importjavax.swing.JOptionPane;
publicclassFiveInARowextendsJFrameimplementsMouseListener{
Vectorv=newVector();//所有的每步走棋信息
Vectorwhite=newVector();//白方走棋信息
Vectorblack=newVector();//黑方走棋信息
booleanb;//用来判断白旗还是黑棋
intwhiteCount,blackCount;//计算悔棋步数
intw=25;//间距大小
intpx=100,py=100;//棋盘的大小
intpxw=px+w,pyw=py+w;
intwidth=w*16,height=w*16;
intvline=width+px;//垂直线的长度
inthline=height+py;//水平线的长度
/**
*构造方法
*/
publicFiveInARow(){
super("单机版五子棋");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮
Containercon=this.getContentPane();
con.setLayout(newBorderLayout());
this.addMouseListener(this);//添加监听
this.setSize(600,600);//设置窗体大小
this.setBackground(Color.orange);
this.setVisible(true);
}
/**
*画棋盘和棋子
*@parame
*/
publicvoidpaint(Graphicsg){
g.clearRect(0,0,this.getWidth(),this.getHeight());//清除画板
g.setColor(Color.BLACK);//绘制网格颜色
g.drawRect(px,py,width,height);//网格大小
g.drawString("单机版五子棋小游戏,右击可以悔棋,欢迎使用",180,70);
for(inti=0;i<15;i++){
g.drawLine(pxw+i*w,py,pxw+i*w,hline);//每条横线和竖线
g.drawLine(px,pyw+i*w,vline,pyw+i*w);
}
for(intx=0;xw/2?w:0);
y=(y-y%w)+(y%w>w/2?w:0);
x=(x-px)/w;
y=(y-py)/w;
if(x>=0&&y>=0&&x<=16&&y<=16){
if(v.contains(x+"-"+y)){
System.out.println("已经有棋了!");
}else{
v.add(x+"-"+y);
this.repaint();
if(v.size()%2==0){
black.add(x+"-"+y);
this.victory(x,y,black);
//System.out.println("黑棋");
}else{
white.add(x+"-"+y);
this.victory(x,y,white);
//System.out.println("白棋");
}
//System.out.println(e.getX()+"-"+e.getY());
}
}else{
//System.out.println(e.getX()+"-"+e.getY()+"|"+x+"-"+y+"\t超出边界了");
}
}
if(e.getButton()==e.BUTTON3){//右击悔棋的方法
//System.out.println("鼠标右击--悔棋");
if(v.isEmpty()){
JOptionPane.showMessageDialog(this,"没有棋可悔");
}else{
if(v.size()%2==0){//判断是白棋悔棋,还是黑棋悔棋
blackCount++;
if(blackCount>3){
JOptionPane.showMessageDialog(this,"黑棋已经悔了3步");
}else{
v.remove(v.lastElement());
this.repaint();
}
}else{
whiteCount++;
if(whiteCount>3){
JOptionPane.showMessageDialog(this,"白棋已经悔了3步");
}else{
v.remove(v.lastElement());
this.repaint();
}
}
}
}
}
/**
*判断胜利的方法
*@paramx
*@paramy
*@paramcontain
*/
privatevoidvictory(intx,inty,Vectorcontain){
intcv=0;//垂直方向棋子数量
intch=0;//水平方向棋子数量
intci1=0;//斜面方向棋子数量1
intci2=0;//斜面方向棋子数量2
//计算水平方向棋子数量
for(inti=1;i<5;i++){
if(contain.contains((x+i)+"-"+y)){
ch++;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(contain.contains((x-i)+"-"+y)){
ch++;
}else{
break;
}
}
//计算垂直方向棋子数量
for(inti=1;i<5;i++){
if(contain.contains(x+"-"+(y+i))){
cv++;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(contain.contains(x+"-"+(y-i))){
cv++;
}else{
break;
}
}
//计算45°斜面方向棋子数量
for(inti=1;i<5;i++){
if(contain.contains((x+i)+"-"+(y+i))){
ci1++;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(contain.contains((x-i)+"-"+(y-i))){
ci1++;
}else{
break;
}
}
//计算135°斜面方向棋子数量
for(inti=1;i<5;i++){
if(contain.contains((x+i)+"-"+(y-i))){
ci2++;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(contain.contains((x-i)+"-"+(y+i))){
ci2++;
}else{
break;
}
}
if(ch>=4||cv>=4||ci1>=4||ci2>=4){
System.out.println(v.size()+"步棋");
if(v.size()%2==0){
//判断是黑棋赢,还是白棋赢
JOptionPane.showMessageDialog(null,"黑棋赢了");
}else{
JOptionPane.showMessageDialog(null,"白棋赢了");
}
this.v.clear();
this.black.clear();
this.white.clear();
this.repaint();
}
}
@Override
publicvoidmouseEntered(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseExited(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmousePressed(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseReleased(MouseEvente){
//TODOAuto-generatedmethodstub
}
}
PS:打算再写个网络版的五子棋,可惜对Java中网络不太清楚,得学习一段时间后再继续完成了,检验下个人学习成果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。