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

Java實現(xiàn)小程序簡單五子棋

 更新時間:2021年12月10日 12:04:25   作者:小王曾是少年  
這篇文章主要介紹了利用Java實現(xiàn)小程序簡單五子棋,本程序適用于java初學(xué)者鞏固類與對象、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對邏輯能力的鍛煉,下面來看具體實現(xiàn)吧

本程序適用于java初學(xué)者鞏固類與對象、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對邏輯能力的鍛煉

需要注意的有:

  • ①要加入java界面的重繪(基本原則)
  • ②由于玩家需要通過鼠標(biāo)點擊,計算機(jī)響應(yīng)出棋子的位置,但卻不能保證每次點擊都正中棋盤點位,所以要有一定的誤差范圍
  • ③要保存更新棋盤上的棋子信息,因為棋盤格數(shù)是固定的故本例中采取最簡單的數(shù)組

直接上代碼:

分為三個類,同一包下:

package Study0326;
 
public interface WZQConfig {
 /*
  * 起始位置X
  */
 public static final int START_X = 60;
 /*
  * 起始位置Y
  */
 public static final int START_Y = 60;
 /*
  * 五子棋盤線條數(shù)
  */
 public static final int H_LINE = 15;
 /*
  * 五子棋盤豎線條數(shù)
  */
 public static final int V_LINE = 15;
 /*
  * 五子棋盤格子大小
  */
 public static final int SIZE = 60;
 /*
  * 儲存棋子的x位置信息
  */
 public static final int[][] bx = new int[17][17];
}


package Study0326;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import javax.swing.JButton;
import javax.swing.JOptionPane;
 
public class LoginListener implements MouseListener, WZQConfig, ActionListener {
 private int x, y;// 鼠標(biāo)點擊的位置
 private int x1, y1, xx, yy;// 鼠標(biāo)點擊附近格子交點的坐標(biāo)
 private Graphics g;
 private int a = 0, i = 0, j = 0, count1 = 0;// count統(tǒng)計當(dāng)前下的棋子數(shù)
 private String Str;// 定義全局變量獲取按鈕上的字符串
 private JButton jbu1, jbu2;
 private int GetX[] = new int[256];
 private int GetY[] = new int[256];
 WZQFrame ui;
 
 public void setG(Graphics g) {
  this.g = g;
 }
 
 public void setT(JButton b) {
  jbu1 = b;
 }
 
 public void setU(WZQFrame u) {
  ui = u;
 }
 
 public void mouseClicked(MouseEvent e) {
 
 }
 
 public void mousePressed(MouseEvent e) {
 
 }
 
 public void mouseReleased(MouseEvent e) {
  x = e.getX();
  y = e.getY();
  x1 = Math.abs(x - START_X);
  y1 = Math.abs(y - START_Y);
  xx = x1 % SIZE;
  if (xx >= SIZE / 2) {
   x1 = (x1 / SIZE) + 2;
  } else {
   x1 = (x1 / SIZE) + 1;
  }
 
  yy = y1 % SIZE;// 判斷橫坐標(biāo)是否超過格子長度的一半(防止玩家點偏)
  if (yy >= SIZE / 2) {
   y1 = (y1 / SIZE) + 2;
  } else {
   y1 = (y1 / SIZE) + 1;
  }
 
  if ((count1 + 1) % 2 == 1) {// 單數(shù)步數(shù)時下黑棋,雙數(shù)時下白棋
   g.setColor(Color.BLACK);
   if (bx[x1][y1] == 0) {
    bx[x1][y1] = 1;// 表示黑棋
    g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
      50, 50);
    count1++;// 所下棋子數(shù)加一
    GetX[count1] = x1;// 記錄第count1步的棋子x值
    GetY[count1] = y1;// 記錄第count1步的棋子y值
    if (CheckRow(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
    if (CheckList(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
    if (UpperRight(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
    if (UpperLeft(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
    }
   }
  } else {
   g.setColor(Color.WHITE);
   if (bx[x1][y1] == 0) {
    bx[x1][y1] = 2;// 表示白棋
    g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
      50, 50);
    count1++;// 所下棋子數(shù)加一
    GetX[count1] = x1;// 記錄第count1步的棋子x值
    GetY[count1] = y1;// 記錄第count1步的棋子y值
    if (CheckRow(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
    if (CheckList(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
    if (UpperRight(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
    if (UpperLeft(x1, y1) >= 5) {
     JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
    }
   }
  }
 }
 
 public void actionPerformed(ActionEvent e) {
  setT(jbu1);
  Str = e.getActionCommand();// 讀取點擊按鈕上的字符串
  if ("悔棋".equals(Str)) {
   if (g.getColor() == Color.BLACK) {
    g.setColor(Color.WHITE);
   }
   if (g.getColor() == Color.WHITE) {
    g.setColor(Color.BLACK);
   }
   Regret();
   ui.repaint();
  } else if ("重新開始".equals(Str)) {
   Restart();
   ui.repaint();
  }
 }
 
 public void mouseEntered(MouseEvent e) {
 
 }
 
 public void mouseExited(MouseEvent e) {
 
 }
 
 public int CheckRow(int x, int y)// 橫著五子連成一條直線
 {
  int count = 0;
  for (int i = x + 1; i < bx.length; i++)// 向右判斷是否棋子一樣
  {
   if (bx[i][y] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = x; i >= 0; i--)// 向右判斷是否棋子一樣
  {
   if (bx[i][y] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }
 
 public int CheckList(int x, int y)// 豎著五子連成一條直線
 {
  int count = 0;
  for (int i = y + 1; i < bx.length; i++)// 向下判斷是否棋子一樣
  {
   if (bx[x][i] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = y; i >= 0; i--)// 向上判斷是否棋子一樣
  {
   if (bx[x][i] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }
 
 public int UpperRight(int x, int y)// 右上到左下五子連成一條直線
 {
  int count = 0;
  for (int i = x + 1, j = y - 1; i < bx.length && j >= 0; i++, j--)// 向下判斷是否棋子一樣
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = x, j = y; i >= 0 && j < bx.length; i--, j++)// 向上判斷是否棋子一樣
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }
 
 public int UpperLeft(int x, int y)// 左上到右下五子連成一條直線
 {
  int count = 0;
  for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--)// 向下判斷是否棋子一樣
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  for (int i = x, j = y; i < bx.length && j < bx.length; i++, j++)// 向上判斷是否棋子一樣
  {
   if (bx[i][j] == bx[x][y])
    count++;
   else
    break;
  }
  return count;
 }
 
 public void Regret() {// 悔棋
  bx[GetX[count1]][GetY[count1]] = 0;
  if (count1 > 0) {
   count1--;
  }
 }
 
 public void Restart() {//重新開始
  {
   for (int k = 0; k <= count1; k++) {
    bx[GetX[k]][GetY[k]] = 0;
   }
  }
 }
}
 

package Study0326;
 
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
/*
 * 五子棋的界面類,該類繼承JFrame,然后實現(xiàn)WZQConfig接口
 */
import javax.swing.JPanel;
 
public class WZQFrame extends JPanel implements WZQConfig {
 public void WZQFrame() {
  // WZQFrame ui = new WZQFrame();
  JFrame jf = new javax.swing.JFrame();
  jf.setTitle("五子棋");
  jf.setDefaultCloseOperation(3);
  jf.setSize(1246, 1080);
  jf.setLocationRelativeTo(null);
  jf.setResizable(false);
 
  jf.setLayout(new FlowLayout());
  this.setLayout(new FlowLayout());
 
  this.setPreferredSize(new Dimension(1030, 1080));
 
  // this.setBackground(Color.CYAN);
  // 把面板對象添加到窗體上
  jf.add(this);
  JPanel jp1 = new JPanel();
  jp1.setPreferredSize(new Dimension(200, 1080));
  jp1.setLayout(new FlowLayout());
  jf.add(jp1);
  LoginListener ll = new LoginListener();
  String[] str = { "悔棋", "重新開始" };
  for (int i = 0; i < str.length; i++) {
   JButton jbu1 = new JButton(str[i]);
   jbu1.setPreferredSize(new Dimension(150, 80));
   jbu1.setFont(new Font("楷體", Font.BOLD,20));//設(shè)置字體
   jp1.add(jbu1);
   jbu1.addActionListener(ll);
  }
  
  jf.setVisible(true);
 
  Graphics g = this.getGraphics();
 
  this.addMouseListener(ll);
 
  ll.setG(g);
  ll.setU(this);
 }
 
 /*
  * 重寫窗體繪制容器的方法
  */
 public void paint(Graphics g) {
  super.paint(g);
 
  ImageIcon im2 = new ImageIcon(this.getClass().getResource("2.jpg"));
 
  g.drawImage(im2.getImage(), 0, 0, 1030, 1080, null);
 
  for (int i = 1; i < 17; i++) {
   Graphics2D g2 = (Graphics2D) g;
   g2.setStroke(new BasicStroke(4));
   g2.drawLine(START_X, START_Y * i, START_X + SIZE * V_LINE, START_Y
     * i);// 橫線
   g2.drawLine(START_X * i, START_Y, START_X * i, START_Y + SIZE
     * V_LINE);// 豎線
 
   g2.setStroke(new BasicStroke(8));
   // 畫邊框
   g2.drawLine(35, 35, 990, 35);
   g2.drawLine(35, 990, 990, 990);
   g2.drawLine(35, 35, 35, 990);
   g2.drawLine(990, 35, 990, 990);
  }
  for (int k = 0; k < 17; k++) {
   for (int k1 = 0; k1 < 17; k1++) {
    if (bx[k][k1] == 1) {
     g.setColor(Color.BLACK);
     g.fillOval(Math.abs(k * SIZE - 25),
       Math.abs(k1 * SIZE - 25), 50, 50);
 
    } else if (bx[k][k1] == 2) {
     g.setColor(Color.WHITE);
     g.fillOval(Math.abs(k * SIZE - 25),
       Math.abs(k1 * SIZE - 25), 50, 50);
    }
 
   }
 
  }
 
 }
 
 public static void main(String[] args) {
  WZQFrame l = new WZQFrame();
  l.WZQFrame();
 
 }
 
}
 

到此這篇關(guān)于Java實現(xiàn)小程序簡單五子棋的文章就介紹到這了,更多相關(guān)Java實現(xiàn)簡單五子棋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)面板之間切換功能

    java實現(xiàn)面板之間切換功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)面板之間切換功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解Java中的鎖Lock和synchronized

    詳解Java中的鎖Lock和synchronized

    鎖是Java并發(fā)編程中最重要的同步機(jī)制,Java提供了種類豐富的鎖,每種鎖因其特性的不同,在適當(dāng)?shù)膱鼍跋履軌蛘宫F(xiàn)出非常高的效率。本文將詳細(xì)介紹Lock和synchronized
    2021-06-06
  • SpringBoot+Websocket實現(xiàn)一個簡單的網(wǎng)頁聊天功能代碼

    SpringBoot+Websocket實現(xiàn)一個簡單的網(wǎng)頁聊天功能代碼

    本篇文章主要介紹了SpringBoot+Websocket實現(xiàn)一個簡單的網(wǎng)頁聊天功能代碼,具有一定的參考價值,有需要的可以了解一下
    2017-08-08
  • SpringBoot Starter依賴原理與實例詳解

    SpringBoot Starter依賴原理與實例詳解

    SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾
    2022-09-09
  • 輕松掌握java組合模式

    輕松掌握java組合模式

    這篇文章主要幫助大家輕松掌握java組合模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • MyBatis-Flex 邏輯刪除的用法小結(jié)

    MyBatis-Flex 邏輯刪除的用法小結(jié)

    本文主要介紹了MyBatis-Flex 邏輯刪除的用法小結(jié),主要介紹了@Column注解使用及UpdateChain工具類介紹,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • Java Collection集合的三種遍歷方式詳解

    Java Collection集合的三種遍歷方式詳解

    Collection集合遍歷的方式有三種,迭代器foreach/增強(qiáng)for循環(huán)lambda表達(dá)式,這篇文章主要介紹了Java Collection集合的三種遍歷方式,需要的朋友可以參考下
    2022-11-11
  • springboot斷言異常封裝與統(tǒng)一異常處理實現(xiàn)代碼

    springboot斷言異常封裝與統(tǒng)一異常處理實現(xiàn)代碼

    異常處理其實一直都是項目開發(fā)中的大頭,但關(guān)注異常處理的人一直都特別少,下面這篇文章主要給大家介紹了關(guān)于springboot斷言異常封裝與統(tǒng)一異常處理的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • SpringBoot打印系統(tǒng)執(zhí)行的sql語句及日志配置指南

    SpringBoot打印系統(tǒng)執(zhí)行的sql語句及日志配置指南

    這篇文章主要給大家介紹了關(guān)于SpringBoot打印系統(tǒng)執(zhí)行的sql語句及日志配置的相關(guān)資料,在Java SpringBoot項目中如果使用了Mybatis框架,默認(rèn)情況下執(zhí)行的所有SQL操作都不會打印日志,需要的朋友可以參考下
    2023-10-10
  • 解決Java編譯時錯誤:A JNI error has occurred,please check your installation and try again

    解決Java編譯時錯誤:A JNI error has occurred,ple

    這篇文章主要介紹了解決Java編譯時錯誤:A JNI error has occurred,please check your installation and try again,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

土默特左旗| 乐都县| 泽库县| 玛纳斯县| 伊川县| 民乐县| 武安市| 仪陇县| 南涧| 许昌县| 崇左市| 松潘县| 革吉县| 甘德县| 得荣县| 德庆县| 莒南县| 随州市| 怀安县| 柯坪县| 维西| 洛隆县| 老河口市| 项城市| 襄垣县| 潞西市| 灵璧县| 布尔津县| 德兴市| 泾阳县| 嘉荫县| 苗栗县| 沙坪坝区| 尼木县| 长海县| 黑水县| 丹阳市| 松潘县| 奈曼旗| 昌乐县| 合川市|