五子棋

五子棋

package com.scorpionhermit;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);//绘制网格颜色  * @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(); } } 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 } }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 一、知识准备 swing组件完成图形用户界面,窗体 JFrame创建窗体,是swing中基础的类之一 public...
    印奕阅读 215评论 0 0
  • 直接上图,看结果,很简洁,一个棋盘和若干的黑白子。 首先我们要建立我们的棋盘和棋子,这就需要我们自己建立我们的棋盘...
    猪_队友阅读 1,013评论 5 3
  • 资源准备: 资源准备好之后就创建一个Plane,把他放在相机的下面,成为相机的子物体,再创建4个空物体作为锚点 下...
    小鲸鱼的U3d之旅阅读 844评论 0 0
  • 为了帮助初学者理解,注释非常详细,希望对初学者有所启发! 转自:http://www.xxcxw.cn/forum...
    程小厮阅读 644评论 0 0
  • #include #include #include<conio.h> #include #define MAXI...
    Sucifer阅读 368评论 0 1