Java實(shí)現(xiàn)小程序簡單五子棋
本程序適用于java初學(xué)者鞏固類與對象、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對邏輯能力的鍛煉
需要注意的有:
- ①要加入
java界面的重繪(基本原則) - ②由于玩家需要通過鼠標(biāo)點(diǎn)擊,計(jì)算機(jī)響應(yīng)出棋子的位置,但卻不能保證每次點(diǎn)擊都正中棋盤點(diǎn)位,所以要有一定的誤差范圍
- ③要保存更新棋盤上的棋子信息,因?yàn)槠灞P格數(shù)是固定的故本例中采取最簡單的數(shù)組
直接上代碼:
分為三個(gè)類,同一包下:
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;
/*
* 儲(chǔ)存棋子的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)點(diǎn)擊的位置
private int x1, y1, xx, yy;// 鼠標(biāo)點(diǎn)擊附近格子交點(diǎn)的坐標(biāo)
private Graphics g;
private int a = 0, i = 0, j = 0, count1 = 0;// count統(tǒng)計(jì)當(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)是否超過格子長度的一半(防止玩家點(diǎn)偏)
if (yy >= SIZE / 2) {
y1 = (y1 / SIZE) + 2;
} else {
y1 = (y1 / SIZE) + 1;
}
if ((count1 + 1) % 2 == 1) {// 單數(shù)步數(shù)時(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();// 讀取點(diǎn)擊按鈕上的字符串
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,然后實(shí)現(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實(shí)現(xiàn)小程序簡單五子棋的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)簡單五子棋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中 this和super的用法與區(qū)別小結(jié)
在Java的學(xué)習(xí)與開發(fā)者我們經(jīng)常遇到this和super關(guān)鍵字,本文主要介紹了Java中 this和super的用法與區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
java學(xué)生管理系統(tǒng)界面簡單實(shí)現(xiàn)(全)
這篇文章主要為大家詳細(xì)介紹了java學(xué)生管理系統(tǒng)界面的簡單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫的實(shí)現(xiàn)示例
為了防止數(shù)據(jù)庫被清庫或者誤刪數(shù)據(jù)庫的情況,所以需要定時(shí)將mysql數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行備份,本文主要介紹了springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫的實(shí)現(xiàn)示例,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
SpringBoot在自定義類中調(diào)用service層等Spring其他層操作
這篇文章主要介紹了SpringBoot在自定義類中調(diào)用service層等Spring其他層操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java實(shí)現(xiàn)單鏈表反轉(zhuǎn)的多種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)單鏈表反轉(zhuǎn)的多種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
SpringBootAdmin+actuator實(shí)現(xiàn)服務(wù)監(jiān)控
這篇文章主要為大家詳細(xì)介紹了SpringBootAdmin+actuator實(shí)現(xiàn)服務(wù)監(jiān)控,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

