模仿五子棋類似小游戲(升級版含界面)
- 運行截圖
- 代碼
運行截圖

代碼
Wzq.java
package com.zjw20200221;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
// 繼承JFrame來一個背景圖片,那么,我們最快捷的操作,是讓類,繼承JFrame
public class Wzq extends JFrame{
public static int[][] qp = new int[15][15];
public static int flag = 1; // 0是白旗 1黑旗
// 先來創建JFrame
public void start() {
// this this指向,指當前物件 ——> Wzq ——> extends JFrame ——> JFrame
this.setTitle("五子棋");
this.setSize(768, 796);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setIconImage(
Toolkit.getDefaultToolkit().getImage(
Wzq.class.getResource("/image/yc.png")));
// 可見
this.setVisible(true);
// 獲取到繪圖物件
Graphics g = this.getGraphics();
// 添加滑鼠的點擊事件
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 得到我們的坐標位置 在我們陣列里面,x代表行,y代表列 ,與坐標抽的xy恰恰相反
int x = (e.getY() - 38) / 50;
int y = (e.getX() - 10) / 50;
// System.out.println(x + "-" + y);
// 每次下棋先判斷一下,這個地方有沒有被下過
if (qp[x][y] != 0) { // Wzq.this -> this this的應用指向
JOptionPane.showMessageDialog(Wzq.this, "此處已經有子", "警告", JOptionPane.WARNING_MESSAGE);
return; // 不讓代碼繼續往下了
}
// 如果沒有子了,那就開始下棋
if (flag == 1) { // 說明是白子
qp[x][y] = 1;
g.setColor(Color.WHITE);
} else {
qp[x][y] = 2;
g.setColor(Color.BLACK);
}
// 開始畫圖,還是上面說的,xy跟我們的xy是相反的
g.fillOval(y * 50 + 10, x * 50 +38, 50, 50);
//
if (isWin(x, y)) {
// 勝利
String str = flag == 1 ? "白子" : "黑子";// 三元運算子
int index = JOptionPane.showConfirmDialog(Wzq.this,
"游戲結束," + str + "獲取勝利!\n是否再來一局", "游戲結束",
JOptionPane.YES_NO_OPTION);
if (index == 1) {
// 1代表否
System.exit(0); // 強行終止程式
}
// 再來一局
flag = 2;
// 陣列全部改成0
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
qp[i][j] = 0;
}
}
// 重繪棋盤
Wzq.this.repaint();
}
// 沒有贏,則繼續,換另一個玩家下棋
flag = flag % 2 + 1;
}
});
}
// 判斷輸贏
private static boolean isWin(int x, int y) {
// 如何判斷贏了
// 以自身為原點,向上,向下,向左,向右,都擴4列,最極限的情況下,我們下的位置,是第五子
// 先看橫的
int count = 0;
for (int i = y - 4; i <= y + 4; i++) {
// i 不能小于0 i 不能大于等于12 不能超過邊界
if (i < 0 || i >= qp[0].length) {
continue;
}
// 判斷,是否有連的5個值
if (qp[x][i] == flag) {
count ++;
if (count >= 5) {
// 勝利
return true;
}
} else {
// 中間制藥有一個不相等,累積就清空,變成0
count = 0;
}
}
// 接著判斷豎的
for (int i = x - 4; i <= x + 4; i++) {
// i 不能小于0 i不能大于等于12 不能超過邊界
if (i < 0 || i >= qp.length) {
continue;
}
if (qp[i][y] == flag) {
count ++;
if (count >= 5) {
// 勝利
return true;
}
} else {
// 中間只要有一個不相等, 累積就清空,變成0
count = 0;
}
}
// 二個對角,襒 重點: x , y 都要改變
for (int i = x - 4, j = y - 4 ; i <= y + 4 && j <= y + 4; i++, j++) {
if (i < 0 || i >= qp.length || j < 0 || j >= qp[0].length) {
continue;
}
if (qp[i][j] == flag) {
count ++;
if (count >= 5) {
// 勝利
return true;
}
} else {
// 中間只要有一個不相等, 累積就清空,變成0
count = 0;
}
}
count = 0;
// 捺
for (int i = x + 4, j = y - 4; i >= x - 4 && j <= y + 4; i--, j++) {
if (i < 0 || i >= qp.length || j < 0 || j > qp[0].length) {
continue;
}
if (qp[i][j] == flag) {
count ++;
if (count >= 5) {
// 勝利
return true;
}
} else {
// 中間只要有一個不相等,累積就清空,變成0
count = 0;
}
}
return false;
}
// 繼承JFrame,那么,在創建的時候,會自動的呼叫這個方法
public void paint(Graphics g) {
// 定義背景圖片
Image bgImage = Toolkit.getDefaultToolkit().getImage(
Wzq.class.getResource("/image/chessboard.jpg"));
// 畫圖
g.drawImage(bgImage, 4, 32, 760, 760, this);
g.dispose();
}
}
Test.java
package com.zjw20200221;
public class Test {
public static void main(String[] args) {
// 實體化物件
Wzq wzq = new Wzq();
// 呼叫這個物件里面的方法
wzq.start();
}
}
gitee源代碼下載:https://gitee.com/zhangjiawei88/wuziqi.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/226838.html
標籤:java
上一篇:【Java多執行緒】使用多執行緒計算階乘累加 1!+2!+3!+...+19!+20!。其中一個執行緒計算階乘,另一執行緒實作累加并輸出結果
