Java實現五子棋對戰小遊戲【完整版】
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ChessBord extends JPanel implements MouseListener{// 繼承皮膚類和滑鼠事件介面
public static int MARGIN=30;// 定義邊距
public static int ROWS=15;// 定義行數
public static int COLS=15;// 定義列數
public static int GRID_SPAN=35;// 網格間距
Chess[] chessList=new Chess[(ROWS+1)*(COLS+1)];// 定義一個棋子陣列
String[][] board=new String[MARGIN*2+GRID_SPAN*COLS][MARGIN*2+GRID_SPAN*COLS];// 宣告一個字串陣列,用來判斷輸贏
int chessCount;// 棋子數目
int xindex,yindex;// 棋子的座標索引
boolean start=true;// 開始預設黑子先下
boolean GameOver=false;// 定義是否遊戲結束
public ChessBord() {// 棋盤類建構函式
setBackground(Color.LIGHT_GRAY);// 設定背景顏色
addMouseListener(this);// 將棋盤類新增到滑鼠事件監聽器
addMouseMotionListener(new MouseMotionListener() {// 匿名內部類
@Override
public void mouseMoved(MouseEvent e) {// 根據滑鼠的移動所在的座標來設定滑鼠游標形狀
int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;// 對滑鼠游標的 x 座標進行轉換
int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;// 對滑鼠游標的 y 座標進行轉換
if(x1<0||x1>ROWS||y1<0||y1>COLS||GameOver||findchess(x1, y1)) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));// 設定滑鼠游標為預設形狀
}else {
setCursor(new Cursor(Cursor.HAND_CURSOR));// 設定滑鼠游標為手型
}
}
@Override
public void mouseDragged(MouseEvent e) {
}
});
for(int i=0;i<MARGIN*2+GRID_SPAN*COLS;i++) {// 對 board[][] 賦初值
for (int j = 0; j < MARGIN*2+GRID_SPAN*COLS; j++) {
board[i][j]="0";
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {// 滑鼠點選事件
if(GameOver)// 遊戲結束,不能按
return ;
String colorName=start?" 黑棋 ":" 白棋 ";// 判斷是什麼顏色的棋子
xindex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;// 得到棋子 x 座標
yindex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;// 得到棋子 y 座標
board[xindex][yindex]=colorName;//跟單網gendan5.com 以棋子 x 座標 y 座標做索引將棋子的顏色新增到 board 中
if(xindex<0||xindex>ROWS||yindex<0||yindex>COLS) {// 棋子在棋盤外不能下,
return ;
}else if(findchess( xindex, yindex)) {// 所下位置已有棋子,不能下
return ;
}
Chess po=new Chess(xindex,yindex,start?Color.black:Color.WHITE);// 對棋子物件進行初始化
chessList[chessCount++]=po;// 將棋子物件新增到棋子陣列中
repaint();// 重畫圖型
if(win( xindex,yindex,start)) {// 判斷是否勝利
String msg=String.format(" 恭喜 %s 贏了 ",colorName);
JOptionPane.showMessageDialog(this, msg);
//gameOver=true;
GameOver=true;
}else if(chessCount==(COLS+1)*(ROWS+1)) {// 判斷是否全部下滿
String msg=String.format(" 恭喜 %s 贏了 ",colorName);
JOptionPane.showMessageDialog(this, msg);
GameOver=true;
}
start=!start;// 改變棋子先下棋狀態
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
protected void paintComponent(Graphics g) {// 畫棋盤和棋子
super.paintComponent(g);
for(int i=0;i<=ROWS;i++) {// 畫橫線
g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN);
}
for(int j=0;j<=COLS;j++) {// 畫豎線
g.drawLine(MARGIN+j*GRID_SPAN, MARGIN, MARGIN+j*GRID_SPAN, MARGIN+ROWS*GRID_SPAN);
}
for(int i=0;i<chessCount;i++) {// 畫棋子
int xpos=chessList[i].getX()*GRID_SPAN+MARGIN;// 得到棋子 x 座標
int ypos=chessList[i].getY()*GRID_SPAN+MARGIN;// 得到棋子 y 座標
g.setColor(chessList[i].getColor());// 設定棋子顏色
g.fillOval(xpos-Chess.DIAMETER/2, ypos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER);// 畫棋子
if(i==chessCount-1){
g.setColor(Color.red);// 標記最後一個棋子為紅色
g.drawRect(xpos-Chess.DIAMETER/2, ypos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER);
}
}
}
private boolean findchess(int index,int yindex) {// 查詢所在位置是否有棋子
for (Chess c : chessList) {
if(c!=null&&c.getX()==xindex&&c.getY()==yindex)
return true;
}
return false;
}
private boolean win(int x,int y,boolean start) {// 對棋子輸贏的判斷
String str=start?" 黑棋 ":" 白棋 ";
// 棋子所在行和列是否有五子相連的情況
for(int i=0;i<16;i++){
if((board[x][i].equals(str)&&board[x][i+1].equals(str)&&board[x][i+2].equals(str)&&board[x][i+3].equals(str)&&board[x][i+4].equals(str))||(board[i][y].equals(str)&&board[i+1][y].equals(str)&&board[i+2][y].equals(str)&&board[i+3][y].equals(str)&&board[i+4][y].equals(str)))
return true;
}
// 棋子所在撇行是否有五子相連的情況
if(x+y>=4&&x+y<=30){
int i=(x+y<=19)?x+y:x+y-20;
if(x+y<=19){
for(int k=0;k<=i-4;k++){
if(board[k][i-k].equals(str)&&board[k+1][i-k-1].equals(str)&&board[k+2][i-k-2].equals(str)&&board[k+3][i-k-3].equals(str)&&board[k+4][i-k-4].equals(str))
return true;
}
}else{
for(int k=i;k<=15;k++){
if(board[k][20-k].equals(str)&&board[k+1][20-k-1].equals(str)&&board[k+2][20-k-2].equals(str)&&board[k+3][20-k-3].equals(str)&&board[k+4][20-k-4].equals(str))
return true;
}
}
}
// 棋子所在捺行是否有五子相連的情況
if(y-x<=15&&x-y<=15){
int i=(x<y)?y-x:x-y;
if(x<y){
for(int k=0;k<=19-4-i;k++){
if(board[k][i+k].equals(str)&&board[k+1][i+k+1].equals(str)&&board[k+2][i+k+2].equals(str)&&board[k+3][i+k+3].equals(str)&&board[k+4][i+k+4].equals(str))
return true;
}
}else{
for(int k=i;k<=15;k++){
if(board[k][i+k].equals(str)&&board[k+1][i+k+1].equals(str)&&board[k+2][i+k+2].equals(str)&&board[k+3][i+k+3].equals(str)&&board[k+4][i+k+4].equals(str))
return true;
}
}
}
return false;
}
public void goback() {// 悔棋函式
if(chessCount==0) {
return ;
}
chessList[chessCount-1]=null;
chessCount--;
if(chessCount>0) {
xindex=chessList[chessCount-1].getX();
yindex=chessList[chessCount-1].getY();
}
start=!start;
repaint();
}
public void restartGame() {// 重新開始函式
for(int i=0;i<chessList.length;i++)// 設定為初始狀態
chessList[i]=null;
for(int i=0;i<MARGIN*2+GRID_SPAN*COLS;i++) {
for (int j = 0; j < MARGIN*2+GRID_SPAN*COLS; j++) {
board[i][j]="0";
}
}
start=true;
GameOver=false;
chessCount=0;
repaint();
}
public Dimension getPreferredSize(){// 畫矩形
return new Dimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2+GRID_SPAN*ROWS);
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2923902/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java實現簡易聯網坦克對戰小遊戲Java遊戲
- 【Demo見真章】基於HarmonyOS手機實現五子棋對戰小遊戲遊戲
- C語言實現小遊戲:五子棋C語言遊戲
- 藉助實時資料推送快速製作線上對戰五子棋小遊戲丨實戰遊戲
- Python:遊戲:五子棋之人機對戰Python遊戲
- 五子棋遊戲(Java)遊戲Java
- Java實現飛機大戰遊戲Java遊戲
- Java小遊戲——飛機大戰Java遊戲
- C語言五子棋小遊戲C語言遊戲
- 16×16大小棋盤的五子棋小程式 Java實現Java
- PyGame每日一練——五子棋小遊戲GAM遊戲
- 【Java基礎教程】用Java實現猜數字小遊戲Java遊戲
- Python練習01-對戰小遊戲Python遊戲
- 基於 Blazor 開發五子棋⚫⚪小遊戲Blazor遊戲
- 實戰 PerfDog 優化小遊戲效能優化遊戲
- WebGL著色器渲染小遊戲實戰Web遊戲
- Python實現五子棋人機對戰的二次開發Python
- Java小遊戲Java遊戲
- 【Java】實現記事本(完整版)Java
- javascript實現前端小遊戲2048JavaScript前端遊戲
- java練習-任務1.2-對戰遊戲Java遊戲
- Cocos Creator - 微信小遊戲 實戰分享遊戲
- Java簡單實現無介面五子棋Java
- 遊戲開發經驗談(二):對戰類全球服遊戲的設計與實現遊戲開發
- linux實現猜數字小遊戲Linux遊戲
- Android實現買賣商品小遊戲Android遊戲
- Python程式碼實現“FlappyBird”小遊戲PythonAPP遊戲
- JS之五子棋遊戲JS遊戲
- Java Swing坦克小遊戲Java遊戲
- Python實現三子棋小遊戲Python遊戲
- bash shell實現2048小遊戲詳解遊戲
- 爬蟲——實戰完整版爬蟲
- 小鎮青年的網遊實踐與現實生活:從“遊戲即生活”到“遊戲只是遊戲”遊戲
- 直播原始碼網站,直播間小遊戲java遞迴的實現方式原始碼網站遊戲Java遞迴
- LeetCode 299 猜數字遊戲 Java實現LeetCode遊戲Java
- C++實用程式設計——坦克大戰小遊戲C++程式設計遊戲
- Java入門----猜拳小遊戲Java遊戲
- java飛機大戰小遊戲作業二次開發Java遊戲