最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)五子棋游戲的完整代碼

 更新時間:2020年10月15日 16:44:20   作者:曉時谷雨  
這篇文章主要為大家詳細介紹了Java實現(xiàn)五子棋游戲的完整代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

用Java編寫簡單的五子棋,供大家參考,具體內(nèi)容如下

前言

這兩天在空閑時間做了個五子棋項目,分享給大家看一下,界面是這樣的:

界面很丑我知道,本人雖有幾年P(guān)S基礎(chǔ),但知識淺薄,審美觀不盡人意,做到如此實屬極限(其實我懶得做了),大家將就著看看吧。

下面放出代碼,為方便大家參考,我?guī)缀趺織l代碼都標(biāo)有注釋。   

測試類代碼

public class Test {
 public static void main(String[] args) {
 MyJFrame mj=new MyJFrame();
 mj.myJFrame();
 }
}

MyJFrame類代碼

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class MyJFrame extends JFrame implements MouseListener {
 int qx = 20, qy = 40, qw = 490, qh = 490;//棋盤位置、寬高
 int bw = 150, bh = 50, bx = 570, by = 150;//按鈕寬高、位置
 int x = 0, y = 0;//保存棋子坐標(biāo)
 int[][] SaveGame = new int[15][15];//保存每個棋子
 int qc = 1;//記錄白棋=2,黑棋=1
 int qn = 0;//判斷棋子是否重復(fù)
 boolean canplay = true;//判斷游戲是否開始和結(jié)束
 String go = "黑子先行";//游戲信息


 //---------------------------------------------------------------------------------------------------------------------
 //窗體
 public void myJFrame() {

 this.setTitle("五子棋"); //標(biāo)題
 this.setSize(800, 550); //窗口大小
 this.setResizable(false); //窗口是否可以改變大小=否
 this.setDefaultCloseOperation(MyJFrame.EXIT_ON_CLOSE);//窗口關(guān)閉方式為關(guān)閉窗口同時結(jié)束程序

 int width = Toolkit.getDefaultToolkit().getScreenSize().width;//獲取屏幕寬度
 int height = Toolkit.getDefaultToolkit().getScreenSize().height;//獲取屏幕高度
// System.out.println("寬度:"+width);//測試
// System.out.println("高度:"+height);//測試

 this.setLocation((width - 800) / 2, (height - 600) / 2); //設(shè)置窗口默認位置以屏幕居中

 this.addMouseListener(this);

 this.setVisible(true); //窗口是否顯示=是
 }


 //---------------------------------------------------------------------------------------------------------------------
 //覆寫paint方法,繪制界面
 public void paint(Graphics g) {

 //雙緩沖技術(shù)防止屏幕閃爍
 BufferedImage bi = new BufferedImage(800, 550, BufferedImage.TYPE_INT_ARGB);
 Graphics g2 = bi.createGraphics();

 //獲取圖片路徑
 BufferedImage image = null;
 try {
  image = ImageIO.read(new File("D:/#Java/五子棋/tp/wzqbj.jpg"));
 } catch (IOException e) {
  e.printStackTrace();
 }
 g2.drawImage(image, 10, 10, this);//顯示圖片

 g2.setColor(Color.BLACK);//設(shè)置畫筆顏色
 g2.setFont(new Font("華文行楷", 10, 50));//設(shè)置字體
 g2.drawString("曉時五子棋", 525, 100);//繪制字符

 //棋盤
 g2.setColor(Color.getHSBColor(30, (float) 0.10, (float) 0.90));//設(shè)置畫筆顏色
 g2.fillRect(qx, qy, qw, qh);//繪制棋盤背景矩形

 //開始按鈕
 g2.setColor(Color.WHITE);//設(shè)置畫筆顏色
 g2.fillRect(bx, by, bw, bh);//繪制開始按鈕
 g2.setFont(new Font("華文行楷", 10, 30));//設(shè)置字體
 g2.setColor(Color.black);//設(shè)置畫筆顏色
 g2.drawString("開始", 615, 185);//繪制字符

 //悔棋按鈕
 g2.setColor(Color.LIGHT_GRAY);//設(shè)置畫筆顏色
 g2.fillRect(bx, by + 60, bw, bh);//繪制悔棋按鈕
 g2.setFont(new Font("華文行楷", 10, 30));//設(shè)置字體
 g2.setColor(Color.WHITE);//設(shè)置畫筆顏色
 g2.drawString("悔棋", 615, 245);//繪制字符

 //認輸按鈕
 g2.setColor(Color.GRAY);//設(shè)置畫筆顏色
 g2.fillRect(bx, by + 120, bw, bh);//繪制認輸按鈕
 g2.setFont(new Font("華文行楷", 10, 30));//設(shè)置字體
 g2.setColor(Color.WHITE);//設(shè)置畫筆顏色
 g2.drawString("認輸", 615, 305);//繪制字符

 //游戲信息欄
 g2.setColor(Color.getHSBColor(30, (float) 0.10, (float) 0.90));//設(shè)置畫筆顏色
 g2.fillRect(550, 350, 200, 150);//繪制游戲狀態(tài)區(qū)域
 g2.setColor(Color.black);//設(shè)置畫筆顏色
 g2.setFont(new Font("黑體", 10, 20));//設(shè)置字體
 g2.drawString("游戲信息", 610, 380);//繪制字符
 g2.drawString(go, 610, 410);//繪制字符
 g2.drawString("作者:曉時谷雨", 560, 440);//繪制字符
 g2.drawString("聯(lián)系方式:", 560, 465);//繪制字符
 g2.drawString("qq 717535996", 560, 490);//繪制字符


 g2.setColor(Color.BLACK);//設(shè)置畫筆顏色

 //繪制棋盤格線
 for (int x = 0; x <= qw; x += 35) {
  g2.drawLine(qx, x + qy, qw + qx, x + qy);//繪制一條橫線
  g2.drawLine(x + qx, qy, x + qx, qh + qy);//繪制一條豎線
 }

 //繪制標(biāo)注點
 for (int i = 3; i <= 11; i += 4) {
  for (int y = 3; y <= 11; y += 4) {
  g2.fillOval(35 * i + qx - 3, 35 * y + qy - 3, 6, 6);//繪制實心圓
  }
 }


 //繪制棋子
 for (int i = 0; i < 15; i++) {
  for (int j = 0; j < 15; j++) {
  if (SaveGame[i][j] == 1)//黑子
  {
   int sx = i * 35 + qx;
   int sy = j * 35 + qy;
   g2.setColor(Color.BLACK);
   g2.fillOval(sx - 13, sy - 13, 26, 26);//繪制實心圓
  }
  if (SaveGame[i][j] == 2)//白子
  {
   int sx = i * 35 + qx;
   int sy = j * 35 + qy;
   g2.setColor(Color.WHITE);
   g2.fillOval(sx - 13, sy - 13, 26, 26);//繪制實心圓
   g2.setColor(Color.BLACK);
   g2.drawOval(sx - 13, sy - 13, 26, 26);//繪制空心圓
  }
  }
 }
 g.drawImage(bi, 0, 0, this);


// g.drawRect(20, 20, 20, 20);//繪制空心矩形
 }


 //---------------------------------------------------------------------------------------------------------------------
 //判斷輸贏
 private boolean WinLose() {
 boolean flag = false;//輸贏
 int count = 1;//相連數(shù)
 int color = SaveGame[x][y];//記錄棋子顏色

 //判斷橫向棋子是否相連
 int i = 1;//迭代數(shù)
 while (color == SaveGame[x + i][y]) {
  count++;
  i++;
 }
 i = 1;//迭代數(shù)
 while (color == SaveGame[x - i][y]) {
  count++;
  i++;
 }
 if (count >= 5) {
  flag = true;
 }

 //判斷縱向棋子是否相連
 count = 1;
 i = 1;//迭代數(shù)
 while (color == SaveGame[x][y + i]) {
  count++;
  i++;
 }
 i = 1;//迭代數(shù)
 while (color == SaveGame[x][y - i]) {
  count++;
  i++;
 }
 if (count >= 5) {
  flag = true;
 }

 //判斷斜向棋子是否相連(左上右下)
 count = 1;
 i = 1;//迭代數(shù)
 while (color == SaveGame[x - i][y - i]) {
  count++;
  i++;
 }
 i = 1;//迭代數(shù)
 while (color == SaveGame[x + i][y + i]) {
  count++;
  i++;
 }
 if (count >= 5) {
  flag = true;
 }

 //判斷斜向棋子是否相連(左下右上)
 count = 1;
 i = 1;//迭代數(shù)
 while (color == SaveGame[x + i][y - i]) {
  count++;
  i++;
 }
 i = 1;//迭代數(shù)
 while (color == SaveGame[x - i][y + i]) {
  count++;
  i++;
 }
 if (count >= 5) {
  flag = true;
 }

 return flag;
 }


 //---------------------------------------------------------------------------------------------------------------------
 //初始化游戲
 public void Initialize() {
 //遍歷并初始化數(shù)組
 for (int i = 0; i < 15; i++) {
  for (int j = 0; j < 15; j++) {
  SaveGame[i][j] = 0;
  }
 }

 //黑子先行
 qc = 1;
 go = "輪到黑子";
 }


 //---------------------------------------------------------------------------------------------------------------------
 @Override//鼠標(biāo)點擊
 public void mouseClicked(MouseEvent e) {

 }

 @Override//鼠標(biāo)按下
 public void mousePressed(MouseEvent e) {

 //獲取鼠標(biāo)點擊位置
 x = e.getX();
 y = e.getY();


 //判斷是否已開始游戲
 if (canplay == true) {
  //判斷點擊是否為棋盤內(nèi)
  if (x > qx && x < qx + qw && y > qy && y < qy + qh) {
  //計算點擊位置最近的點
  if ((x - qx) % 35 > 17) {
   x = (x - qx) / 35 + 1;
  } else {
   x = (x - qx) / 35;
  }
  if ((y - qy) % 35 > 17) {
   y = (y - qy) / 35 + 1;
  } else {
   y = (y - qy) / 35;
  }

  //判斷當(dāng)前位置有沒有棋子
  if (SaveGame[x][y] == 0) {
   SaveGame[x][y] = qc;
   qn = 0;
  } else {
   qn = 1;
  }

  //切換棋子
  if (qn == 0) {
   if (qc == 1) {
   qc = 2;
   go = "輪到白子";
   } else {
   qc = 1;
   go = "輪到黑子";
   }
  }

  this.repaint();//重新執(zhí)行一次paint方法

  //彈出勝利對話框
  boolean wl = this.WinLose();
  if (wl) {
   JOptionPane.showMessageDialog(this, "游戲結(jié)束," + (SaveGame[x][y] == 1 ? "黑方贏了" : "白方贏了"));//彈出提示對話框
   canplay = false;
  }


//  System.out.println(1);//測試
  } else {
//  System.out.println(0);//測試
  }
 }


 //實現(xiàn)開始按鈕
 //判斷是否點擊開始按鈕
 if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by && e.getY() < by + bh) {
  //判斷游戲是否開始
  if (canplay == false) {
  //如果游戲結(jié)束,則開始游戲
  canplay = true;
  JOptionPane.showMessageDialog(this, "游戲開始");
  //初始化游戲
  Initialize();

  this.repaint();//重新執(zhí)行一次paint方法

  } else {
  //如果游戲進行中,則重新開始
  JOptionPane.showMessageDialog(this, "重新開始");
  //初始化游戲
  Initialize();

  this.repaint();//重新執(zhí)行一次paint方法

  }
 }


 //實現(xiàn)悔棋按鈕
 //判斷是否點擊悔棋按鈕
 if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 60 && e.getY() < by + 60 + bh) {
  //判斷游戲是否開始
  if (canplay == true) {
  //遍歷棋盤上是否有棋子
  int z = 0;
  for (int i = 0; i < 15; i++) {
   for (int j = 0; j < 15; j++) {
   if (SaveGame[i][j] != 0) {
    z++;
   }
   }
  }
  //判斷是否有棋子
  if (z != 0) {
   JOptionPane.showMessageDialog(this, "下棋亦如人生,你走的每一步都沒有回頭路。");
  } else {
   JOptionPane.showMessageDialog(this, "棋盤上已無棋子");
  }

  } else {
  JOptionPane.showMessageDialog(this, "請先開始游戲");
  }
 }


 //實現(xiàn)認輸按鈕
 //判斷是否點擊認輸按鈕
 if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 120 && e.getY() < by + 120 + bh) {
  //判斷游戲是否開始
  if (canplay == true) {
  //判斷是誰認輸
  if (qc == 1) {
   JOptionPane.showMessageDialog(this, "黑方認輸,白方獲勝");
   canplay = false;
  } else if (qc == 2) {
   JOptionPane.showMessageDialog(this, "白方認輸,黑方獲勝");
   canplay = false;
  }
  } else {
  JOptionPane.showMessageDialog(this, "請先開始游戲");
  }
 }


 }


 @Override//鼠標(biāo)抬起
 public void mouseReleased(MouseEvent e) {

 }

 @Override//鼠標(biāo)進入
 public void mouseEntered(MouseEvent e) {

 }

 @Override//鼠標(biāo)離開
 public void mouseExited(MouseEvent e) {

 }
}

結(jié)束語

因為是我自己測試的,主要功能應(yīng)該沒問題,可能會忽略一些細節(jié),如有不對的地方,請幫忙指出。

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

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

相關(guān)文章

  • Java基于深度優(yōu)先遍歷的隨機迷宮生成算法

    Java基于深度優(yōu)先遍歷的隨機迷宮生成算法

    今天小編就為大家分享一篇關(guān)于Java基于深度優(yōu)先遍歷的隨機迷宮生成算法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Spring中的@ResponseStatus使用

    Spring中的@ResponseStatus使用

    這篇文章主要介紹了Spring中的@ResponseStatus使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 深入了解Java數(shù)據(jù)結(jié)構(gòu)和算法之堆

    深入了解Java數(shù)據(jù)結(jié)構(gòu)和算法之堆

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之堆 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • SpringMVC?@RequestMapping注解屬性詳細介紹

    SpringMVC?@RequestMapping注解屬性詳細介紹

    通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • maven打生產(chǎn)環(huán)境可執(zhí)行包的實現(xiàn)

    maven打生產(chǎn)環(huán)境可執(zhí)行包的實現(xiàn)

    本文主要介紹了maven打生產(chǎn)環(huán)境可執(zhí)行包的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • SpringBoot中使用@Value注解注入詳解

    SpringBoot中使用@Value注解注入詳解

    這篇文章主要介紹了SpringBoot中的@Value注入詳解,在SpringBoot中,@Value注解可以注入一些字段的普通屬性,并且會自動進行類型轉(zhuǎn)換,本文對這些類型進行總結(jié),需要的朋友可以參考下
    2023-08-08
  • Spring條件注解沒生效該如何解決

    Spring條件注解沒生效該如何解決

    條件注解相信各位小伙伴都用過,Spring?中的多環(huán)境配置?profile?底層就是通過條件注解來實現(xiàn)的,下面小編就來為大家介紹一下當(dāng)Spring條件注解沒生效時該如何解決,感興趣的可以了解下
    2023-09-09
  • map實現(xiàn)按value升序排序

    map實現(xiàn)按value升序排序

    map內(nèi)部是按照hash算法存儲的,但如果能對map排序在某些時候還是有用的,下面實現(xiàn)對map按照value升序排序,實現(xiàn)對map按照key排序,大家參考使用吧
    2014-01-01
  • java實現(xiàn)本地緩存的示例代碼

    java實現(xiàn)本地緩存的示例代碼

    在高性能服務(wù)架構(gòu)設(shè)計中,緩存是不可或缺的環(huán)節(jié),因此這篇文章主要為大家詳細介紹了java中如何實現(xiàn)本地緩存,感興趣的小伙伴可以了解一下
    2024-01-01
  • Java的@Transactional、@Aysnc、事務(wù)同步問題詳解

    Java的@Transactional、@Aysnc、事務(wù)同步問題詳解

    這篇文章主要介紹了Java的@Transactional、@Aysnc、事務(wù)同步問題詳解,現(xiàn)在我們需要在一個業(yè)務(wù)方法中插入一個用戶,這個業(yè)務(wù)方法我們需要加上事務(wù),然后插入用戶后,我們要異步的方式打印出數(shù)據(jù)庫中所有存在的用戶,需要的朋友可以參考下
    2023-11-11

最新評論

雷山县| 进贤县| 定南县| 镶黄旗| 望谟县| 南乐县| 蓬安县| 密云县| 莒南县| 镇原县| 元氏县| 昌黎县| 哈巴河县| 关岭| 津南区| 滦南县| 辽宁省| 新平| 鲜城| 米泉市| 石渠县| 光泽县| 丰城市| 郎溪县| 甘南县| 康马县| 云霄县| 新民市| 盘锦市| 红安县| 葵青区| 温州市| 茌平县| 三亚市| 辽源市| 中方县| 潍坊市| 喀喇沁旗| 梧州市| 河北省| 当阳市|