欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java五子棋單機(jī)版源碼分享

 更新時(shí)間:2018年03月27日 10:11:44   作者:ScorpionHermit  
這篇文章主要為大家分享了Java五子棋單機(jī)版源碼,JavaGUI編寫單機(jī)版五子棋,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

初學(xué)JavaGUI編程,就寫了一個(gè)小游戲–五子棋。

目前只實(shí)現(xiàn)了單機(jī)版,任何事情都是從簡(jiǎn)制作的,有問(wèn)題請(qǐng)大牛們不吝指教啊。

此處的棋盤和棋子都未用圖片,全部都是使用Java中的Graphics畫出來(lái)的。

源碼已提交至GitHub,點(diǎn)擊此處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; //用來(lái)判斷白旗還是黑棋
 int whiteCount, blackCount; //計(jì)算悔棋步數(shù)
 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; //垂直線的長(zhǎng)度
 int hline = height + py; //水平線的長(zhǎng)度

 /**
  * 構(gòu)造方法
  */
 public FiveInARow() {
  super("單機(jī)版五子棋");
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關(guān)閉按鈕
  Container con = this.getContentPane();
  con.setLayout(new BorderLayout());
  this.addMouseListener(this);//添加監(jiān)聽(tīng)
  this.setSize(600, 600);//設(shè)置窗體大小
  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);//繪制網(wǎng)格顏色
  g.drawRect(px, py, width, height);//網(wǎng)格大小
  g.drawString("單機(jī)版五子棋小游戲,右擊可以悔棋,歡迎使用", 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("已經(jīng)有棋了!");
    } 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("鼠標(biāo)右擊--悔棋");
   if (v.isEmpty()) {
    JOptionPane.showMessageDialog(this, "沒(méi)有棋可悔");
   } else {
    if (v.size() % 2 == 0) { //判斷是白棋悔棋,還是黑棋悔棋
     blackCount++;
     if (blackCount > 3) {
      JOptionPane.showMessageDialog(this, "黑棋已經(jīng)悔了3步");
     } else {
      v.remove(v.lastElement());
      this.repaint();
     }
    } else {
     whiteCount++;
     if (whiteCount > 3) {
      JOptionPane.showMessageDialog(this, "白棋已經(jīng)悔了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; //垂直方向棋子數(shù)量
  int ch = 0; //水平方向棋子數(shù)量
  int ci1 = 0; //斜面方向棋子數(shù)量1
  int ci2 = 0; //斜面方向棋子數(shù)量2

  //計(jì)算水平方向棋子數(shù)量
  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;
   }
  }

  //計(jì)算垂直方向棋子數(shù)量
  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;
   }
  }

  //計(jì)算45°斜面方向棋子數(shù)量
  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;
   }
  }

  //計(jì)算135°斜面方向棋子數(shù)量
  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:打算再寫個(gè)網(wǎng)絡(luò)版的五子棋,可惜對(duì)Java中網(wǎng)絡(luò)不太清楚,得學(xué)習(xí)一段時(shí)間后再繼續(xù)完成了,檢驗(yàn)下個(gè)人學(xué)習(xí)成果。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法

    springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法

    這篇文章主要介紹了springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Java?Lambda表達(dá)式語(yǔ)法及用法示例

    Java?Lambda表達(dá)式語(yǔ)法及用法示例

    這篇文章主要給大家介紹了關(guān)于Java?Lambda表達(dá)式語(yǔ)法及用法的相關(guān)資料,lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的"函數(shù)式編程",文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • java編寫汽車租賃系統(tǒng)

    java編寫汽車租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java編寫汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • MyBatis查詢、新增、更新與刪除操作指南

    MyBatis查詢、新增、更新與刪除操作指南

    這篇文章主要給大家介紹了關(guān)于MyBatis查詢、新增、更新與刪除操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 分布式調(diào)度XXL-Job整合Springboot2.X實(shí)戰(zhàn)操作過(guò)程(推薦)

    分布式調(diào)度XXL-Job整合Springboot2.X實(shí)戰(zhàn)操作過(guò)程(推薦)

    這篇文章主要介紹了分布式調(diào)度XXL-Job整合Springboot2.X實(shí)戰(zhàn)操作,包括定時(shí)任務(wù)的使用場(chǎng)景和常見(jiàn)的定時(shí)任務(wù),通過(guò)本文學(xué)習(xí)幫助大家該選擇哪個(gè)分布式任務(wù)調(diào)度平臺(tái),對(duì)此文感興趣的朋友一起看看吧
    2022-04-04
  • 常見(jiàn)的java面試題

    常見(jiàn)的java面試題

    這篇文章主要為大家詳細(xì)介紹了常見(jiàn)的java面試題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)

    java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于java中List去除重復(fù)數(shù)據(jù)的5種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • JAVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例

    JAVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例

    下面小編就為大家?guī)?lái)一篇JAVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起 小編過(guò)來(lái)看看吧
    2016-11-11
  • SpringBoot中整合Minio文件存儲(chǔ)的安裝部署過(guò)程

    SpringBoot中整合Minio文件存儲(chǔ)的安裝部署過(guò)程

    這篇文章主要介紹了SpringBoot整合Minio文件存儲(chǔ)的相關(guān)知識(shí),詳細(xì)介紹了Minio安裝部署過(guò)程,需要的朋友可以參考下
    2022-04-04
  • Java安全-ClassLoader

    Java安全-ClassLoader

    這篇文章主要介紹了Java安全ClassLoader,Java類初始化的時(shí)候會(huì)調(diào)用java.lang.ClassLoader加載字節(jié)碼,ClassLoader就是用來(lái)動(dòng)態(tài)加載class文件到內(nèi)存當(dāng)中用的,下面詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01

最新評(píng)論