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中网络不太清楚,得学习一段时间后再继续完成了,检验下个人学习成果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。