人工智能 井字棋
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能井字棋
学院:信息工程学院
教师:罗会兰
专业:计算机软件和理论
学号:6120160090
姓名:朱玲
简述
5月23日,当今世界围棋第一人柯洁与计算机围棋程序“阿尔法狗”(Alpha Go)的第一场比赛结束,“阿尔法狗”以四分之一子优势赢得首场胜利。这场比赛双方耗时4小时17分37秒,其中柯洁用时2小时46分43秒,“阿尔法狗”用时1小时30分54秒。
除了围观和好奇,人类骨子里的不服输以及想要看看人工智能到底有多厉害的求胜欲促成了这一挑战。面对人类棋手注定完败于人工智能的结局,人类要做好的准备是全面迎接而非拒绝人工智能,努力去掌控而非臣服于人工智能。
接纳人工智能是今天社会发展、经济增长、人类演化的必然,更是人们生活的需求。其实,很多人每天离不开的智能手机就是低端人工智能的应用。更应当看到的现实是,人工智能的发展极具竞争性,未来谁在人工智能的研发和应用中落后,谁就会被淘汰。
而井字棋游戏的诞生更是吸引着不同年龄段的人群,无论男女老少都可以玩,也都喜欢玩,而当前微型计算机已经是在广大人群中流行者,用电脑来下井字棋更是一种时尚。现在网络上出现了各种各样的井字棋软件,有大师级的,新手级的等等。这些都满足了不同人群的需要,所以当前井字棋越来越被许多人所熟悉。目前的井字棋程序的发展也非常快,从最初的双人发展到人机,然后到现在的网络对战,已经受到越来越多人的喜爱和重视。
井字棋不但容易上手,而且它区别于别的游戏,它不但能使人娱乐,而且能使人的头脑变的更加聪明。而井字棋有两种对战模式,一是人机对战,二十人人对战。这些给人无限乐趣的用途正式人工智能的杰作。正因为这样它鼓励着人们对它不断的研究,这在很大程度上促进了人工智能的发展,反过来人工智能的理论和技术上的突破能够使井字棋程序更加完美,更受欢迎。
这是一个具有简单功能的井字棋游戏。本设计的主要完成的是井字棋的人机对弈问题,即计算机与人交替落子,当行、列或对角有连续三个以上(包括三个)相同一方棋时,则判定一方胜利,如果所有位置都已经下满,且没有哪一方赢棋,则为和局。
本设计的程序实现了井字棋的人机对弈,具体功能为:
1.在程序界面中挥之游戏棋盘,可以是三乘三,四乘四,五乘五。显示游戏状态,其中游戏状态包括难度等级,有初级,中级和高级三种模式。还包括哪方先下,当前轮到哪方下等等。
2.玩家执红,计算机为蓝方。
3.可以设置谁先下,设置游戏难度等级,设置棋盘块数。
要完成此设计则需—判定胜负函数及一计算机自行落子函数,一旦这两个函数完成则此程序主要部分可完成。本次设计提高了我们程序设计能力、培养自学能力。提高了我们的分析问题以及解决问题的能力。还提高了我们收集资料、查找参考书的能力以及锻炼书写报告的能力。
功能分析
此设计是具有简单功能的井字棋游戏。本设计的主要完成的是井字棋的人机对弈问题,即计算机与人交替落子,当行、列或对角有连续三个以上(包括三个)相同一方棋时,则判定一方胜利,如果所有位置都已经下满,且没有哪一方赢棋,
则为和局。具体功能模块图如下:
这是一个智能型的井字棋游戏,机器可以模拟人与用户对弈。当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
面向对象设计
这是一个智能型的井字棋游戏,机器可以模拟人与用户对弈。当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
系统流程图如下图所示:
图1游戏流程图
井字棋是一个流传已久的传统游戏。游戏由两个人轮流来下,分别用“X”和“O”
来代替自身的棋子。双方可以在轮到自己下的时候,可以用棋子占领其中一个空的格子。如果双方中有一方的棋子可以连成一条直线,则这一方判胜,对方判负。当所有的格子都被占领,但双方都无法使棋子连成一条直线的话,则判和棋。
这是一个智能型的井字棋游戏,机器可以模拟人与用户对弈。当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。另外利用α-β剪枝,使机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
游戏时一方是电脑,另一方是玩家。所以,这类游戏在开始时有两种方式:一种是玩家先走;另一种是电脑先走。这是我们要考虑的第一个问题。然后,设计游戏的棋盘数和难易级别等,棋盘数分为三乘三、四乘四、五乘五,以及难易级别分为初级、中级和高级三个级别。当游戏结束后,又要提示玩家游戏结果,如“恭喜您,您赢了”、“笨蛋,你输了”和与电脑平手的结果。还有一部分设计的是游戏的管理界面,分为游戏开始、结束和退出。然后测试该游戏,是否达成预想结果,完成预想功能。
在用户界面方法,用一个3×3的井字格来显示用户与机器下的结果。当要求用户输入数据的时候会有提示信息。用户在下的过程中可以中途按下“0”退出。当用户与计算机分出了胜负后,机器会显示出比赛的结果。总体E-R图如下图2所示:
图2游戏总体E-R图
程序实现
源码分析
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import ng.*;
import java.util.*;
//import yout.*;
public class ChessFrame extends JFrame{
///游戏界面参数
private Container contentPane;
private JPanel upPanel;
private JPanel leftPanel;
private JPanel centerPanel;
private JPanel rightPanel;
private JPanel downPanel;
private JComboBox level; //游戏级别
private JComboBox size; //棋盘大小
private JRadioButton cb1; //单选按钮,玩家先手
private JRadioButton cb2; //单选按钮,电脑先手
private JButton b4; //开始
private JButton b5; //结束
private JButton b6; //退出按钮
private JButton b[][]; //棋盘按钮
private JLabel b1; //欢迎词
private JLabel b11;
private JLabel b12;
private JLabel b2; //棋局状况
private JLabel b3; //棋局结果
private JLabel b31;
private JLabel b32;
//程序参数
private int startturn; //先下棋的一方,1代表玩家,2代表电脑private int a[][]; //棋盘信息,0代表无棋子,1代表玩家下的棋子,2代表电脑下的棋子
private int result; //棋局结果,1代表玩家赢,2代表电脑赢,3代表平手
private int c_size; //棋盘大小,本游戏中有3乘3,4乘四,5乘5三种棋盘
private int c_level; //游戏级别,低级,中级,高级分别对应0,1,2 private int x; //玩家出的棋子所在位置的行号
private int y; //玩家所出棋子所在的列号
public ChessFrame(){