Java實(shí)現(xiàn)五子棋游戲的完整代碼
用Java編寫(xiě)簡(jiǎn)單的五子棋,供大家參考,具體內(nèi)容如下
前言
這兩天在空閑時(shí)間做了個(gè)五子棋項(xiàng)目,分享給大家看一下,界面是這樣的:

界面很丑我知道,本人雖有幾年P(guān)S基礎(chǔ),但知識(shí)淺薄,審美觀不盡人意,做到如此實(shí)屬極限(其實(shí)我懶得做了),大家將就著看看吧。
下面放出代碼,為方便大家參考,我?guī)缀趺織l代碼都標(biāo)有注釋。
測(cè)試類(lèi)代碼
public class Test {
public static void main(String[] args) {
MyJFrame mj=new MyJFrame();
mj.myJFrame();
}
}
MyJFrame類(lèi)代碼
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;//棋盤(pán)位置、寬高
int bw = 150, bh = 50, bx = 570, by = 150;//按鈕寬高、位置
int x = 0, y = 0;//保存棋子坐標(biāo)
int[][] SaveGame = new int[15][15];//保存每個(gè)棋子
int qc = 1;//記錄白棋=2,黑棋=1
int qn = 0;//判斷棋子是否重復(fù)
boolean canplay = true;//判斷游戲是否開(kāi)始和結(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)閉窗口同時(shí)結(jié)束程序
int width = Toolkit.getDefaultToolkit().getScreenSize().width;//獲取屏幕寬度
int height = Toolkit.getDefaultToolkit().getScreenSize().height;//獲取屏幕高度
// System.out.println("寬度:"+width);//測(cè)試
// System.out.println("高度:"+height);//測(cè)試
this.setLocation((width - 800) / 2, (height - 600) / 2); //設(shè)置窗口默認(rèn)位置以屏幕居中
this.addMouseListener(this);
this.setVisible(true); //窗口是否顯示=是
}
//---------------------------------------------------------------------------------------------------------------------
//覆寫(xiě)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è)置畫(huà)筆顏色
g2.setFont(new Font("華文行楷", 10, 50));//設(shè)置字體
g2.drawString("曉時(shí)五子棋", 525, 100);//繪制字符
//棋盤(pán)
g2.setColor(Color.getHSBColor(30, (float) 0.10, (float) 0.90));//設(shè)置畫(huà)筆顏色
g2.fillRect(qx, qy, qw, qh);//繪制棋盤(pán)背景矩形
//開(kāi)始按鈕
g2.setColor(Color.WHITE);//設(shè)置畫(huà)筆顏色
g2.fillRect(bx, by, bw, bh);//繪制開(kāi)始按鈕
g2.setFont(new Font("華文行楷", 10, 30));//設(shè)置字體
g2.setColor(Color.black);//設(shè)置畫(huà)筆顏色
g2.drawString("開(kāi)始", 615, 185);//繪制字符
//悔棋按鈕
g2.setColor(Color.LIGHT_GRAY);//設(shè)置畫(huà)筆顏色
g2.fillRect(bx, by + 60, bw, bh);//繪制悔棋按鈕
g2.setFont(new Font("華文行楷", 10, 30));//設(shè)置字體
g2.setColor(Color.WHITE);//設(shè)置畫(huà)筆顏色
g2.drawString("悔棋", 615, 245);//繪制字符
//認(rèn)輸按鈕
g2.setColor(Color.GRAY);//設(shè)置畫(huà)筆顏色
g2.fillRect(bx, by + 120, bw, bh);//繪制認(rèn)輸按鈕
g2.setFont(new Font("華文行楷", 10, 30));//設(shè)置字體
g2.setColor(Color.WHITE);//設(shè)置畫(huà)筆顏色
g2.drawString("認(rèn)輸", 615, 305);//繪制字符
//游戲信息欄
g2.setColor(Color.getHSBColor(30, (float) 0.10, (float) 0.90));//設(shè)置畫(huà)筆顏色
g2.fillRect(550, 350, 200, 150);//繪制游戲狀態(tài)區(qū)域
g2.setColor(Color.black);//設(shè)置畫(huà)筆顏色
g2.setFont(new Font("黑體", 10, 20));//設(shè)置字體
g2.drawString("游戲信息", 610, 380);//繪制字符
g2.drawString(go, 610, 410);//繪制字符
g2.drawString("作者:曉時(shí)谷雨", 560, 440);//繪制字符
g2.drawString("聯(lián)系方式:", 560, 465);//繪制字符
g2.drawString("qq 717535996", 560, 490);//繪制字符
g2.setColor(Color.BLACK);//設(shè)置畫(huà)筆顏色
//繪制棋盤(pán)格線
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)注點(diǎn)
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);//繪制實(shí)心圓
}
}
//繪制棋子
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);//繪制實(shí)心圓
}
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);//繪制實(shí)心圓
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)點(diǎn)擊
public void mouseClicked(MouseEvent e) {
}
@Override//鼠標(biāo)按下
public void mousePressed(MouseEvent e) {
//獲取鼠標(biāo)點(diǎn)擊位置
x = e.getX();
y = e.getY();
//判斷是否已開(kāi)始游戲
if (canplay == true) {
//判斷點(diǎn)擊是否為棋盤(pán)內(nèi)
if (x > qx && x < qx + qw && y > qy && y < qy + qh) {
//計(jì)算點(diǎn)擊位置最近的點(diǎn)
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)前位置有沒(méi)有棋子
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方法
//彈出勝利對(duì)話(huà)框
boolean wl = this.WinLose();
if (wl) {
JOptionPane.showMessageDialog(this, "游戲結(jié)束," + (SaveGame[x][y] == 1 ? "黑方贏了" : "白方贏了"));//彈出提示對(duì)話(huà)框
canplay = false;
}
// System.out.println(1);//測(cè)試
} else {
// System.out.println(0);//測(cè)試
}
}
//實(shí)現(xiàn)開(kāi)始按鈕
//判斷是否點(diǎn)擊開(kāi)始按鈕
if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by && e.getY() < by + bh) {
//判斷游戲是否開(kāi)始
if (canplay == false) {
//如果游戲結(jié)束,則開(kāi)始游戲
canplay = true;
JOptionPane.showMessageDialog(this, "游戲開(kāi)始");
//初始化游戲
Initialize();
this.repaint();//重新執(zhí)行一次paint方法
} else {
//如果游戲進(jìn)行中,則重新開(kāi)始
JOptionPane.showMessageDialog(this, "重新開(kāi)始");
//初始化游戲
Initialize();
this.repaint();//重新執(zhí)行一次paint方法
}
}
//實(shí)現(xiàn)悔棋按鈕
//判斷是否點(diǎn)擊悔棋按鈕
if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 60 && e.getY() < by + 60 + bh) {
//判斷游戲是否開(kāi)始
if (canplay == true) {
//遍歷棋盤(pán)上是否有棋子
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, "下棋亦如人生,你走的每一步都沒(méi)有回頭路。");
} else {
JOptionPane.showMessageDialog(this, "棋盤(pán)上已無(wú)棋子");
}
} else {
JOptionPane.showMessageDialog(this, "請(qǐng)先開(kāi)始游戲");
}
}
//實(shí)現(xiàn)認(rèn)輸按鈕
//判斷是否點(diǎn)擊認(rèn)輸按鈕
if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 120 && e.getY() < by + 120 + bh) {
//判斷游戲是否開(kāi)始
if (canplay == true) {
//判斷是誰(shuí)認(rèn)輸
if (qc == 1) {
JOptionPane.showMessageDialog(this, "黑方認(rèn)輸,白方獲勝");
canplay = false;
} else if (qc == 2) {
JOptionPane.showMessageDialog(this, "白方認(rèn)輸,黑方獲勝");
canplay = false;
}
} else {
JOptionPane.showMessageDialog(this, "請(qǐng)先開(kāi)始游戲");
}
}
}
@Override//鼠標(biāo)抬起
public void mouseReleased(MouseEvent e) {
}
@Override//鼠標(biāo)進(jìn)入
public void mouseEntered(MouseEvent e) {
}
@Override//鼠標(biāo)離開(kāi)
public void mouseExited(MouseEvent e) {
}
}
結(jié)束語(yǔ)
因?yàn)槭俏易约簻y(cè)試的,主要功能應(yīng)該沒(méi)問(wèn)題,可能會(huì)忽略一些細(xì)節(jié),如有不對(duì)的地方,請(qǐng)幫忙指出。
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud融入Python的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud融入Python的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
SpringBoot訪問(wèn)接口自動(dòng)跳轉(zhuǎn)login頁(yè)面的問(wèn)題及解決
這篇文章主要介紹了SpringBoot訪問(wèn)接口自動(dòng)跳轉(zhuǎn)login頁(yè)面的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源
在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
關(guān)于mybatis的一級(jí)緩存和二級(jí)緩存的那些事兒
MyBatis自帶的緩存有一級(jí)緩存和二級(jí)緩存,今天我們就來(lái)學(xué)習(xí)一下,文中有非常詳細(xì)的總結(jié),對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06
對(duì)比Java講解Kotlin中?.與!!.的區(qū)別
這篇文章主要給大家介紹了關(guān)于對(duì)比Java,實(shí)例講解Kotlin中?.與!!.的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用kotlin具有一定參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
關(guān)于Springboot打成JAR包后讀取外部配置文件的問(wèn)題
這篇文章主要介紹了關(guān)于Springboot打成JAR包后讀取外部配置文件的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

