Java五子棋单机版源码分享
程序员文章站
2024-01-04 11:54:04
初学javagui编程,就写了一个小游戏–五子棋。
目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊。
此处的棋盘和棋子都未用图片,全部都是使用...
初学javagui编程,就写了一个小游戏–五子棋。
目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊。
此处的棋盘和棋子都未用图片,全部都是使用java中的graphics画出来的。
源码已提交至github,点击此处github源码
以下列出其中的五子棋类:
import java.awt.borderlayout; import java.awt.color; import java.awt.container; import java.awt.graphics; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.util.vector; import javax.swing.jframe; import javax.swing.joptionpane; public class fiveinarow extends jframe implements mouselistener { vector v = new vector(); //所有的每步走棋信息 vector white = new vector(); //白方走棋信息 vector black = new vector(); //黑方走棋信息 boolean b; //用来判断白旗还是黑棋 int whitecount, blackcount; //计算悔棋步数 int w = 25; //间距大小 int px = 100, py = 100; //棋盘的大小 int pxw = px + w, pyw = py + w; int width = w * 16, height = w * 16; int vline = width + px; //垂直线的长度 int hline = height + py; //水平线的长度 /** * 构造方法 */ public fiveinarow() { super("单机版五子棋"); this.setdefaultcloseoperation(jframe.exit_on_close);//关闭按钮 container con = this.getcontentpane(); con.setlayout(new borderlayout()); this.addmouselistener(this);//添加监听 this.setsize(600, 600);//设置窗体大小 this.setbackground(color.orange); this.setvisible(true); } /** * 画棋盘和棋子 * @param e */ public void paint(graphics g) { g.clearrect(0, 0, this.getwidth(), this.getheight());//清除画板 g.setcolor(color.black);//绘制网格颜色 g.drawrect(px, py, width, height);//网格大小 g.drawstring("单机版五子棋小游戏,右击可以悔棋,欢迎使用", 180, 70); for (int i=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 (int x=0; x<v.size(); x++) { string str = (string)v.get(x); string tmp[] = str.split("-"); int a = integer.parseint(tmp[0]); int b = integer.parseint(tmp[1]); a = a * w + px; b = b * w + py; if (x%2 == 0) { g.setcolor(color.white); } else { g.setcolor(color.black); } g.fillarc(a-w/2, b-w/2, w, w, 0, 360); } } @override public void mouseclicked(mouseevent e) { if (e.getbutton() == e.button1) { int x = e.getx(); int y = e.gety(); x = (x - x % w) + (x % w > w / 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(); } } } } } /** * 判断胜利的方法 * @param x * @param y * @param contain */ private void victory(int x, int y, vector contain) { int cv = 0; //垂直方向棋子数量 int ch = 0; //水平方向棋子数量 int ci1 = 0; //斜面方向棋子数量1 int ci2 = 0; //斜面方向棋子数量2 //计算水平方向棋子数量 for (int i=1; i<5; i++) { if (contain.contains((x+i)+"-"+y)) { ch++; } else { break; } } for (int i=1; i<5; i++) { if (contain.contains((x-i)+"-"+y)) { ch++; } else { break; } } //计算垂直方向棋子数量 for (int i=1; i<5; i++) { if (contain.contains(x+"-"+(y+i))) { cv++; } else { break; } } for (int i=1; i<5; i++) { if (contain.contains(x+"-"+(y-i))) { cv++; } else { break; } } //计算45°斜面方向棋子数量 for (int i=1; i<5; i++) { if (contain.contains((x+i)+"-"+(y+i))) { ci1++; } else { break; } } for (int i=1; i<5; i++) { if (contain.contains((x-i)+"-"+(y-i))) { ci1++; } else { break; } } //计算135°斜面方向棋子数量 for (int i=1; i<5; i++) { if (contain.contains((x+i)+"-"+(y-i))) { ci2++; } else { break; } } for (int i=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 public void mouseentered(mouseevent e) { // todo auto-generated method stub } @override public void mouseexited(mouseevent e) { // todo auto-generated method stub } @override public void mousepressed(mouseevent e) { // todo auto-generated method stub } @override public void mousereleased(mouseevent e) { // todo auto-generated method stub } }
ps:打算再写个网络版的五子棋,可惜对java中网络不太清楚,得学习一段时间后再继续完成了,检验下个人学习成果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。