Java五子棋單機版源碼分享
初學(xué)JavaGUI編程,就寫了一個小游戲–五子棋。
目前只實現(xiàn)了單機版,任何事情都是從簡制作的,有問題請大牛們不吝指教啊。
此處的棋盤和棋子都未用圖片,全部都是使用Java中的Graphics畫出來的。
源碼已提交至GitHub,點擊此處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; //用來判斷白旗還是黑棋 int whiteCount, blackCount; //計算悔棋步數(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; //垂直線的長度 int hline = height + py; //水平線的長度 /** * 構(gòu)造方法 */ public FiveInARow() { super("單機版五子棋"); 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("單機版五子棋小游戲,右擊可以悔棋,歡迎使用", 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, "沒有棋可悔"); } 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 //計算水平方向棋子數(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; } } //計算垂直方向棋子數(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; } } //計算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; } } //計算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:打算再寫個網(wǎng)絡(luò)版的五子棋,可惜對Java中網(wǎng)絡(luò)不太清楚,得學(xué)習(xí)一段時間后再繼續(xù)完成了,檢驗下個人學(xué)習(xí)成果。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 整合EhCache實現(xiàn)單服務(wù)緩存的操作方法
這篇文章主要介紹了springboot 整合EhCache實現(xiàn)單服務(wù)緩存的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07分布式調(diào)度XXL-Job整合Springboot2.X實戰(zhàn)操作過程(推薦)
這篇文章主要介紹了分布式調(diào)度XXL-Job整合Springboot2.X實戰(zhàn)操作,包括定時任務(wù)的使用場景和常見的定時任務(wù),通過本文學(xué)習(xí)幫助大家該選擇哪個分布式任務(wù)調(diào)度平臺,對此文感興趣的朋友一起看看吧2022-04-04java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于java中List去除重復(fù)數(shù)據(jù)的5種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01JAVA利用HttpClient進(jìn)行POST請求(HTTPS)實例
下面小編就為大家?guī)硪黄狫AVA利用HttpClient進(jìn)行POST請求(HTTPS)實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起 小編過來看看吧2016-11-11