五子棋实现人机、人人对战_第1页
五子棋实现人机、人人对战_第2页
五子棋实现人机、人人对战_第3页
五子棋实现人机、人人对战_第4页
五子棋实现人机、人人对战_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、五子棋,实现人机、人人对战。java实现的五子棋,继承Canvas类,纯手工制作。AI很弱(参考的OSchina一位仁兄的,稍作改进。);悔棋功能没写完全,能悔棋,但其实是个空壳子 ;有些小bug,如果你按顺序来,不要乱点,是没问题的 。第一次做AI,大家包涵。想研究下Alpha-beta算法,那AI就没得说了。import java.util.Random;public class AI public static int x_;public static int y_;/ MainFrame mf = new MainFrame();private MyLinkedList keyPoin

2、t = new MyLinkedList(); / 存放所有关键落子点private int kind(int x, int y, int addX, int addY, int role) / 区分棋形种类x += addX; / X方向增加值y += addY; / Y方向增加值int kind = 10; / 等级while (true) if (x = 19 | y = 19 | x = -1 | y = -1) kind+;break; else if (ChessPanel.chessArrayxy = 0 && role = 0)kind -= 2; / 如果此处

3、为AI的棋子而且正在计算AI的落子等级,则升高两级else if (ChessPanel.chessArrayxy = 0 && role = 0) / 如果此处为用户的棋子而且正在计算AI的落子等级,则降低一级kind+; / 等级降低一级break; / 退出循环 else if (ChessPanel.chessArrayxy = 1 && role = 1)kind -= 2; / 如果此处为用户的棋子而且正在计算用户的落子等级,则升高两级else if (ChessPanel.chessArrayxy = 0 && role = 1)

4、/ 如果此处为AI的棋子而且正在计算用户的落子等级,等级降低一级kind+; / 等级降低一级break; / 退出循环 else if (ChessPanel.chessArrayxy = -1) / 如果另一端无子if (x + addX) >= 0 && (y + addY) >= 0 && (x + addX) <= 18&& (y + addY) <= 18&& ChessPanel.chessArrayx + addXy + addY = 0&& role = 0)kind -=

5、 2;else if (x + addX) >= 0 && (y + addY) >= 0 && (x + addX) <= 18&& (y + addY) <= 18&& ChessPanel.chessArrayx + addXy + addY = 1&& role = 1)kind -= 2;break;x += addX; / X方向增加值y += addY; / Y方向增加值return kind;private int countDegree(int x, int y, char

6、 direction, int role) / 评价可落子点的等级int degree = 10;switch (direction) case 'a':if (degree >= kind(x, y, 0, 1, role) / 向右degree = kind(x, y, 0, 1, role);break;case 'b':if (degree >= kind(x, y, 1, 1, role) / 向右下degree = kind(x, y, 1, 1, role);break;case 'c':if (degree >=

7、 kind(x, y, 1, 0, role) / 向下degree = kind(x, y, 1, 0, role);break;case 'd':if (degree >= kind(x, y, 1, -1, role) / 向左下degree = kind(x, y, 1, -1, role);break;case 'e':if (degree >= kind(x, y, 0, -1, role) / 向左degree = kind(x, y, 0, -1, role);break;case 'f':if (degree >

8、;= kind(x, y, -1, -1, role) / 向左上degree = kind(x, y, -1, -1, role);break;case 'g':if (degree >= kind(x, y, -1, 0, role) / 向上degree = kind(x, y, -1, 0, role);break;case 'h':if (degree >= kind(x, y, -1, 1, role) / 向右上degree = kind(x, y, -1, 1, role);break;default:break;return deg

9、ree;private void searchKeyPoint() for (int i = 0; i < 19; i+) for (int j = 0; j < 19; j+) if (ChessPanel.chessArrayij != -1) / 搜索到一处有棋子if (j >= 1 && ChessPanel.chessArrayij - 1 = -1) keyPoint.insNewLastNode(i, j - 1, 'a', countDegree(i,j - 1, 'a', ChessPanel.chessArr

10、ayij),ChessPanel.chessArrayij);if (i >= 1 && j >= 1&& ChessPanel.chessArrayi - 1j - 1 = -1) keyPoint.insNewLastNode(i - 1, j - 1, 'b',countDegree(i - 1, j - 1, 'b',ChessPanel.chessArrayij),ChessPanel.chessArrayij);if (i >= 1 && ChessPanel.chessArrayi

11、- 1j = -1) keyPoint.insNewLastNode(i - 1, j, 'c', countDegree(i - 1, j, 'c', ChessPanel.chessArrayij),ChessPanel.chessArrayij);if (i >= 1 && j <= 17&& ChessPanel.chessArrayi - 1j + 1 = -1) keyPoint.insNewLastNode(i - 1, j + 1, 'd',countDegree(i - 1, j +

12、1, 'd',ChessPanel.chessArrayij),ChessPanel.chessArrayij);if (j <= 17 && ChessPanel.chessArrayij + 1 = -1) keyPoint.insNewLastNode(i, j + 1, 'e', countDegree(i,j + 1, 'e', ChessPanel.chessArrayij),ChessPanel.chessArrayij);if (i <= 17 && j <= 17&&am

13、p; ChessPanel.chessArrayi + 1j + 1 = -1) keyPoint.insNewLastNode(i + 1, j + 1, 'f',countDegree(i + 1, j + 1, 'f',ChessPanel.chessArrayij),ChessPanel.chessArrayij);if (i <= 17 && ChessPanel.chessArrayi + 1j = -1) keyPoint.insNewLastNode(i + 1, j, 'g', countDegree(i

14、+ 1, j, 'g', ChessPanel.chessArrayij),ChessPanel.chessArrayij);if (j >= 1 && i <= 17&& ChessPanel.chessArrayi + 1j - 1 = -1) keyPoint.insNewLastNode(i + 1, j - 1, 'h',countDegree(i + 1, j - 1, 'h',ChessPanel.chessArrayij),ChessPanel.chessArrayij);private void choosePoint() / AI落子int x = 0;int y = 0;if (keyPoint.length = 0) / 如果没有任何合适位置链表中没有可选位置while (true) Random r = new Random(); / 产生随机数int n1 = r.nextInt(10);int n2 = r.nextInt(10);n1 = Math.abs(r.nextInt() % 10); / 获取10以内整数n2 = Math.abs(r.nextInt() % 10);if (ChessPanel

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论