Java五子棋單機(jī)版源碼分享
初學(xué)JavaGUI編程,就寫了一個(gè)小游戲–五子棋。
目前只實(shí)現(xiàn)了單機(jī)版,任何事情都是從簡(jiǎn)制作的,有問(wèn)題請(qǐng)大牛們不吝指教啊。
此處的棋盤和棋子都未用圖片,全部都是使用Java中的Graphics畫出來(lái)的。
源碼已提交至GitHub,點(diǎn)擊此處GitHub源碼
以下列出其中的五子棋類:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class FiveInARow extends JFrame implements MouseListener {
Vector v = new Vector(); //所有的每步走棋信息
Vector white = new Vector(); //白方走棋信息
Vector black = new Vector(); //黑方走棋信息
boolean b; //用來(lái)判斷白旗還是黑棋
int whiteCount, blackCount; //計(jì)算悔棋步數(shù)
int w = 25; //間距大小
int px = 100, py = 100; //棋盤的大小
int pxw = px + w, pyw = py + w;
int width = w * 16, height = w * 16;
int vline = width + px; //垂直線的長(zhǎng)度
int hline = height + py; //水平線的長(zhǎng)度
/**
* 構(gòu)造方法
*/
public FiveInARow() {
super("單機(jī)版五子棋");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關(guān)閉按鈕
Container con = this.getContentPane();
con.setLayout(new BorderLayout());
this.addMouseListener(this);//添加監(jiān)聽
this.setSize(600, 600);//設(shè)置窗體大小
this.setBackground(Color.orange);
this.setVisible(true);
}
/**
* 畫棋盤和棋子
* @param e
*/
public void paint(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());//清除畫板
g.setColor(Color.BLACK);//繪制網(wǎng)格顏色
g.drawRect(px, py, width, height);//網(wǎng)格大小
g.drawString("單機(jī)版五子棋小游戲,右擊可以悔棋,歡迎使用", 180, 70);
for (int i=0; i<15; i++) {
g.drawLine(pxw+i*w, py, pxw+i*w, hline);//每條橫線和豎線
g.drawLine(px, pyw+i*w, vline, pyw+i*w);
}
for (int x=0; x<v.size(); x++) {
String str = (String)v.get(x);
String tmp[] = str.split("-");
int a = Integer.parseInt(tmp[0]);
int b = Integer.parseInt(tmp[1]);
a = a * w + px;
b = b * w + py;
if (x%2 == 0) {
g.setColor(Color.WHITE);
} else {
g.setColor(Color.BLACK);
}
g.fillArc(a-w/2, b-w/2, w, w, 0, 360);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == e.BUTTON1) {
int x = e.getX();
int y = e.getY();
x = (x - x % w) + (x % w > w / 2 ? w : 0);
y = (y - y % w) + (y % w > w / 2 ? w : 0);
x = (x - px) / w;
y = (y - py) / w;
if (x >= 0 && y >= 0 && x <= 16 && y <= 16) {
if (v.contains(x+"-"+y)) {
System.out.println("已經(jīng)有棋了!");
} else {
v.add(x+"-"+y);
this.repaint();
if (v.size() % 2 == 0) {
black.add(x+"-"+y);
this.victory(x, y, black);
// System.out.println("黑棋");
} else {
white.add(x+"-"+y);
this.victory(x, y, white);
// System.out.println("白棋");
}
// System.out.println(e.getX()+"-"+e.getY());
}
} else {
// System.out.println(e.getX()+"-"+e.getY()+"|"+x+"-"+y+"\t超出邊界了");
}
}
if (e.getButton() == e.BUTTON3) { //右擊悔棋的方法
// System.out.println("鼠標(biāo)右擊--悔棋");
if (v.isEmpty()) {
JOptionPane.showMessageDialog(this, "沒(méi)有棋可悔");
} else {
if (v.size() % 2 == 0) { //判斷是白棋悔棋,還是黑棋悔棋
blackCount++;
if (blackCount > 3) {
JOptionPane.showMessageDialog(this, "黑棋已經(jīng)悔了3步");
} else {
v.remove(v.lastElement());
this.repaint();
}
} else {
whiteCount++;
if (whiteCount > 3) {
JOptionPane.showMessageDialog(this, "白棋已經(jīng)悔了3步");
} else {
v.remove(v.lastElement());
this.repaint();
}
}
}
}
}
/**
* 判斷勝利的方法
* @param x
* @param y
* @param contain
*/
private void victory(int x, int y, Vector contain) {
int cv = 0; //垂直方向棋子數(shù)量
int ch = 0; //水平方向棋子數(shù)量
int ci1 = 0; //斜面方向棋子數(shù)量1
int ci2 = 0; //斜面方向棋子數(shù)量2
//計(jì)算水平方向棋子數(shù)量
for (int i=1; i<5; i++) {
if (contain.contains((x+i)+"-"+y)) {
ch++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains((x-i)+"-"+y)) {
ch++;
} else {
break;
}
}
//計(jì)算垂直方向棋子數(shù)量
for (int i=1; i<5; i++) {
if (contain.contains(x+"-"+(y+i))) {
cv++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains(x+"-"+(y-i))) {
cv++;
} else {
break;
}
}
//計(jì)算45°斜面方向棋子數(shù)量
for (int i=1; i<5; i++) {
if (contain.contains((x+i)+"-"+(y+i))) {
ci1++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains((x-i)+"-"+(y-i))) {
ci1++;
} else {
break;
}
}
//計(jì)算135°斜面方向棋子數(shù)量
for (int i=1; i<5; i++) {
if (contain.contains((x+i)+"-"+(y-i))) {
ci2++;
} else {
break;
}
}
for (int i=1; i<5; i++) {
if (contain.contains((x-i)+"-"+(y+i))) {
ci2++;
} else {
break;
}
}
if (ch>=4 || cv>=4 ||ci1>=4 ||ci2>=4) {
System.out.println(v.size()+"步棋");
if (v.size() % 2 == 0) {
//判斷是黑棋贏,還是白棋贏
JOptionPane.showMessageDialog(null, "黑棋贏了");
} else {
JOptionPane.showMessageDialog(null, "白棋贏了");
}
this.v.clear();
this.black.clear();
this.white.clear();
this.repaint();
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
PS:打算再寫個(gè)網(wǎng)絡(luò)版的五子棋,可惜對(duì)Java中網(wǎng)絡(luò)不太清楚,得學(xué)習(xí)一段時(shí)間后再繼續(xù)完成了,檢驗(yàn)下個(gè)人學(xué)習(xí)成果。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
maven的升級(jí)版maven-mvnd的使用小結(jié)
maven-mvnd是Maven的升級(jí)版,通過(guò)將構(gòu)建過(guò)程放在守護(hù)進(jìn)程中,實(shí)現(xiàn)了更快的編譯速度和更低的內(nèi)存占用,下面就來(lái)介紹一下如何使用,感興趣的可以了解一下2025-01-01
Mybatis自定義TypeHandler解決特殊類型轉(zhuǎn)換問(wèn)題詳解
這篇文章主要介紹了Mybatis自定義TypeHandler解決特殊類型轉(zhuǎn)換問(wèn)題詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Java 實(shí)現(xiàn)完整功能的學(xué)生管理系統(tǒng)實(shí)例
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)完整版學(xué)生管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
RabbitMQ消息隊(duì)列中的Channel信道參數(shù)詳解
這篇文章主要介紹了RabbitMQ消息隊(duì)列中的Channel信道參數(shù)詳解,信道是生產(chǎn)消費(fèi)者與rabbit通信的渠道,生產(chǎn)者publish或者消費(fèi)者消費(fèi)一個(gè)隊(duì)列都是需要通過(guò)信道來(lái)通信的,信道是建立在TCP上面的虛擬鏈接,需要的朋友可以參考下2023-08-08
java實(shí)現(xiàn)簡(jiǎn)易五子棋游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
JPA如何將查詢結(jié)果轉(zhuǎn)換為DTO對(duì)象
這篇文章主要介紹了JPA如何將查詢結(jié)果轉(zhuǎn)換為DTO對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

