亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java版AI五子棋游戲

2024-07-14 08:42:25
字體:
來源:轉載
供稿:網友

本文實例為大家分享了java五子棋游戲的具體代碼,供大家參考,具體內容如下

AI思路:通過判斷棋盤上每個空位的分數,去分數最高的幾個點,隨機下棋
分數計算思路:能成5個說明能贏了,給最高分
不能成5個,對方能成5個,說明對方要贏了,給第二高分
能成活4,給第三高分
能成活3,給第四高分
能成沖4,給第五高分
能成沖3,給第六高分
能成活2,給第七高分
能成沖2,給第八高分
其他,給最低分
分數設定可自己定義。

因為是去年寫的了,思路記得大概就是這樣。最近根據書上寫了個棋類游戲的設計框架,待完善后再發上來,應該會更新AI思路
下面是去年寫的AI五子棋的代碼:

package FivechessClient; import java.awt.Cursor;import java.awt.Dimension;import java.awt.Graphics;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import java.awt.image.BufferedImage;import java.io.File;import java.util.ArrayList;import java.util.Random; import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel; /** *  * @ClassName: Game * @Description: AI五子棋 * @author xiaoxiong * @date 2015年7月3日 下午8:59:02 * */public class Game { BufferedImage table; BufferedImage black; BufferedImage white;  BufferedImage selected; /** * 棋子個數 */ private static int BOARD_SIZE = 15; /** * 棋盤寬高 */ private final int TABLE_WIDTH = 535; private final int TABLE_HEIGHT = 536; /** * 棋盤15等分 */ private final int RATE = TABLE_WIDTH / BOARD_SIZE; /** * 棋盤外邊距 */ private final int X_OFFSET = 5; private final int Y_OFFSET = 6; /** * 棋盤 */ private int[][] board = new int[BOARD_SIZE][BOARD_SIZE]; /** * AI分數 */ private int[][] computerScore = new int[BOARD_SIZE][BOARD_SIZE]; // private int[][] gamerScore = new int[BOARD_SIZE][BOARD_SIZE];  JFrame f = new JFrame("五子棋--小熊");  ChessBoard chessBoard = new ChessBoard();  private static int selectedX = -1; private static int selectedY = -1; private static int computerX = -1; private static int computerY = -1;  private static boolean flagGamer = false; // 記錄玩家是否贏了 private static boolean flagComputer = false; // 記錄電腦是否贏了  private static int computerscore = 0; // 電腦最大分數 private static int comx, comy; // 玩家下子坐標  private final int HUO = 1; private final int CHONG = 2; private static int chesscou = 0; /** * 記錄找到的分數一樣的棋子,隨機下這些棋子中的一個,以防步法固定 */ private ArrayList<ChessXY> chessList = new ArrayList<ChessXY>();  Random rand = new Random();  /** *  * @Title: initto @Description: 重置游戲 @param @return void @throws */ public void initto() { for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { board[i][j] = 0; computerScore[i][j] = 100000; } } chesscou = 0; computerX = -1; computerY = -1; flagGamer = false; flagComputer = false; }  /** *  * @Title: isRun @Description: 判斷該位置是否可以走 @param @param x @param @param * y @param @return @return boolean @throws */ public boolean isRun(int x, int y) { if (board[x][y] == 0) { return true; } return false; }  /** *  * @Title: isWin @Description: 判斷下該子是否能贏 @param @param f 顏色 @param @param x * 坐標 @param @param y @param @return @return boolean @throws */ public boolean isWin(int f, int x, int y) { int i, count = 1; boolean up, down, right, left, rup, lup, rdown, ldown; up = down = right = left = rup = lup = rdown = ldown = true; /** * * 上下  * */ for (i = 1; i < 5; ++i) { if ((y + i) < BOARD_SIZE) { if (board[x][y + i] == f && down) count++; else down = false; } if ((y - i) >= 0) { if (board[x][y - i] == f && up) count++; else up = false; } } if (count >= 5) { return true; } count = 1; /** * * 左右  * */ for (i = 1; i < 5; ++i) { if ((x + i) < BOARD_SIZE) { if (board[x + i][y] == f && right) count++; else right = false; } if ((x - i) >= 0) { if (board[x - i][y] == f && left) count++; else left = false; } } if (count >= 5) { return true; } count = 1; /** * * 左上右下  * */ for (i = 1; i < 5; ++i) { if ((x + i) < BOARD_SIZE && (y + i) < BOARD_SIZE) { if (board[x + i][y + i] == f && rdown) count++; else rdown = false; } if ((x - i) >= 0 && (y - i) >= 0) { if (board[x - i][y - i] == f && lup) count++; else lup = false; } } if (count >= 5) { return true; } count = 1; /** * * 右上左下 * */ for (i = 1; i < 5; ++i) { if ((x + i) < BOARD_SIZE && (y - i) >= 0) { if (board[x + i][y - i] == f && rup) count++; else rup = false; } if ((x - i) >= 0 && (y + i) < BOARD_SIZE) { if (board[x - i][y + i] == f && ldown) count++; else ldown = false; } } if (count >= 5) { return true; }  return false; }  /** *  * @Title: Computer_AI @Description: AI下棋 @param @return void @throws */ public void Computer_AI() { computerscore = 0; for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { computerScore[i][j] = 0; // gamerScore[i][j] = 0; } } getScore(); for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (computerScore[i][j] == computerscore) { ChessXY chess = new ChessXY(i, j); chessList.add(chess); } } } int n = rand.nextInt(chessList.size()); // 電腦根據分值一樣的點隨機走,防止每次都走相同的步數 comx = chessList.get(n).x; comy = chessList.get(n).y; chessList.clear(); }  /** *  * @Title: getScore @Description: 評分 @param @return void @throws */ public void getScore() { for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == 0) { if (isWin(2, i, j)) // 電腦能贏,故給分最高,因為可以結束,所以不再檢測 { computerscore = 13; computerScore[i][j] = 13;  return; } else if (isWin(1, i, j)) // 電腦不能贏,玩家能贏,要阻止,所以給12分 { computerscore = 12; computerScore[i][j] = 12; } else if (isHuoOrChong(2, i, j, 4, HUO)) // 電腦玩家都不能贏,電腦能形成活四,給11分 { computerscore = (computerscore > 11 ? computerscore : 11); computerScore[i][j] = 11; } else if (isHuoOrChong(2, i, j, 4, CHONG)) // 電腦玩家都不能贏,電腦能形成沖四,給10分 { computerscore = (computerscore > 10 ? computerscore : 10); computerScore[i][j] = 10; } else if (isHuoOrChong(1, i, j, 4, HUO)) // 電腦玩家都不能贏,玩家能形成活四,給9分 { computerscore = (computerscore > 9 ? computerscore : 9); computerScore[i][j] = 9; } else if (isHuoOrChong(2, i, j, 3, HUO)) // 電腦玩家都不能贏,電腦能形成活三,給8分 { computerscore = (computerscore > 8 ? computerscore : 8); computerScore[i][j] = 8; } else if (isHuoOrChong(1, i, j, 4, CHONG)) // 電腦玩家都不能贏,玩家能形成沖四,給7分 { computerscore = (computerscore > 7 ? computerscore : 7); computerScore[i][j] = 7; } else if (isHuoOrChong(2, i, j, 3, CHONG)) // 電腦玩家都不能贏,電腦能形成沖三,給6分 { computerscore = (computerscore > 6 ? computerscore : 6); computerScore[i][j] = 6; } else if (isHuoOrChong(2, i, j, 2, HUO)) // 電腦玩家都不能贏,電腦能形成活二,給5分 { computerscore = (computerscore > 5 ? computerscore : 5); computerScore[i][j] = 5; } else if (isHuoOrChong(1, i, j, 3, CHONG)) // 電腦玩家都不能贏,玩家能形成沖三,給4分 { computerscore = (computerscore > 4 ? computerscore : 4); computerScore[i][j] = 4; } else if (isHuoOrChong(1, i, j, 2, HUO)) // 電腦玩家都不能贏,玩家能形成活二,給3分 { computerscore = (computerscore > 3 ? computerscore : 3); computerScore[i][j] = 3; } else if (isHuoOrChong(2, i, j, 2, CHONG)) // 電腦玩家都不能贏,電腦能形成沖二,給2分 { computerscore = (computerscore > 2 ? computerscore : 2); computerScore[i][j] = 2; } else if (isHuoOrChong(1, i, j, 2, CHONG)) // 電腦玩家都不能贏,玩家能形成沖二,給1分 { computerscore = (computerscore > 1 ? computerscore : 1); computerScore[i][j] = 1; } else { computerScore[i][j] = 0; } } } } }  /** *  * @Title: isHuoOrChong @Description: 判斷是否為活 @param @param f @param @param * x @param @param y @param @param num @param @param * hORc @param @return @return boolean @throws */ private boolean isHuoOrChong(int f, int x, int y, int num, int hORc) // 活 {  num += 1; int i, count = 1; boolean terminal1 = false; boolean terminal2 = false; boolean up, down, right, left, rup, lup, rdown, ldown; up = down = right = left = rup = lup = rdown = ldown = true; /** * * 上下  * */ for (i = 1; i < num; ++i) { if ((y + i) < BOARD_SIZE) { if (board[x][y + i] == f && down) count++; else { if (board[x][y + i] == 0 && down) { terminal1 = true; } down = false; } } if ((y - i) >= 0) { if (board[x][y - i] == f && up) count++; else { if (board[x][y - i] == 0 && up) { terminal2 = true; } up = false; } } } if (count == num - 1 && hORc == HUO && terminal1 && terminal2) { return true; } if (count == num - 1 && hORc == CHONG && ((terminal1 && !terminal2) || (!terminal1 && terminal2))) { return true; } count = 1; terminal1 = false; terminal2 = false; /* 左右 */ for (i = 1; i < num; ++i) { if ((x + i) < BOARD_SIZE) { if (board[x + i][y] == f && right) count++; else { if (board[x + i][y] == 0 && right) { terminal1 = true; } right = false; } } if ((x - i) >= 0) { if (board[x - i][y] == f && left) count++; else { if (board[x - i][y] == 0 && left) { terminal2 = true; } left = false; } } } if (count == num - 1 && hORc == HUO && terminal1 && terminal2) { return true; } if (count == num - 1 && hORc == CHONG && ((terminal1 && !terminal2) || (!terminal1 && terminal2))) { return true; } count = 1; terminal1 = false; terminal2 = false; /** * * 左上右下  * */ for (i = 1; i < num; ++i) { if ((x + i) < BOARD_SIZE && (y + i) < BOARD_SIZE) { if (board[x + i][y + i] == f && rdown) count++; else { if (board[x + i][y + i] == 0 && rdown) { terminal1 = true; } rdown = false; } } if ((x - i) >= 0 && (y - i) >= 0) { if (board[x - i][y - i] == f && lup) count++; else { if (board[x - i][y - i] == 0 && lup) { terminal2 = true; } lup = false; } } } if (count == num - 1 && hORc == HUO && terminal1 && terminal2) { return true; } if (count == num - 1 && hORc == CHONG && ((terminal1 && !terminal2) || (!terminal1 && terminal2))) { return true; } count = 1; terminal1 = false; terminal2 = false; /** * * 右上左下  * */ for (i = 1; i < num; ++i) { if ((x + i) < BOARD_SIZE && (y - i) >= 0) { if (board[x + i][y - i] == f && rup) count++; else { if (board[x + i][y - i] == 0 && rup) { terminal1 = true; } rup = false; } } if ((x - i) >= 0 && (y + i) < BOARD_SIZE) { if (board[x - i][y + i] == f && ldown) count++; else { if (board[x - i][y + i] == 0 && ldown) { terminal2 = true; } ldown = false; } } } if (count == num - 1 && hORc == HUO && terminal1 && terminal2) { return true; } if (count == num - 1 && hORc == CHONG && ((terminal1 && !terminal2) || (!terminal1 && terminal2))) { return true; }  return false; }  public void init() throws Exception { table = ImageIO.read(new File("image/board.jpg")); black = ImageIO.read(new File("image/black.gif")); white = ImageIO.read(new File("image/white.gif")); selected = ImageIO.read(new File("image/selected.gif"));  for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { board[i][j] = 0; computerScore[i][j] = 0; } } chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));  chessBoard.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int xPos = (int) ((e.getX() - X_OFFSET) / RATE); int yPos = (int) ((e.getY() - Y_OFFSET) / RATE); // System.out.println("1 " + xPos + " " + yPos); if (isRun(xPos, yPos)) { flagGamer = isWin(1, xPos, yPos); board[xPos][yPos] = 1; chesscou++; // do //電腦下棋,隨機 // { // comx = (rand.nextInt(535) - X_OFFSET) / RATE; // comy = (rand.nextInt(536) - Y_OFFSET) / RATE; // } while (!isRun(comx, comy)); if (chesscou == (BOARD_SIZE * BOARD_SIZE)) { JOptionPane.showMessageDialog(null, "不相上下?。?!/n再來一盤吧?。。?quot;, "結束", JOptionPane.ERROR_MESSAGE); initto(); } else { Computer_AI(); // 電腦下棋,AI算法 chesscou++; // System.out.println("2 " + comx + " " + comy); flagComputer = isWin(2, comx, comy); board[comx][comy] = 2; computerX = comx; computerY = comy; } } chessBoard.repaint(); if (flagGamer) { JOptionPane.showMessageDialog(null, "厲害厲害?。?!/n你贏了?。?!", "結束", JOptionPane.ERROR_MESSAGE); initto(); } else if (flagComputer) { JOptionPane.showMessageDialog(null, "哈哈哈哈?。?!/n你輸了?。?!", "結束", JOptionPane.ERROR_MESSAGE); initto(); } }  public void mouseExited(MouseEvent e) { selectedX = -1; selectedY = -1; chessBoard.repaint(); } }); chessBoard.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { selectedX = (e.getX() - X_OFFSET) / RATE; selectedY = (e.getY() - Y_OFFSET) / RATE;  chessBoard.repaint(); } }); f.add(chessBoard); f.setCursor(new Cursor(Cursor.HAND_CURSOR)); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setResizable(false); f.pack(); f.setVisible(true); }  public static void main(String[] args) throws Exception { Game game = new Game(); game.init(); }  @SuppressWarnings("serial") class ChessBoard extends JPanel { public void paint(Graphics g) { g.drawImage(table, 0, 0, null); if (selectedX >= 0 && selectedY >= 0) { g.drawImage(selected, selectedX * RATE + X_OFFSET, selectedY * RATE + Y_OFFSET, null); } if (computerX >= 0 && computerY >= 0) { g.drawImage(selected, computerX * RATE + X_OFFSET, computerY * RATE + Y_OFFSET, null); } for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == 1) { g.drawImage(black, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null); } if (board[i][j] == 2) { g.drawImage(white, i * RATE + X_OFFSET, j * RATE + Y_OFFSET, null); } } } } }} class ChessXY { int x; int y;  public ChessXY(int x, int y) { this.x = x; this.y = y; }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合av影视| 久久久久久91香蕉国产| 456国产精品| 日韩成人高清在线| 亚洲深夜福利在线| 69视频在线播放| 欧洲亚洲女同hd| 国产主播精品在线| 91视频国产一区| 久久精品免费播放| 久久久久久久久久婷婷| 欧美日韩亚洲一区二区| 久久激情视频久久| 成人免费网站在线观看| 久久久久久久久久国产| 欧美午夜精品久久久久久人妖| 91精品国产成人www| 日韩专区在线观看| 国产精品成人va在线观看| 国产精品白嫩美女在线观看| 国产成人拍精品视频午夜网站| 亚洲国产精久久久久久久| 亚洲成人精品在线| 亚洲一区亚洲二区| 粉嫩av一区二区三区免费野| 欧美激情日韩图片| 欧美成人一区在线| 亚洲japanese制服美女| 精品亚洲国产成av人片传媒| 欧美午夜无遮挡| 欧美在线观看一区二区三区| 91精品国产高清| 亚洲va国产va天堂va久久| 91精品视频免费看| 另类专区欧美制服同性| 欧美日韩国产二区| 国产精品美女在线观看| 国内精品400部情侣激情| 日韩电影第一页| 狠狠色狠狠色综合日日小说| 欧美激情一区二区三区成人| 欧美大肥婆大肥bbbbb| 亚洲午夜精品久久久久久久久久久久| 国产成人在线播放| 亚洲成成品网站| 国产精品自产拍在线观看| 亚洲第一精品电影| 亚洲精品按摩视频| 一区二区三欧美| 国产精品极品美女在线观看免费| 美女av一区二区三区| 欧美日韩国产999| 91国产精品91| 欧美日韩免费网站| 91网站免费看| 中文字幕自拍vr一区二区三区| 精品久久久久久中文字幕一区奶水| 欧美电影免费观看高清完整| 热草久综合在线| 国产精品久久久久久久久粉嫩av| 成人伊人精品色xxxx视频| 日韩av在线导航| 综合网中文字幕| 国产日本欧美视频| 亚洲欧洲国产伦综合| 亚洲精品久久久久久久久| 亚洲欧洲激情在线| 国产日韩综合一区二区性色av| 久久亚洲春色中文字幕| 精品成人69xx.xyz| 成人妇女淫片aaaa视频| 日韩中文字幕免费看| 日韩精品视频免费专区在线播放| 久久人91精品久久久久久不卡| 欧美在线视频观看免费网站| 精品呦交小u女在线| 国产精品网址在线| 国产精品电影网| 97视频免费在线观看| 日韩h在线观看| 久久综合电影一区| www日韩中文字幕在线看| 欧美黑人国产人伦爽爽爽| 中文字幕在线国产精品| 欧美性生交xxxxx久久久| 91在线免费看网站| 日韩免费观看av| 精品国产自在精品国产浪潮| 亚洲国产一区二区三区在线观看| 国产亚洲一区二区在线| 国产亚洲精品久久久久动| 亚洲成人久久网| 日本在线观看天堂男亚洲| 欧美肥老太性生活视频| 91香蕉电影院| 伊人男人综合视频网| 国产精品视频自拍| 清纯唯美亚洲激情| 日韩精品在线视频观看| 亚洲成人a级网| 中文欧美在线视频| 欧美孕妇孕交黑巨大网站| 亚洲欧美综合区自拍另类| 国产成人一区二区三区电影| 成人在线小视频| 成人国产精品久久久久久亚洲| 色噜噜国产精品视频一区二区| 欧美电影免费观看高清完整| 中文字幕精品在线| 国产日韩欧美视频在线| 91在线视频九色| 欧美性视频网站| 高清视频欧美一级| 亚洲成人激情小说| 成人黄色片网站| 亚洲精品国产欧美| 91精品国产色综合久久不卡98| 97热精品视频官网| 欧美尺度大的性做爰视频| 国产97免费视| 福利视频一区二区| 91精品国产99| 国产高清在线不卡| 欧美激情一区二区三级高清视频| 欧美激情综合亚洲一二区| 中文字幕欧美国内| 久久久久久久97| 欧洲s码亚洲m码精品一区| 欧美巨乳美女视频| 欧美国产日韩一区二区三区| 国产欧美日韩专区发布| 国产日产久久高清欧美一区| 91精品综合久久久久久五月天| 国产精品久久婷婷六月丁香| 国产一区私人高清影院| 国产女精品视频网站免费| 国产精品wwwwww| 日韩美女在线看| 欧美另类老女人| 91久久在线视频| 欧美性xxxxxxxxx| 欧美麻豆久久久久久中文| 国产亚洲激情视频在线| 57pao国产精品一区| 国产97人人超碰caoprom| 欧美一级高清免费| 中文字幕欧美专区| 2019最新中文字幕| 国产精品九九九| 91av在线免费观看| 国自在线精品视频| 2021久久精品国产99国产精品| 亚洲一区二区日本| 日韩中文字幕视频在线观看| 亚洲黄色在线观看| 国产一区二区三区网站| 欧美成在线观看| 亚洲视频综合网| 久久精品久久久久久| 欧美激情按摩在线| 日韩欧美成人网| 亚洲自拍av在线| 91在线观看免费高清完整版在线观看| 国产成人综合av|