史上最聪明的五子棋的棋怎么写

录摘要................................................................................................................................................... 21 引
言 ........................................................................................................................................... 31.1 问题的提出 ........................................................................................................................ 31.2国内外研究的现状 ............................................................................................................. 31.3 人工智能 ............................................................................................................................ 41.3.1 五子棋数学思想 ................................................................................................... 41.3.2 五子棋人工智能 ................................................................................................... 51.4 任务与分析 ........................................................................................................................ 52.总体设计方案 ............................................................................................................................... 72.1 算法设计 ........................................................................................................................... 72.1.1 总体框架图 ............................................................................................................. 72.1.2 五子棋胜负判断算法 ............................................................................................. 82.1.2 五子棋人工智能算法 ............................................................................................. 83 程序运行平台 ............................................................................................................................. 111.开发环境 ................................................................................................................... 112.运行环境 ................................................................................................................... 114.模块分析 ..................................................................................................................................... 124.1 主界面模块 ..................................................................................................................... 124.2 棋盘的设计模块 ............................................................................................................. 134.3 棋盘的鼠标事件操作模块 ............................................................................................. 144.4 五子棋棋子设计模块 ..................................................................................................... 154.5 五子棋的胜负判断模块 ................................................................................................. 154.6 五子棋的人工智能模块 ................................................................................................. 175.系统测试 ..................................................................................................................................... 216.结论............................................................................................................................................. 25致谢................................................................................................................................................. 26参考文献 ......................................................................................................................................... 27 摘要近来,随着计算机的快速发展,以计算机作为对战平台,各种棋类游戏如雨后春笋般纷纷冒出,使得那些喜爱下棋,有常常苦于没有对手的棋迷们能随时过足棋瘾,而且这类软件个个水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军—卡斯帕罗夫的“深蓝”便是最具说服力的代表。当我们与电脑对战对时,您知道这些软件是怎样像人脑一样进行思考的吗?总的来说(我们假定您熟悉五子棋的基本规则),要让电脑知道该在哪一点下子,就要根据盘面的形式,为每一可能落子点计算其重要程度,也就是当这子落下后会形成什么模型,然后通览全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判断是远远不够的,这样下棋很容易掉进玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们需要使用好的算法是电脑能预测出今后几步的各种走法,以便做出最佳选择,这也是我们下棋时常说的“想了几步”。怎样才能达到这个程度呢?这是本文所要讨论的主要问题。作为一个五子棋游戏爱好者,在使用了众多的五子棋游戏软件后,发现当今大多数五子棋游戏软件中电脑的AI(人工智能)值不是很高,难与人脑抗衡,这是基于以上的最基本算法扩展而出的电脑最优落子算法不够优秀而造成的。本人使用JAVA语言作为开发工具,在吸收别人所编的五子棋游戏软件的基础上,再融入自己的创新思想(最优落子算法的改进),编写了这个五子棋游戏,软件实现了人机对弈和双人对弈的功能,游戏软件界面美观,操作容易,电脑的AI值也较高。关键字:五子棋、人工智能、JAVA21 引
言1.1 问题的提出五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。1.2国内外研究的现状近来,随着计算机的快速发展,以计算机作为对战平台,各种棋类游戏如雨后春笋般纷纷冒出,使得那些喜爱下棋,有常常苦于没有对手的棋迷们能随时过足棋瘾,而且这类软件个个水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军—卡斯帕罗夫的“深蓝”便是最具说服力的代表。当我们与电脑对战对时,您知道这些软件是怎样像人脑一样进行思考的吗?总的来说(我们假定您熟悉五子棋的基本规则),要让电脑知道该在哪一点下子,就要根据盘面的形式,为每一可能落子点计算其重要程度,也就是当这子落下后会形成什么模型,然后通览全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判断是远远不够的,这样下棋很容易掉进玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们需要使用好的算法是电脑能预测出今后几步的各种走法,以便做出最佳选择,这也是我们下棋时常说的“想了几步”。怎样才能达到这个程度呢?这是本文所要讨论的主要问题。作为一个五子棋游戏爱好者,在使用了众多的五子棋游戏软件后,发现当今大多数五子棋游戏软件中电脑的AI(人工智能)值不是很高,难与人脑抗衡,这是基于以上的最基本算法扩展而出的电脑最优落子算法不够优秀而造成的。本人使用JAVA语言作为开发工具,在吸收别人所编的五子棋游戏软件的基础上,再融入自己的创新思想(最优落子算法的改进),编写了这个五子棋游戏,软件实现了人机对弈和双人对弈的功能, 3游戏软件界面美观,操作容易,电脑的AI值也较高。1.3 人工智能1.3.1 五子棋数学思想可能很少有人注意到,五子连珠游戏其中包含着一个极为深刻的数学问题。为什么不是四子连珠,或者是六子连珠?你可能会说,四子连珠,那就太容易啦,下几步就胜了。而六子连珠呢,则太难了,谁也别想连成。这就说明,五子连珠极可能是一个最佳攻守平衡值,一个达成连珠的最大值。增一子、减一子都会打破这个平衡。四子连珠太易,攻方处于绝对优势;而六子连珠太难,守方处于绝对优势。而游戏规则必须是让游戏双方处于平等的位置才可能进行,否则游戏就不成其为游戏。要想黑白棋连珠成为一种符合游戏规则的智力游戏,五子连珠无疑是一个最佳方案。中华民族的祖先在发明五子连珠的过程中,猜想肯定也不是一蹴而就,而是极可能经历了四子连珠、六子连珠的尝试过程,最后才确定为五子连珠,并流行开来。这个问题,被当代科普作家傅小松称之为五子连珠问题,又称五子连珠猜想。其准确表述是:在以横线、竖线互相交叉(一般各为15条)的方形平面(棋盘)中,黑白两种“点”(棋子)先后沿横线、竖线排列(行棋),在平面(棋盘)横线、竖线、斜线(无实线连接)上形成连续的同色“点”(棋子),五个“点”(棋子)为可能达成连珠的最大值。五子连珠是黑白棋连珠的一个最佳方案,这在实际中早已不会有人怀疑。并且,五子连珠已经存在并发展了几千年,成为了一种趣味性强,同时技巧比较复杂、竞争激烈的棋类游戏,与围棋、国际象棋、中国象棋的巧妙性、复杂性也有一拼。这似乎足以证明五子连珠的最佳性。但从科学真理的角度看,一万次实践的证明也不能代替逻辑和数学上的证明。要确定五子连珠是黑白棋连珠的一个最佳方案,五子连珠是一个最佳值、最大值,必须进行数学上的证明。“五子连珠问题”的证明可能非常复杂,这是因为,第一,它不是一个静态的问题,而是一个动态的问题。棋盘是一个静态的二维平面,但行棋博弈是一个的动态的过程。第二,这不是一个线性和确定性问题的,而是一个非线性和模糊性问题。所谓“五子连珠”的最佳值,是在千变万化的攻与防中达到 4的一种默契。因此,要解决“五子连珠猜想”,可能要运用到博弈论、模糊数学等工具。1.3.2 五子棋人工智能人工智能(Artificial Intelligence,简称AI)是计算机学科的一个分支,二十世纪七十年代以来被称为世界三大尖端技术之一(空间技术、能源技术、人工智能)。也被认为是二十一世纪(基因工程、纳米科学、人工智能)三大尖端技术之一。这是因为近三十年来它获得了迅速的发展,在很多学科领域都获得了广泛应用,并取得了丰硕的成果,人工智能已逐步成为一个独立的分支,无论在理论和实践上都已自成一个系统。人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。人工智能将涉及到计算机科学、心理学、哲学和语言学等学科。可以说几乎是自然科学和社会科学的所有学科,其范围已远远超出了计算机科学的范畴,人工智能与思维科学的关系是实践和理论的关系,人工智能是处于思维科学的技术应用层次,是它的一个应用分支。从思维观点看,人工智能不仅限于逻辑思维,要考虑形象思维、灵感思维才能促进人工智能的突破性的发展,数学常被认为是多种学科的基础科学,数学也进入语言、思维领域,人工智能学科也必须借用数学工具,数学不仅在标准逻辑、模糊数学等范围发挥作用,数学进入人工智能学科,它们将互相促进而更快地发展。1.4 任务与分析设计一程序能完成五子棋游戏功能。五子棋规则:双方各执一色棋子,轮流下子(即将棋子放在棋盘的任一空交叉点上),直到有一方的棋子有5个排成一线(无论是横向、竖向还是斜向均可),则棋局结束,该方胜利。(1)设计游戏的核心算法;(2)设计可视化的界面且双方所使用的两色棋子和彩色棋盘得体大方、比例当;(3)双方轮流用键盘或鼠标下子。只有当鼠标单击在棋盘网格交叉点附 5近时才可下子,点击其他地方及已有子的位置不能下子,且应给出相应提示; 62.总体设计方案2.1 算法设计2.1.1 总体框架图 图2.1.1 系统总体框架图72.1.2 五子棋胜负判断算法五子棋的胜负(该软件默认是人下黑棋,电脑下白棋),在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图下图所示: 图11 判断胜负方向 2.1.2
算法流程图每当在棋盘上下一个棋子后,需要判断这个棋子的四个方向是否有连续的五个同色的棋子出现,这个需要一个二维数组来存储来存每个棋盘的坐标的颜色,还需要在每次下了棋子之后,遍历该棋盘的所有获胜的组合,来实现判断胜负。 2.1.2 五子棋人工智能算法当人下了一个棋子之后(人作为后手的第一次除外),电脑需要对棋盘进行全面的评估。1、获胜组合是一个三维数组,它记录了所有取胜的情况。也就是说,对于每一个落子坐标,获胜的组合一共有15 * 11 * 2 + 11 * 11 * 2 = 572种。而对于每个坐标的获胜组合,应该设置一个[15][15][572]大小的三维数组。 在拥有了这些获胜组合之后,就可以参照每个坐标的572种组合给自己的局面和玩家的局面进行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少进行权值的估算,给出最有利于自己的一步落子坐标。由于是双方对弈,所以游戏的双方都需要一份获胜组合,也就是:private boolean[][][] white_Win = new8boolean[15][15][572];//电脑的获胜组合private boolean[][][] black_Win = newboolean[15][15][572];//人的获胜组合在每次游戏初始化的时候,需要将每个坐标下可能的获胜组合都置为true。 此外,还需要设置计算机和玩家在各个获胜组合中所填入的棋子数: private int[][] win_Count = new int[2][572];//int[0][X] 为人(黑棋)的获胜组合中的棋子数// int[1][X] 为电脑(白棋)的获胜组合中的棋子数在初始化的时候,将每个棋子数置为0。2、每当一方落子后,都需要作如下处理:如果己方此坐标的获胜组合仍为true,且仍有可能在此获胜组合处添加棋子,则将此获胜组合添加棋子数加1;如果对方此坐标的获胜组合仍为true,则将对方此坐标的获胜组合置为false,并将对方此获胜组合添加棋子数置为-1(不可能靠此组合获胜)。白棋为例:for (int i = 0; i & 572; i++) { } if (white_Win[x][y][i] && win_Count[1][i] != -1) {
} if (black_Win[x][y][i]) {
} black_Win[x][y][i] = win_Count[0][i] = -1; win_Count[1][i]++;3、该电脑下棋的时候需要遍历棋盘所有的没有棋子的坐标4、找出该坐标然后进行下子打分,如果该坐标的获胜组和仍为true,则进 9行下白棋打分和下黑棋打分,基于攻击和防守的全面性,如果哪个棋子的分高就记录这个棋子的坐标,然后再此坐标上下白棋。103 程序运行平台1.开发环境? AMD .0GHz,1G内存,160G硬盘? Microsoft(R) Windows(TM) XP Professional? 语言:JAVA? 平台:Eclipse2.运行环境? Intel(R) Pentium(R) 2及以上处理器,32M以上内存,4G以上硬盘 ? Microsoft(R) Windows(TM) 9X/NT操作系统? 800*600或以上的屏幕分辨率114.模块分析4.1 主界面模块该模块设计思想是:将java的swing包导入,定义一个类实现主界面,在主窗口中添加菜单栏,在菜单项中添加事件的监听,当点击某个菜单项时,触发特定的事件,实现程序的开始和关闭。class ChessFrame extends JFrame {public static boolean computer_Start = public ChessFrame() {super.setTitle("五子棋");super.setSize(800, 800);super.setBackground(Color.WHITE);JMenu menuFile = new JMenu("菜单");JMenu newItem = new JMenu("新游戏");JMenuItem newItem_1 = new JMenuItem("先手");JMenuItem newItem_2 = new JMenuItem("后手");newItem.add(newItem_1);newItem.add(newItem_2);JMenuItem openItem = new JMenuItem("打开");JMenuItem closeItem = new JMenuItem("保存");JMenuItem exitItem = new JMenuItem("退出"); newItem_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("===选择了“新游戏==先手”菜单项");
newGame();ImagePanel.flag_NewGame = }});newItem_2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("===选择了“新游戏==后手”菜单项");
newGame();computer_Start =}}); openItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("===选择了“打开”菜单项");}12 }
} closeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("===选择了“保存”菜单项");
} }); exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("===选择了“退出”菜单项");
System.exit(0);
} }); menuFile.add(newItem); menuFile.add(openItem); menuFile.add(closeItem); menuFile.add(exitItem); JMenuBar menuBar = new JMenuBar(); menuBar.add(menuFile); super.setJMenuBar(menuBar); ImagePanel imagePanel = new ImagePanel(); super.add(imagePanel); super.setVisible(true); super.setResizable(false); super.setLocationRelativeTo(getOwner()); public void newGame() {
super.dispose();
T.start(); }4.2 棋盘的设计模块定义一个类(class ImagePanel extends JPanel implements MouseListener)这个类中画一个棋盘(棋盘以图片的形式存储在D盘的根目录下),通过覆写paint()方法实现,再把当前的类加载到主界面上,当初始化主界面的时候,JAVA默认会调用paint()方法: public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) 13 }
super.paintComponent(g2); //String picPath = "image/qipan.jpg"; String picPath = "d:" + File.separator +"qipan.jpg" ; Icon img = new ImageIcon(picPath); img.paintIcon(this, g, 121, 121);4.3 棋盘的鼠标事件操作模块由于棋盘添加了鼠标的监听事件,故在棋盘上的鼠标操作方法都要覆写,对当前下子采取鼠标的左键事件操作,当人点击鼠标的左键时(getButton()方法),触发左键事件,获得当前的坐标(getPoint() 方法),如果坐标在棋盘上,则继续计算该坐标和哪个交叉点最近,则把最近的交叉点记录下来:public void mouseClicked(MouseEvent e) { if (flag_NewGame) {
int c = e.getButton(); String mouseInfo = if (c == MouseEvent.BUTTON1) {
mouseInfo = "左键"; Point p = e.getPoint(); System.out.println(p.toString()); int x = (int) p.getX(); int y = (int) p.getY(); int xx = 0; int yy = 0; if (x &= 140 && x &= 630 && y &= 140 && y &= 630) {
int quotient_X = (x - 140) / 35; int compliment_X = (x - 140) % 35; int quotient_Y = (y - 140) / 35; int compliment_Y = (y - 140) % 35; if (compliment_X &= 17) { 14 xx = (quotient_X) * 35 + 140; } else if (compliment_X & 17) {
} if (compliment_Y &= 17) {
yy = (quotient_Y) * 35 + 140; quotient_X = quotient_X + 1; xx = quotient_X * 35 + 140; } else if (compliment_Y & 17) {
} System.out.println(xx + "---" + yy); quotient_Y = quotient_Y + 1; yy = quotient_Y * 35 + 140;4.4 五子棋棋子设计模块当记录下当前的坐标后,就要对棋盘进行画棋子(白棋和黑棋的绘制): 黑棋为例: public void paint_BLACk(Graphics g, int xx, int yy) {
} Graphics2D g2 = (Graphics2D) g2.setColor(Color.BLACK); g2.setStroke(new BasicStroke(2)); g2.fillArc(xx - 14, yy - 14, 30, 30, 0, 360);4.5 五子棋的胜负判断模块当任意的一方下子后都要判断这个棋子的四个方向是否组成五个相同的颜色的棋子(chess[][]存储当前棋盘所有的坐标棋子情况):public boolean isWin(int x, int y, int temp) {/*X为横坐标,Y为纵坐标,temp为当前颜色,chess[][]=0表示当前坐标没有棋子,chess[][]=1表示当前坐标为黑棋,chess[][]=2表示当前坐标为白棋*/ for (int i = 0; i & 11; i++) {//横
if (chess[i][y] == temp && chess[i + 1][y] == temp
&& chess[i + 2][y] == temp && chess[i + 3][y] == temp 15 }
&& chess[i + 4][y] == temp) { for (int j = 0; j & 11; j++) {//竖
} for (int m = 4; m & 15; m++) {//左斜
} for (int p = 0; p & 11; p++) {//右斜
for (int q = 0; q & 11; q++) {
} 16 if (chess[x][j] == temp && chess[x][j + 1] == temp
&& chess[x][j + 2] == temp && chess[x][j + 3] == temp && chess[x][j + 4] == temp) { for (int n = 0; n & 11; n++) {
} if (chess[m][n] == temp && chess[m - 1][n + 1] == temp
&& chess[m - 2][n + 2] == temp && chess[m - 3][n + 3] == temp && chess[m - 4][n + 4] == temp) { if (chess[p][q] == temp && chess[p + 1][q + 1] == temp
&& chess[p + 2][q + 2] == temp && chess[p + 3][q + 3] == temp && chess[p + 4][q + 4] == temp) { } }4.6 五子棋的人工智能模块1、获胜组合是一个三维数组,它记录了所有取胜的情况。也就是说,对于每一个落子坐标,获胜的组合一共有15 * 11 * 2 + 11 * 11 * 2 = 572种。而对于每个坐标的获胜组合,应该设置一个[15][15][572]大小的三维数组。 在拥有了这些获胜组合之后,就可以参照每个坐标的572种组合给自己的局面和玩家的局面进行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少进行权值的估算,给出最有利于自己的一步落子坐标。由于是双方对弈,所以游戏的双方都需要一份获胜组合,也就是:private boolean[][][] white_Win = newboolean[15][15][572];//电脑的获胜组合private boolean[][][] black_Win = newboolean[15][15][572];//人的获胜组合在每次游戏初始化的时候,需要将每个坐标下可能的获胜组合都置为true。 此外,还需要设置计算机和玩家在各个获胜组合中所填入的棋子数:private int[][] win_Count = new int[2][572];//int[0][X] 为人(黑棋)的获胜组合中的棋子数// int[1][X] 为电脑(白棋)的获胜组合中的棋子数在初始化的时候,将每个棋子数置为0。2、每当一方落子后,都需要作如下处理:如果己方此坐标的获胜组合仍为true,且仍有可能在此获胜组合处添加棋子,则将此获胜组合添加棋子数加1;如果对方此坐标的获胜组合仍为true,则将对方此坐标的获胜组合置为 17false,并将对方此获胜组合添加棋子数置为-1(不可能靠此组合获胜)。白棋为例: for (int i = 0; i & 572; i++) { } if (white_Win[x][y][i] && win_Count[1][i] != -1) {
} if (black_Win[x][y][i]) {
} black_Win[x][y][i] = win_Count[0][i] = -1; win_Count[1][i]++;3、该电脑下棋的时候需要遍历棋盘所有的没有棋子的坐标4、找出该坐标然后进行下子打分,如果该坐标的获胜组和仍为true,则进行下白棋打分和下黑棋打分,基于攻击和防守的全面性,如果哪个棋子的分高就记录这个棋子的坐标,然后再此坐标上下白棋。核心代码: private int[][] win_Count = new int[2][572]; private boolean[][][] white_Win = new boolean[15][15][572]; private boolean[][][] black_Win = new boolean[15][15][572]; private void computer_chess() {
int[][] black_Score = new int[15][15]; int[][] white_Score = new int[15][15]; int white_Temp_Score = 0; int black_Temp_Score = 0; int white_x = 0; int white_y = 0; int black_x = 0; int black_y = 0; 18
for (int i = 0; i & 15; i++) {
for (int j = 0; j & 15; j++) {
white_Score[i][j] = 0; if (chess[i][j] == 0) {
} black_Score[i][j] = 0; if (chess[i][j] == 0) {
for (int k = 0; k & 572; k++) {
if (black_Win[i][j][k]) {
switch (win_Count[0][k]) { 19 for (int k = 0; k & 572; k++) {
} if (white_Win[i][j][k]) {
} switch (win_Count[1][k]) { case 1:
white_Score[i][j] += 5; case 2:
white_Score[i][j] += 50; case 3:
white_Score[i][j] += 180; case 4:
} white_Score[i][j] += 400; }
black_Score[i][j] += 6; case 2:
black_Score[i][j] += 52; case 3:
black_Score[i][j] += 181; case 4:
} black_Score[i][j] += 410; for (int i = 0; i & 15; i++) {
for (int j = 0; j & 15; j++) {
if (chess[i][j] == 0) {
if (white_Score[i][j] &= white_Temp_Score) {
} if (black_Score[i][j] &= black_Temp_Score) {
black_x = black_y = black_Temp_Score = black_Score[i][j]; 20 white_x = white_y = white_Temp_Score = white_Score[i][j]; }
} if (white_Temp_Score &= black_Temp_Score) {
x = white_x; y = white_y;
} } } else {
} paint_WHITE(this.getGraphics(), x * 35 + 140, y * 35 + 140); white_Opera(x, y); x = black_x; y = black_y;5.系统测试1.先将tupian.jpg 放到 D:\ 下,运行Eclipse,打开FiveChess.java 文件,点击运行,出现主界面:21 图5.1.1主界面2.点击先手,开始: 图5.1.1先手开始 223.、点击棋盘的位置,然后下棋,当点击以下过棋子的地方,则提示: 图5.1.2下棋界面 图5.1.3提示界面234、当一方的五个相同的棋子连成一条线,则胜: 图5.1.4获胜界面246.结论首先我对本次的课程设计,我认为这次的重点便是人工智能算法的研究,发现电脑不是我们想象当中的那么好,其实电脑是很笨的,当我们给了他一个很好的算法之后,他就变得很聪明了,而算法的精髓在与数学和计算机的完美结合,一个好的算法可以解决很多很大的问题。算法的世界很广,一个优秀的程序员是不够的,要懂得很多很好的算法才能让我们的代码更有价值。通过这门课的学习能够更好地掌握算法设计与分析的理论部分的内容,同时将理论运用于实践,提高综合应用算法设计的能力,通过分析算法进而对算法进行优化。经过这一阶段的训练,使学生得到抽象能力、演绎推理能力、综合概括能力的提高。 25致谢对于本次的课程设计,我要感谢很多的老师和同学,在他们的帮助我顺利的完成了本次的课程设计。首先是算法设计的老师,他讲课的方式很不一样,使得我每次上他的课都格外的认真。他总是给我们仔细的讲解各个知识点,然后给我们提供其他的参考资料,让我们下了课以后方便自己学习。还有就是我这次的课程设计指导老师,我们有什么问题直接找他,他总是可以帮我们解决。还有就是我的几个同学,在编辑程序的方便,他们给了我很多的帮助,帮助我讲解很多程序的编写格式。总之,谢谢大家的帮助。26参考文献[1]
《算法设计与分析》 宋
文等编 重庆大学出版社,2001。[2]
《算法设计与分析》 周培德
电子工业出版社,
《算法设计与分析》 王晓东
电子工业出版社,
《算法设计与分析(第2版)》吕国英 等 清华大学出版社.2009[5]
《算法设计与分析》 周培德
电子工业出版社,2000。27
欢迎转载:
推荐:    

我要回帖

更多关于 史上最聪明的五子棋 的文章

 

随机推荐