java课程设计人机对弈五子棋

合集下载

java五子棋课程设计

java五子棋课程设计

java五子棋课程设计一、课程目标知识目标:1. 学生能理解五子棋游戏的基本规则和胜负判断方法。

2. 学生掌握Java编程语言的基本语法,如变量声明、循环结构、条件判断等。

3. 学生能运用面向对象编程思想,设计五子棋游戏的相关类和对象。

技能目标:1. 学生能运用所学知识,独立编写五子棋游戏的代码,实现人机对战和胜负判断功能。

2. 学生通过编程实践,提高解决问题的能力和逻辑思维能力。

3. 学生能运用调试工具,优化代码,提高程序的执行效率和稳定性。

情感态度价值观目标:1. 学生在编程过程中,培养耐心、细心和团队合作精神。

2. 学生通过五子棋游戏,体验编程的乐趣,激发对计算机科学的兴趣和求知欲。

3. 学生在学习过程中,树立正确的竞争观念,学会尊重对手,公平竞争。

课程性质:本课程为实践性课程,注重培养学生的动手能力和编程思维。

学生特点:五年级学生,具备一定的计算机操作能力和逻辑思维能力,对编程有浓厚兴趣。

教学要求:结合学生特点,注重理论与实践相结合,以学生为主体,引导学生主动探究、合作学习,培养其编程素养。

将课程目标分解为具体的学习成果,以便在教学设计和评估中有的放矢。

二、教学内容1. 五子棋游戏规则及胜负判断方法介绍- 游戏规则讲解- 胜负判断方法分析2. Java基本语法复习- 数据类型与变量- 循环结构(for、while)- 条件判断(if-else、switch)3. 面向对象编程思想- 类与对象- 封装、继承、多态4. 五子棋游戏设计与实现- 游戏界面设计- 游戏逻辑实现(人机对战、胜负判断)- 代码编写与调试5. 教学内容的安排与进度- 第一节课:五子棋游戏规则介绍,Java基本语法复习- 第二节课:面向对象编程思想学习,五子棋游戏设计思路分析- 第三节课:五子棋游戏代码编写与调试,实现人机对战和胜负判断功能6. 教材章节及内容关联- 第五章:面向对象编程- 第六章:数组与字符串- 第七章:异常处理与调试技巧教学内容依据课程目标进行选择和组织,保证科学性和系统性。

《JAVA五子棋程序设计》课程设计

《JAVA五子棋程序设计》课程设计

计算机与信息工程系《JAVA程序实训》设计五子棋游戏摘要:计算机人机对弈作为人智能研究的一个重要分支,计算机博弈是检验人工水平的一个重要方面。

它的研究为人工智能带来了很多重要的方法和理论,产生了广泛的社会影响和学术影响。

五子棋人机对弈是计算机博弈中的一种。

研究其计算机算法,可以让我们看到人工智能的稚形,也有助于我们人脑的开发。

五子棋是我国发明的,研究它可以让更多的外国人了解五子棋,这有助于我国优秀文化的推广。

关键词:人工智能,计算人机对弈,五子棋,算法 , java1.课程设计介绍1.1课程设计目的通过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、NetBeans等开发工具的运用,拓宽常用类库的应用。

使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。

本次课程设计每人一组,自行设计并实现共功能模块。

1.2课程设计任务实现五子棋游戏,要求:使用图形用户界面,实现人人对战,人机对战。

能够判断输赢,有“开始”按钮,当出现棋盘后,按此按钮进入对战状态。

当有胜利者(垂直、水平、对角线连续5子),显示对话框,提示谁(黑还是白)胜利了。

若当棋盘满了还无胜利者,显示平局对话框。

有“悔棋”按钮,玩家可以点击悔棋,回到上一步。

1.3课程设计论文编写要求(1)要按照书稿的规格打印与写课程设计论文;(2)论文包括目录、设计思路、具体实现、运行调试与分析讨论、设计体会与小结、参考文献、附录(源代码)等;(3)课程设计论文装订按学校的统一要求完成。

2.系统设计2.1需求分析2.1.1性能需求一款小游戏的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求,其中玩家的实际需求最为重要.面对游戏拥有不同知识和理解层面的玩家,游戏制作人对玩家需求的理解程度,在很大程度上决定了此类游戏开发的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给游戏制作人,保证开发过程按照满足玩家需求为目的正确开发方向进行,是每游戏游戏制作人需要面对的问题。

java五子棋课程设计报告总结

java五子棋课程设计报告总结

课程设计报告:Java五子棋1. 背景五子棋是一种两人对弈的策略棋类游戏,它的目标是在一个棋盘上先将自己的五个棋子连成一条线,可以是横线、竖线、斜线等。

五子棋具有简单规则、易于上手、趣味性强等特点,因此在各个年龄段都备受欢迎。

本次课程设计旨在使用Java语言实现一个简单的五子棋游戏,并通过该项目来提高学生对面向对象编程和图形用户界面开发的理解和实践能力。

2. 分析2.1 需求分析根据五子棋游戏的规则,我们需要实现以下功能:•创建一个可视化的游戏界面,包括棋盘和落子提示•实现落子操作,玩家可以通过点击鼠标来在合法位置落下自己的棋子•判断胜负条件,当任意一方连成五个棋子时,游戏结束并宣布胜利者•提供重新开始和退出游戏的选项2.2 设计思路为了实现上述功能,我们将采取以下设计思路:•使用Java Swing库来创建游戏界面,包括棋盘和落子提示•使用二维数组来表示棋盘,并通过判断数组中的元素来确定当前位置是否已经有棋子•使用鼠标事件监听器来实现玩家的落子操作•使用算法判断胜负条件,例如遍历棋盘判断是否有五个连续的棋子•使用菜单栏和对话框来实现重新开始和退出游戏的选项3. 实现3.1 游戏界面设计我们将使用Java Swing库来创建游戏界面。

首先,我们需要创建一个主窗口,并设置其大小、标题和布局。

然后,在主窗口上添加一个棋盘面板和一个状态栏面板。

在棋盘面板上,我们使用GridLayout布局将其分割为15行15列的格子。

每个格子可以是一个按钮,用于玩家落子操作。

同时,我们还需要在每个格子上显示当前位置是否已经有棋子。

在状态栏面板上,我们将显示当前玩家的提示信息(轮到哪一方落子)以及胜利者信息(如果有)。

3.2 落子操作实现为了实现玩家的落子操作,我们需要使用鼠标事件监听器。

当玩家点击某个格子时,程序会捕捉到鼠标点击事件,并根据当前玩家的身份在对应的位置上落下棋子。

为了判断当前位置是否已经有棋子,我们可以使用一个二维数组来表示棋盘。

Java语言程序设计的课程设计项目——利用Java实现人机五子棋游戏项目完整实现实例(第1部分)

Java语言程序设计的课程设计项目——利用Java实现人机五子棋游戏项目完整实现实例(第1部分)

1.1Java语言程序设计的课程设计项目——利用Java实现人机五子棋游戏项目完整实现实例(第1部分)1.1.1项目预演1、新建一个Java项目,名称为BackGammonGame五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

2、切换到Navigator视图3、拷贝程序和图像文件4、执行启动程序5、最后出现下面的程序启动画面6、主程序窗口开始游戏时游戏界面是没有棋子ide,也就是棋盘的初始化状态。

传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。

两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。

如何判断输赢:当某方下一子后,计算与当前棋子相邻的四个方向(\ 、/、|和—)的同色棋子的各数,大于四则分出胜负,否则继续下子过程。

1.1.2项目中的各个模块说明1、人机五子棋游戏启动程序类BackGammonGameApp(1)类名称为BackGammonGameApp,包名称为com.px1987.backgammongame(2)程序的主要流程1)系统初始化2)主循环控制模块3)玩家下子4)盘面分析填写棋型表5)电脑下子6)胜负判断(3)主控制程序BackGammonGameApp代码实例package com.px1987.backgammongame;import javax.swing.SwingUtilities;import com.px1987.backgammongame.mainframe.BackGammonGameMainFrame;import com.px1987.backgammongame.splashframe.SplashImageJWindow;import com.px1987.backgammongame.util.BackGammonGameUtils;public class BackGammonGameApp {public BackGammonGameApp() {}public static void main(String[] args){SplashImageJWindow oneSplashImageJWindow=new SplashImageJWindow();BackGammonGameUtils.systemInitAndLoadResource(oneSplashImageJWindow);oneSplashImageJWindow.dispose(); //系统后台初始化完毕,则关闭快闪屏窗口并释放该窗体的资源oneSplashImageJWindow=null;SwingUtilities.invokeLater(new Runnable() { //下面的代码实现实时刷新Swing界面public void run() {BackGammonGameMainFrame backGammonGameMainFrame=new BackGammonGameMainFrame();backGammonGameMainFrame.setVisible(true);}});}}2、人机五子棋游戏全局工具类BackGammonGameUtils(1)类名称为BackGammonGameUtils,包名称为com.px1987.backgammongame.util 工具类的主要作用?类中的方法有声明要求?(2)systemInitAndLoadResource()方法实现系统初始化后台加载主线程是在程序启动时自动创建的,但它可以由一个Thread对象控制。

java五子棋课程设计报告总结

java五子棋课程设计报告总结

java五子棋课程设计报告总结一、引言五子棋是一种古老的棋类游戏,它的规则简单易懂,但是却有很高的策略性和趣味性。

在计算机科学领域中,五子棋也是一个重要的研究对象。

本次课程设计旨在通过使用Java语言实现一个简单的五子棋游戏,并且了解一些基本的人工智能算法。

二、需求分析1. 功能需求(1)实现基本的五子棋游戏功能,包括落子、判断胜负等。

(2)实现人机对弈功能,即用户可以选择与计算机进行对弈。

(3)实现网络对战功能,即用户可以选择与其他玩家进行在线对弈。

2. 非功能需求(1)界面美观、易用性好。

(2)程序运行稳定、流畅。

三、设计方案1. 界面设计使用Java Swing库来实现程序界面。

主要包括菜单栏、工具栏和游戏主界面。

菜单栏包括文件菜单和帮助菜单;工具栏包括开始新游戏、悔棋和撤销悔棋等按钮;游戏主界面包括棋盘和落子动画等。

2. 程序设计(1)基本数据结构使用二维数组来存储棋盘的状态,其中0表示空位,1表示黑子,2表示白子。

使用栈来实现悔棋和撤销悔棋功能。

(2)游戏逻辑通过监听鼠标点击事件来实现用户落子。

每次落子后判断胜负,并且交换下一步落子的颜色。

在人机对弈模式下,计算机会根据当前局面使用基本的博弈树搜索算法来选择最优的落子位置。

(3)网络对战使用Socket编程实现网络对战功能。

用户可以选择创建游戏或加入游戏。

创建游戏后等待其他玩家加入,加入游戏后与对方进行对弈。

四、实现过程1. 界面实现使用Java Swing库中的各种组件来实现程序界面,并且通过布局管理器来控制组件的位置和大小。

2. 程序实现(1)基本数据结构和游戏逻辑的实现比较简单,主要是通过循环和条件语句来控制程序流程。

(2)人工智能算法的实现比较复杂。

我们采用了基本的博弈树搜索算法,在每次落子后生成当前局面下所有可能的落子位置,并且评估每个位置的得分,选择得分最高的位置作为计算机下一步的落子位置。

(3)网络对战功能的实现涉及到Socket编程和多线程编程等技术,需要仔细考虑各种异常情况和线程同步问题。

五子棋人机对战java代码(可打印修改)

五子棋人机对战java代码(可打印修改)
3
int tempy=j*24+58; g.drawImage(whiteImage1, tempx, tempy, 15, 15, this); } } } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { if(canplay) { x=e.getX(); y=e.getY(); if(x>=18&&x<=379&&y>=58&&y<=580) { x=(x-18)/24; y=(y-58)/24; //判断该坐标是否有棋子,没有则放棋子,有则显示已经有棋子对话框 if(allqz[x][y]==0) { //玩家鼠标点击的坐标设置为放黑子标志 allqz[x][y]=1; message="白方走棋"; this.repaint(); boolean Winflag=this.Win(); if(Winflag) { JOptionPane .showMessageDialog(this, "游戏结束:"+(allqz[x] [y]==1?"黑方胜":"白方胜")); canplay=false; } if(canplay) { //电脑通过最优算法获得最能够阻止玩家的黑棋成为5连得坐标x,y 并把这个坐标设置为放白子标记 //allqz[x][y]=2;
//把棋盘清空---将allqz[][]全部数据清零 allqz=new int[15][15]; //将游戏信息提示变回出示位置 message="黑方先行"; this.repaint(); } } if(e.getX()>=401&&e.getX()<=469&&e.getY()>=151&&e.getY()<=179) { JOptionPane.showMessageDialog(this, "这是一个简易五子棋游戏,玩家 持黑棋,电脑持白棋,"); JOptionPane.showMessageDialog(this, "任一方先在棋盘上形成横向、竖 向、斜向的连续的相同颜色的五个(含五个以上)棋子的一方为胜!"); } if(e.getX()>=401&&e.getX()<=469&&e.getY()>=252&&e.getY()<=280) {

java课程设计五子棋

java课程设计五子棋

java课程设计五子棋一、课程目标知识目标:1. 理解五子棋游戏的规则及基本算法。

2. 掌握Java编程语言的基本语法,如变量声明、条件语句、循环结构等。

3. 学会使用Java中的数组进行数据存储和处理。

4. 了解面向对象编程的基本概念,如类的定义、对象创建和使用。

技能目标:1. 能够编写出实现五子棋游戏核心功能(如棋盘绘制、落子判断、胜负判断)的Java程序。

2. 通过编程实践,提升问题分析能力,学会将现实问题转化为计算机程序解决问题。

3. 能够使用合适的调试工具检查和修复程序中的错误,提高代码调试能力。

4. 培养良好的编程习惯,如编写规范的注释、合理的变量命名等。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发其探究计算机科学领域的好奇心。

2. 鼓励学生积极合作,通过小组讨论和交流,培养团队协作精神。

3. 培养学生的逻辑思维能力和创新意识,使其在面对问题时能够主动思考、寻找解决方案。

4. 增强学生的自信心,使其在完成五子棋项目的过程中感受到编程带来的成就感。

课程性质分析:本课程为实践性较强的学科项目,结合Java编程语言,以五子棋游戏为载体,引导学生学习编程知识,培养其编程技能。

学生特点分析:学生处于能够理解编程基本概念,具备初步编程能力的阶段,对实际项目充满兴趣,希望将所学知识应用于实际问题。

教学要求:教师应注重理论与实践相结合,引导学生主动探索,关注学生个体差异,提供个性化指导,确保学生在完成课程目标的同时,提高编程能力和综合素质。

二、教学内容1. Java基本语法复习:变量声明与赋值、数据类型、运算符、条件语句(if-else、switch)、循环结构(for、while)。

相关教材章节:第一章至第三章。

2. 数组的使用:一维数组的定义、初始化、遍历;二维数组的应用。

相关教材章节:第四章。

3. 面向对象基础:类的定义、属性、方法;对象的创建与使用。

相关教材章节:第五章。

4. 五子棋游戏设计:a. 棋盘绘制:使用二维数组表示棋盘,绘制初始界面。

JAVA课程设计 五子棋(内附完整代码)

JAVA课程设计 五子棋(内附完整代码)

JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。

五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。

有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。

2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。

和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。

不过一般爱好者不需要遵循这么多规则。

二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。

public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}用类ChessFrame创建五子棋游戏主窗体和菜单import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", null,"棋盘",null,"模式", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("改进棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("扩大棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对战")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessModel {规定棋盘的宽度、高度、棋盘的模式private int width,height,modeChess;规定棋盘方格的横向、纵向坐标private int x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子private int[][] arrMapShow;交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}设置交换棋手的标识符public void setisOdd(boolean isodd){ if(isodd)this.isOdd=true;elsethis.isOdd=false;}获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}获取棋盘宽度public int getWidth(){return this.width;}获取棋盘高度public int getHeight(){return this.height;}获取棋盘模式public int getModeChess(){return this.modeChess;}获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子if(!chessExist(i,j)){判断白子的最大值max_white=checkMax(i,j,2);判断黑子的最大值max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}记录电脑下子后的横向坐标public void setX(int x){this.x=x;}记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}获取电脑下子的横向坐标public int getX(){return this.x;}获取电脑下子的纵向坐标public int getY(){return this.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度private int width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。

java课程设计人机对弈五子棋

java课程设计人机对弈五子棋

《Java程序设计》课程设计报告学院:理学院班级:姓名:学号:指导教师:课设时间: 2015-06-23 至2015-06-25二O一五年六月二十五日课程设计(论文)任务书理学院信息与计算科学专业2012-2班一、课程设计(论文)题目:人机对弈五子棋游戏二、课程设计(论文)工作:自2015 年6 月23 日起至2015 年6 月25日止三、课程设计(论文) 地点: 5-205四、课程设计(论文)内容要求:1.本课程设计的目的(1)使学生掌握软件开发的基本工作流程;(2)巩固JAVA程序设计课程所学的内容;(3)培养学生的计算机思维能力以及合作的精神;(4)培养学生分析、解决问题的能力;(5)提高学生的科技论文写作能力。

2.课程设计的任务及要求1)基本要求:(1)研究课程设计任务,并进行系统需求分析;(2)对系统进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码;(4)系统组装,测试、完善系统。

2)创新要求:在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求(1)要按照书稿的规格打印誊写课程设计论文(2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成4)参考文献:(1)丁振凡,《JAVA语言程序设计》,清华大学出版社(2)丁振凡,《JAVA语言程序设计实验指导与习题解答》,清华大学出版社(3)/5)课程设计进度安排内容天数地点系统总体设计 1 实验室软件设计及调试 1 实验室答辩及撰写报告 1 实验室、图书馆学生签名:2015年6月25日课程设计(论文)评审意见(1)课程设计过程(20分):优()、良()、中()、一般()、差();(2)是否完成调试,系统运行效果(30分):优()、良()、中()、一般()、差();(3)回答问题(20分):优()、良()、中()、一般()、差();(4)课程设计报告(30分):优()、良()、中()、一般()、差();(5)格式规范性及考勤是否降等级:是()、否()评阅人:职称:教授2015年 6月25日人机对弈五子棋游戏设计摘要:近些年来五子棋游戏成为了人们的最爱,游戏的下载量很高可以说一直排在前几位,也是人们日常生活中放松娱乐的最爱,特别是最近IT行业的发展,人工智能的实现,移动客户端的发展和普及为我们五子棋游戏的发展带来了新的生机,新的高潮,人工智能与五子棋的完美结合是五子棋的又一项重要发展,而我们现在开发的人机对弈更是掀起了五子棋发展的新篇章,为五子棋的发展与传播提供了新的机会,但是机会与挑战并存,我们相信通过我们对五子棋程序的不断优化和完善,五子棋一定会越来越受到大家的欢迎。

java五子棋(人机版1.2)

java五子棋(人机版1.2)

Java五子棋人机版1.2public class FiveChessFinally_005_ok {private static char[][] chess = new char[17][17];private static Random r = new Random();private static int s = 0;private static boolean win = true;private static Scanner sc = null;private static String str = null;private static int first = 0;private static int f1 = 0, f2 = 0;private static int c1 = 0, c2 = 0;private static int x1 = 0, y1 = 0, x2 = 0, y2 = 0;private static int z = 0;public static void structure() {char[] ches = { ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };for (int i = 0; i < ches.length; i++) {chess[0][i] = chess[i][0] = ches[i];}for (int i = 1; i < chess.length; i++) {for (int j = 1; j < chess[i].length; j++) {chess[i][j] = '.';}}}public static void printChess() {for (int i = 0; i < chess.length; i++) {for (int j = 0; j < chess[i].length; j++) {System.out.print(chess[i][j] + " ");}System.out.println();}}public static boolean isRational(char a, char b) {if (((a >= '0' && a <= '9') || (a >= 'a' && a <= 'f'))&& ((b >= '0' && b <= '9') || (b >= 'a' && b <= 'f'))) { int x = 0, y = 0;for (int i = 1; i < chess.length; i++) {if (chess[i][0] == a)x = i;if (chess[0][i] == b)y = i;}if (chess[x][y] == 'o' || chess[x][y] == 'x')return false;elsereturn true;}return false;}public static boolean isWin(char a) {for (int i = chess.length - 1; i > 4; i--) {for (int j = 1; j < chess[0].length; j++) {if (j > 4) {if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j - 1])&& (chess[i - 1][j - 1] == chess[i - 2][j - 2])&& (chess[i - 2][j - 2] == chess[i - 3][j - 3])&& (chess[i - 3][j - 3] == chess[i - 4][j - 4])) {return true;}}if (j < chess[i].length - 4) {if (((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& (chess[i - 1][j] == chess[i - 2][j])&& (chess[i - 2][j] == chess[i - 3][j]) && (chess[i - 3][j] == chess[i - 4][j]))|| ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j + 1])&& (chess[i - 1][j + 1] == chess[i - 2][j + 2])&& (chess[i - 2][j + 2] == chess[i - 3][j + 3]) && (chess[i - 3][j + 3] == chess[i - 4][j + 4]))|| ((chess[i][j] == a)&& (chess[i][j] == chess[i][j + 1])&& (chess[i][j + 1] == chess[i][j + 2])&& (chess[i][j + 2] == chess[i][j + 3]) && (chess[i][j + 3] == chess[i][j + 4]))) {return true;}} else {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& (chess[i - 1][j] == chess[i - 2][j])&& (chess[i - 2][j] == chess[i - 3][j])&& (chess[i - 3][j] == chess[i - 4][j])) {return true;}}}}return false;}public static void gamer(char a, char b) {int x = 0, y = 0;for (int i = 1; i < chess.length; i++) {if (chess[i][0] == a)x = i;if (chess[0][i] == b)y = i;}if (first == 0) {f1 = x;f2 = y;}chess[x][y] = 'o';}public static void firstOneChess() {int x = f1, y = f2;int i = r.nextInt(8);switch (i) {case 0:chess[x - 1][y - 1] = 'x';break;case 1:chess[x - 1][y] = 'x';break;case 2:chess[x - 1][y + 1] = 'x';break;case 3:chess[x][y - 1] = 'x';break;case 4:chess[x][y + 1] = 'x';break;case 5:chess[x + 1][y - 1] = 'x';break;case 6:chess[x][y + 1] = 'x';break;case 7:chess[x + 1][y + 1] = 'x';break;}}public static void computerStep() {chess[c1][c2] = 'x';}public static boolean isFour(char a) {for (int i = chess.length - 1; i > 3; i--) {for (int j = 1; j < chess[0].length; j++) {if (j > 3) {if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j - 1])&& (chess[i - 1][j - 1] == chess[i - 2][j - 2])&& (chess[i - 2][j - 2] == chess[i - 3][j - 3])) {x1 = i - 3;y1 = j - 3;x2 = i;y2 = j;z = 3;if (a == 'o') {if (isNullFour('o'))return true;} else if (a == 'x') {if (isNullFour('x'))return true;}}}if (j < chess[i].length - 3) {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& (chess[i - 1][j] == chess[i - 2][j])&& (chess[i - 2][j] == chess[i - 3][j])) {x1 = i - 3;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isNullFour('o'))return true;} else if (a == 'x') {if (isNullFour('x'))return true;}}if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j + 1])&& (chess[i - 1][j + 1] == chess[i - 2][j + 2])&& (chess[i - 2][j + 2] == chess[i - 3][j + 3])) { x1 = i;y1 = j;x2 = i - 3;y2 = j + 3;z = 4;if (a == 'o') {if (isNullFour('o'))return true;} else if (a == 'x') {if (isNullFour('x'))return true;}}if ((chess[i][j] == a) && (chess[i][j] == chess[i][j + 1]) && (chess[i][j + 1] == chess[i][j + 2])&& (chess[i][j + 2] == chess[i][j + 3])) { x1 = i;y1 = j;x2 = i;y2 = j + 3;z = 1;if (a == 'o') {if (isNullFour('o'))return true;} else if (a == 'x') {if (isNullFour('x'))return true;}}} else {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& (chess[i - 1][j] == chess[i - 2][j])&& (chess[i - 2][j] == chess[i - 3][j])) {x1 = i - 3;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isNullFour('o'))return true;} else if (a == 'x') {if (isNullFour('x'))return true;}}}}}return false;}public static boolean isThree(char a) {for (int i = chess.length - 1; i > 2; i--) {for (int j = 1; j < chess[0].length; j++) {if (j > 2) {if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j - 1])&& (chess[i - 1][j - 1] == chess[i - 2][j - 2])) {x1 = i - 2;y1 = j - 2;x2 = i;y2 = j;z = 3;if (a == 'o') {if (isNullThree('o'))return true;} else if (a == 'x') {if (isNullThree('x'))return true;}}}if (j < chess[i].length - 2) {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& (chess[i - 1][j] == chess[i - 2][j])) {x1 = i - 2;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isNullThree('o'))return true;} else if (a == 'x') {if (isNullThree('x'))return true;}}if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j + 1])&& (chess[i - 1][j + 1] == chess[i - 2][j + 2])) { x1 = i;y1 = j;x2 = i - 2;y2 = j + 2;z = 4;if (a == 'o') {if (isNullThree('o'))return true;} else if (a == 'x') {if (isNullThree('x'))return true;}}if ((chess[i][j] == a) && (chess[i][j] == chess[i][j + 1])&& (chess[i][j + 1] == chess[i][j + 2])) {x1 = i;y1 = j;x2 = i;y2 = j + 2;z = 1;if (a == 'o') {if (isNullThree('o'))return true;} else if (a == 'x') {if (isNullThree('x'))return true;}}} else {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& (chess[i - 1][j] == chess[i - 2][j])) {x1 = i - 2;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isNullThree('o'))return true;} else if (a == 'x') {if (isNullThree('x'))return true;}}}}}return false;}public static boolean isLeftThree(char a) {for (int i = chess.length - 1; i > 3; i--) {for (int j = 1; j < chess[0].length; j++) {if (j > 3) {if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j - 1])&& (chess[i - 2][j - 2] == '.')&& (a == chess[i - 3][j - 3])) {x1 = i - 3;y1 = j - 3;x2 = i;y2 = j;z = 3;if (a == 'o') {if (isLeftNullThree('o'))return true;} else if (a == 'x') {if (isLeftNullThree('x'))return true;}}}if (j < chess[i].length - 3) {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& ('.' == chess[i - 2][j])&& (a == chess[i - 3][j])) {x1 = i - 3;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isLeftNullThree('o'))return true;} else if (a == 'x') {if (isLeftNullThree('x'))return true;}}if ((chess[i][j] == a) && ('.' == chess[i - 1][j + 1])&& (a == chess[i - 2][j + 2])&& (chess[i - 2][j + 2] == chess[i - 3][j + 3])) { x1 = i;y1 = j;x2 = i - 3;y2 = j + 3;z = 4;if (a == 'o') {if (isLeftNullThree('o'))return true;} else if (a == 'x') {if (isLeftNullThree('x'))return true;}}if ((chess[i][j] == a) && ('.' == chess[i][j + 1])&& (a == chess[i][j + 2])&& (chess[i][j + 2] == chess[i][j + 3])) {x1 = i;y1 = j;x2 = i;y2 = j + 3;z = 1;if (a == 'o') {if (isLeftNullThree('o'))return true;} else if (a == 'x') {if (isLeftNullThree('x'))return true;}}} else {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])&& ('.' == chess[i - 2][j])&& (a == chess[i - 3][j])) {x1 = i - 3;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isLeftNullThree('o'))return true;} else if (a == 'x') {if (isLeftNullThree('x'))return true;}}}}}return false;}public static boolean isRightThree(char a) {for (int i = chess.length - 1; i > 3; i--) {for (int j = 1; j < chess[0].length; j++) {if (j > 3) {if ((chess[i][j] == a) && ('.' == chess[i - 1][j - 1])&& (chess[i - 2][j - 2] == chess[i - 3][j - 3])&& (a == chess[i - 3][j - 3])) {x1 = i - 3;y1 = j - 3;x2 = i;y2 = j;z = 3;if (a == 'o') {if (isRightNullThree('o'))return true;} else if (a == 'x') {if (isRightNullThree('x'))return true;}}}if (j < chess[i].length - 3) {if ((chess[i][j] == a) && ('.' == chess[i - 1][j])&& (chess[i - 3][j] == chess[i - 2][j])&& (a == chess[i - 3][j])) {x1 = i - 3;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isRightNullThree('o'))return true;} else if (a == 'x') {if (isRightNullThree('x'))return true;}}if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j + 1])&& ('.' == chess[i - 2][j + 2])&& (a == chess[i - 3][j + 3])) {x1 = i;y1 = j;x2 = i - 3;y2 = j + 3;z = 4;if (a == 'o') {if (isRightNullThree('o'))return true;} else if (a == 'x') {if (isRightNullThree('x'))return true;}}if ((chess[i][j] == a) && (chess[i][j] == chess[i][j + 1])&& ('.' == chess[i][j + 2])&& (a == chess[i][j + 3])) {x1 = i;y1 = j;x2 = i;y2 = j + 3;z = 1;if (a == 'o') {if (isRightNullThree('o'))return true;} else if (a == 'x') {if (isRightNullThree('x'))return true;}}} else {if ((chess[i][j] == a) && ('.' == chess[i - 1][j])&& (chess[i - 3][j] == chess[i - 2][j])&& (a == chess[i - 3][j])) {x1 = i - 3;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isRightNullThree('o'))return true;} else if (a == 'x') {if (isRightNullThree('x'))return true;}}}}}return false;}public static boolean isTwo(char a) {for (int i = chess.length - 1; i > 1; i--) {for (int j = 1; j < chess[0].length; j++) {if (j > 1) {if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j - 1])) {x1 = i - 1;y1 = j - 1;x2 = i;y2 = j;z = 3;if (a == 'x') {if (isNullTwo('x'))return true;} else if (a == 'o') {if (isNullTwo('o'))return true;}}}if (j < chess[i].length - 1) {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])) { x1 = i - 1;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'x') {if (isNullTwo('x'))return true;} else if (a == 'o') {if (isNullTwo('o'))return true;}}if ((chess[i][j] == a)&& (chess[i][j] == chess[i - 1][j + 1])) {x1 = i;y1 = j;x2 = i - 1;y2 = j + 1;z = 4;if (a == 'x') {if (isNullTwo('x'))return true;} else if (a == 'o') {if (isNullTwo('o'))return true;}}if ((chess[i][j] == a) && (chess[i][j] == chess[i][j + 1])) {x1 = i;y1 = j;x2 = i;y2 = j + 1;z = 1;if (a == 'x') {if (isNullTwo('x'))return true;} else if (a == 'o') {if (isNullTwo('o'))return true;}}} else {if ((chess[i][j] == a) && (chess[i][j] == chess[i - 1][j])) {x1 = i - 1;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'x') {if (isNullTwo('x'))return true;} else if (a == 'o') {if (isNullTwo('o'))return true;}}}}}return false;}public static boolean isCenterTwo(char a) {for (int i = chess.length - 1; i > 2; i--) {for (int j = 1; j < chess[0].length; j++) {if (j > 2) {if ((chess[i][j] == a) && ('.' == chess[i - 1][j - 1])&& (a == chess[i - 2][j - 2])) {x1 = i - 2;y1 = j - 2;x2 = i;y2 = j;z = 3;if (a == 'o') {if (isCenterNullTwo('o'))return true;} else if (a == 'x') {if (isCenterNullTwo('x'))return true;}}}if (j < chess[i].length - 2) {if ((chess[i][j] == a) && ('.' == chess[i - 1][j])&& (a == chess[i - 2][j])) {x1 = i - 2;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isCenterNullTwo('o'))return true;} else if (a == 'x') {if (isCenterNullTwo('x'))return true;}}if ((chess[i][j] == a) && ('.' == chess[i - 1][j + 1])&& (a == chess[i - 2][j + 2])) {x1 = i;y1 = j;x2 = i - 2;y2 = j + 2;z = 4;if (a == 'o') {if (isCenterNullTwo('o'))return true;} else if (a == 'x') {if (isCenterNullTwo('x'))return true;}}if ((chess[i][j] == a) && ('.' == chess[i][j + 1])&& (a == chess[i][j + 2])) {x1 = i;y1 = j;x2 = i;y2 = j + 2;z = 1;if (a == 'o') {if (isCenterNullTwo('o'))return true;} else if (a == 'x') {if (isCenterNullTwo('x'))return true;}}} else {if ((chess[i][j] == a) && ('.' == chess[i - 1][j])&& (a == chess[i - 2][j])) {x1 = i - 2;y1 = j;x2 = i;y2 = j;z = 2;if (a == 'o') {if (isCenterNullTwo('o'))return true;} else if (a == 'x') {if (isCenterNullTwo('x'))return true;}}}}}return false;}public static boolean isNullFour(char a) {if (z == 1 && a == chess[x1][y1]) {x1 = x1;y1 = y1 - 1;x2 = x2;y2 = y2 + 1;if (isNot(x1, y1) || isNot(x2, y2)) {if (chess[x1][y1] == '.') {c1 = x1;c2 = y1;return true;} else if (chess[x2][y2] == '.') {c1 = x2;c2 = y2;return true;}}} else if (z == 2 && a == chess[x1][y1]) { x1 = x1 - 1;y1 = y1;x2 = x2 + 1;y2 = y2;if (isNot(x1, y1) || isNot(x2, y2)) {if (chess[x1][y1] == '.') {c1 = x1;c2 = y1;return true;} else if (chess[x2][y2] == '.') {c1 = x2;c2 = y2;return true;}}} else if (z == 3 && a == chess[x1][y1]) { x1 = x1 - 1;y1 = y1 - 1;x2 = x2 + 1;y2 = y2 + 1;if (isNot(x1, y1) || isNot(x2, y2)) {if (chess[x1][y1] == '.') {c1 = x1;c2 = y1;return true;} else if (chess[x2][y2] == '.') {c1 = x2;c2 = y2;return true;}}} else if (z == 4 && a == chess[x1][y1]) { x1 = x1 + 1;y1 = y1 - 1;x2 = x2 - 1;y2 = y2 + 1;if (isNot(x1, y1) || isNot(x2, y2)) {if (chess[x1][y1] == '.') {c1 = x1;c2 = y1;return true;} else if (chess[x2][y2] == '.') {c1 = x2;c2 = y2;return true;}}}return false;}public static boolean isNot(int x, int y) {if (x < 1 || y < 1 || x > chess.length - 1 || y > chess[0].length - 1) return false;elsereturn true;}public static boolean isLeftNullThree(char a) {if (z == 1 && '.' == chess[x1][y1 + 1]) {x1 = x1;y1 = y1 - 1;x2 = x2;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x1;c2 = y1 + 2;return true;}}} else if (z == 2 && '.' == chess[x1 + 1][y1]) {x1 = x1 - 1;y1 = y1;x2 = x2 + 1;y2 = y2;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x1 + 2;c2 = y1;return true;}}} else if (z == 3 && '.' == chess[x1 + 1][y1 + 1]) {x1 = x1 - 1;y1 = y1 - 1;x2 = x2 + 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x1 + 2;c2 = y1 + 2;return true;}}} else if (z == 4 && a == chess[x1 - 1][y1 + 1]) {x1 = x1 + 1;y1 = y1 - 1;x2 = x2 - 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x1 - 2;c2 = y1 + 2;return true;}}}return false;}public static boolean isRightNullThree(char a) {if (z == 1 && '.' == chess[x2][y2 - 1]) {x1 = x1;y1 = y1 - 1;x2 = x2;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x2;c2 = y2 - 2;return true;}}} else if (z == 2 && '.' == chess[x2 - 1][y2]) {x1 = x1 - 1;y1 = y1;x2 = x2 + 1;y2 = y2;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x2 - 2;c2 = y2;return true;}}} else if (z == 3 && '.' == chess[x2 - 1][y2 - 1]) {x1 = x1 - 1;y1 = y1 - 1;x2 = x2 + 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x2 - 2;c2 = y2 - 2;return true;}}} else if (z == 4 && a == chess[x2 + 1][y2 - 1]) {x1 = x1 + 1;y1 = y1 - 1;x2 = x2 - 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {c1 = x2 + 2;c2 = y2 - 2;return true;}}}return false;}public static boolean isNullThree(char a) {if (z == 1 && a == chess[x1][y1]) {x1 = x1;y1 = y1 - 1;x2 = x2;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') { s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}} else if (z == 2 && a == chess[x1][y1]) {x1 = x1 - 1;y1 = y1;x2 = x2 + 1;y2 = y2;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') { s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}} else if (z == 3 && a == chess[x1][y1]) {x1 = x1 - 1;y1 = y1 - 1;x2 = x2 + 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') { s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}} else if (z == 4 && a == chess[x1][y1]) {x1 = x1 + 1;y1 = y1 - 1;x2 = x2 - 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}}return false;}public static boolean isCenterNullTwo(char a) {if (z == 1 && a == chess[x1][y1]) {x1 = x1;y1 = y1 - 1;x2 = x2;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (a == 'o') {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1 + 2;} else {c1 = x1;c2 = y1 + 2;}return true;}} else {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1 + 2;} else {c1 = x1;c2 = y1 + 2;}return true;}if (chess[x1][y1] == '.') {c1 = x1;c2 = y1 + 2;return true;}if (chess[x2][y2] == '.') {c1 = x1;c2 = y1 + 2;return true;}}}} else if (z == 2 && a == chess[x1][y1]) {x1 = x1 - 1;y1 = y1;x2 = x2 + 1;y2 = y2;if (isNot(x1, y1) && isNot(x2, y2)) {if (a == 'o') {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1 + 2;c2 = y1;} else {c1 = x1 + 2;c2 = y1;}return true;} else {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1 + 2;} else {c1 = x1;c2 = y1 + 2;}return true;}if (chess[x1][y1] == '.') {c1 = x1;c2 = y1 + 2;return true;}if (chess[x2][y2] == '.') {c1 = x1;c2 = y1 + 2;return true;}}}}} else if (z == 3 && a == chess[x1][y1]) {x1 = x1 - 1;y1 = y1 - 1;x2 = x2 + 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (a == 'o') {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1 + 2;c2 = y1 + 2;} else {c1 = x1 + 2;c2 = y1 + 2;}return true;} else {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1 + 2;} else {c1 = x1;c2 = y1 + 2;}return true;}if (chess[x1][y1] == '.') {c1 = x1;c2 = y1 + 2;return true;}if (chess[x2][y2] == '.') {c1 = x1;c2 = y1 + 2;return true;}}}}} else if (z == 4 && a == chess[x1][y1]) {x1 = x1 + 1;y1 = y1 - 1;x2 = x2 - 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (a == 'o') {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1 - 2;c2 = y1 + 2;} else {c1 = x1 - 2;c2 = y1 + 2;}return true;} else {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1 + 2;} else {c1 = x1;c2 = y1 + 2;}return true;}if (chess[x1][y1] == '.') {c1 = x1;c2 = y1 + 2;return true;}if (chess[x2][y2] == '.') {c1 = x1;c2 = y1 + 2;return true;}}}}}return false;}public static boolean isNullTwo(char a) {if (z == 1 && a == chess[x1][y1]) {x1 = x1;y1 = y1 - 1;x2 = x2;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}} else if (z == 2 && a == chess[x1][y1]) {x1 = x1 - 1;y1 = y1;x2 = x2 + 1;y2 = y2;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') { s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}} else if (z == 3 && a == chess[x1][y1]) {x1 = x1 - 1;y1 = y1 - 1;x2 = x2 + 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') { s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}} else if (z == 4 && a == chess[x1][y1]) {x1 = x1 + 1;y1 = y1 - 1;x2 = x2 - 1;y2 = y2 + 1;if (isNot(x1, y1) && isNot(x2, y2)) {if (chess[x1][y1] == '.' && chess[x2][y2] == '.') {s = r.nextInt(2);if (s == 0) {c1 = x1;c2 = y1;} else {c1 = x2;c2 = y2;}return true;}}}return false;}public static boolean haveComputer() {for (int i = 1; i < chess.length; i++) {for (int j = 1; j < chess[0].length; j++) {if (chess[i][j] == 'x') {if (computerRational(i, j))return true;}}}return false;}public static boolean computerRational(int x, int y) {int i = 0;int[][] is = new int[2][8];if (y > 1 && chess[x][y - 1] == '.') {is[0][i] = x;is[1][i] = y - 1;i++;}if (y < chess[0].length - 1 && chess[x][y + 1] == '.') { is[0][i] = x;is[1][i] = y + 1;i++;}if (z == 2) {if (x > 1 && chess[x - 1][y] == '.') {。

“Java程序设计”——“五子棋”综合实验报告

“Java程序设计”——“五子棋”综合实验报告

“Java程序设计”综合实验报告一、前言1、项目背景通过五子棋这个课程设计。

可以让我们更加熟悉Java程序设计这门课程,加强对Eclipse这个软件的使用,加深对Java语言的掌握,提高编程水平。

同时培养能力,为将来的工作打下坚实的基础。

2、目标和意义目标:锻炼我们的能力,提高组中每一个人对Java语言的认识,培养编程兴趣。

让每一个人都能参与进来,提高团队合作意识。

意义:通过编写综合类的程序,运用已经学过的知识,和自主学习一些新的知识,提高了学习能力,掌握了一些自主学习的方法。

3、开发分工及进度安排二、功能分析1、主要模块本项目主要分为3个大的模块,分别为整体布局;界面绘制;与对战的算法。

由于游戏规则的设置,这里的游戏模式分为人机对战和人人对战。

黑白双方依次落子,由黑子先下,当任意一方在棋盘上形成横向,竖向,斜向连续五个相同颜色的棋子的一方获胜。

主要功能①实现在2种模式下五子棋的游戏。

②实现通过鼠标的点击位置放置棋子,达到下棋的目的。

③实现游戏玩家对游戏模式的自主选择。

④实现对在每种游戏模式下的黑子先手下棋的规定,先达到5子即为胜利。

三、关键功能的设计与实现1、数据结构与算法数据结构:项目中主要数据结构为二维数组。

用于存储棋盘上棋子的信息,和保存棋型表。

主要算法:(一)iswin()函数:用来判断输赢,通过鼠标事件所得到的点或者电脑下的点的坐标,来扫描该点八个方向的相邻的相同棋子数,上下,左右,斜左上下,斜右上下为四组,任意一组等于5即为胜利,由于本程序没有考虑禁手原则,只考虑了民间规则,所以大于5也为胜利。

public int iswin1(int x, int y, int heqi) {int k, s1, s2, s3, s4, s5, s6, s7, s8;s1 = 0;s2 = 0;s3 = 0;s4 = 0;s5 = 0;s6 = 0;s7 = 0;s8 = 0;if (heqi == 256)return -1;for (k = 1; k < 5; k++) {if (y + k < 16 && qipanqizi[x][y + k] == qipanqizi[x][y])s1++;elsebreak;}for (k = 1; k < 5; k++) {if (y - k > -1 && qipanqizi[x][y - k] == qipanqizi[x][y])s2++;elsebreak;}for (k = 1; k < 5; k++) {if (x + k < 16 && y + k < 16&& qipanqizi[x + k][y + k] == qipanqizi[x][y]) s3++;elsebreak;}for (k = 1; k < 5; k++) {if (x - k > -1 && y - k > -1&& qipanqizi[x - k][y - k] == qipanqizi[x][y]) s4++;elsebreak;}for (k = 1; k < 5; k++) {if (x + k < 16 && qipanqizi[x + k][y] ==qipanqizi[x][y])s5++;elsebreak;}for (k = 1; k < 5; k++) {if (x - k > -1 && qipanqizi[x - k][y] ==qipanqizi[x][y])s6++;elsebreak;}for (k = 1; k < 5; k++) {if (x - k > -1 && y + k < 16&& qipanqizi[x - k][y + k] == qipanqizi[x][y]) s7++;elsebreak;}for (k = 1; k < 5; k++) {if (x + k < 16 && y - k > -1&& qipanqizi[x + k][y - k] == qipanqizi[x][y]) s8++;elsebreak;}if (s1 + s2 >= 4 || s3 + s4 >= 4 || s5 + s6 >= 4 || s7 + s8 >= 4) {return 1;} elsereturn 0;}(二)人机对战通过对整个棋盘上每一个点的扫描,获得了电脑和玩家的棋型表,表中数据为该点的权值。

java课程设计五子棋实验报告

java课程设计五子棋实验报告

java课程设计五子棋实验报告Java课程设计五子棋实验报告一、实验目的本次实验主要目的是运用Java编程语言,设计并实现一个简单的五子棋游戏,通过实践掌握Java编程基础知识和面向对象编程思想。

二、实验内容本实验要求设计并实现一个五子棋游戏,主要功能包括:1. 实现双人对战功能,允许两个玩家交替下棋;2. 实现判断胜负功能,当某一方连成五子时,游戏结束,显示胜利者;3. 实现悔棋和重新开始的功能。

三、实验原理1. 界面设计界面设计采用Java Swing框架,主要包括棋盘和控制面板两部分。

棋盘使用JPanel实现,通过绘制线条和圆形实现棋盘和棋子的显示。

控制面板使用JPanel和JButton实现,提供重新开始和悔棋功能。

2. 游戏逻辑游戏逻辑主要包括下棋和判断胜负两个部分。

下棋功能通过记录当前玩家和棋子位置实现,判断胜负则通过遍历棋盘上的所有棋子,判断是否满足连成五子的条件。

3. 实现悔棋和重新开始的功能悔棋功能主要通过记录每一步棋的位置和玩家来实现,重新开始则需要清空棋盘和游戏记录。

四、实验步骤1. 设计并实现界面,包括棋盘和控制面板;2. 实现游戏逻辑,包括下棋和判断胜负;3. 实现悔棋和重新开始的功能;4. 进行代码测试和调试,确保程序能够正常运行。

五、实验结果经过测试,程序能够正常运行,实现了双人对战、判断胜负、悔棋和重新开始的功能。

六、实验总结本次实验通过设计并实现一个简单的五子棋游戏,巩固了Java编程基础知识和面向对象编程思想,同时也学习了Swing框架的使用。

在实现过程中也遇到了一些问题,如棋子位置的计算、胜负判断的实现等,通过查阅资料和调试最终得以解决。

总体来说,本次实验收获颇丰,对Java编程有了更深入的了解和认识。

JAVA五子棋课程设计

JAVA五子棋课程设计
升级
升级内容:软 件升级、硬件
升级
升级注意事项: 备份数据、检 查兼容性、确
保网络畅通
07 总结与展望
项目总结
项目目标:设计并实现一个JAVA五子棋游戏 项目成果:实现了五子棋游戏的基本规则和功能 项目难点:AI算法的设计和实现 项目改进:优化AI算法,提高游戏难度和趣味性 项目展望:未来可以尝试实现更多游戏功能,如多人对战、在线对战等
部署步骤:下载源 代码、编译、打包 、部署到服务器
维护方法:定期备 份数据、更新软件 版本、监控系统运 定期更新系统,确保系统安全 定期检查硬件设备,确保硬件正常运行 定期清理系统垃圾,提高系统运行速度
系统升级
升级目的:提 高系统稳定性、 安全性和性能
升级方式:自 动升级、手动

可扩展性:系统应具有良好 的可扩展性,便于未来功能
扩展和升级
04 系统设计
系统架构
服务器端:负责游戏管理和 数据存储
数据库:存储游戏数据和用 户信息
通信协议:定义客户端和服 务器之间的通信格式和规则
客户端:负责用户界面和游 戏逻辑
安全性:确保数据安全和用 户隐私
界面设计
棋盘设计:黑白棋子,棋盘背景色 游戏界面:开始、结束、重新开始按钮 提示信息:提示玩家下一步操作 音效设计:背景音乐,棋子落下音效
项目不足与改进空间
代码优化:部 分代码存在冗 余,需要进一
步优化
功能完善:需 要增加更多的 功能,如悔棋、
复盘等
用户体验:界 面设计不够友 好,需要进一
步优化
性能提升:运 行速度较慢, 需要优化算法
和代码结构
项目未来展望
增加功能:支持多人在线对 战,提高社交互动性

《JAVA程序设计》课程设计-五子棋小游戏

《JAVA程序设计》课程设计-五子棋小游戏

《JAVA程序设计》课程设计-五子棋小游戏《JAVA程序设计》课程设计题目: 五子棋小游戏业: 信息与计算科学专学号: 070930205等姓名:指导教师: 成绩:二00九年十二月九日1.课程设计研究背景及意义五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。

发展于日本,流行于欧美。

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

然则看似很简单的一个小游戏,却对我们这组刚接触JAVA编程的成员来说却是一个不错的挑战,由于水平不限不能做成和电脑进行对战,也对于和其它电脑联机对战的模式不太清楚,故做成一个自己和自己对战的五子棋来考验我们的JAVA 的技术。

2.课程设计题目描述和要求题目:五子棋小游戏游戏主要界面如下:游戏规则:1,棋子分为黑白两色,采用19×19棋盘。

2,自己和自己对战,白子和黑子交替下,直到白子或黑子一方有五粒子连在一起,最先完成五粒子连在一起的一方为胜利的一方(可以是横、竖、斜、反斜)。

3,允许悔棋,且允许一直悔到棋盘上没有棋子了,悔棋后允许恢复。

当悔棋后下子了,则不允许再恢复了。

4,有棋子的地方不允许再下棋子了5,落子后不能移动或拿掉。

7,胜利后,棋局重新开始。

主要功能:1,鼠标点棋盘上的任意一点,棋子会落入离这点最近的一个交叉点处。

2,白子和黑子交替下。

3,当下到一半时,可以保存进度。

4,关闭再打开后,可以重新读取进度再接着下。

5,允许悔棋,且允许一直悔到棋盘上没有棋子了。

6,悔棋后允许恢复。

当悔棋后下子了,则不允许再恢复了。

7,下棋的过程中,随时可以重新开始。

8,有棋子的地方不允许再下子了。

9,当悔到没有棋子的时候会弹出消息。

10,任意一方胜利后会弹出消息11,恢复的步数超过了悔棋的步数的时候会弹出消息12,当任意一方胜利后,棋局重新开始。

13,设有菜单栏,玩家可以点菜单来完成某种操作。

java课程设计 五子棋

java课程设计 五子棋

JA V A课程设计——五子棋设计题目:五子棋 (2)客务端界面: (3)服务端界面: (4)程序界面布局 (5)游戏介绍与规则: (6)事务监听 (6)游戏相关功能 (8)聊天功能 (9)绘制棋盘 (11)判断输赢算法 (12)成员名单.................. 错误!未定义书签。

设计题目:五子棋一、程序目的和功能实现图形用户界面的五子棋双人对战,允许玩家在线聊天,根据玩家需求可进行对战,悔棋。

二、各个类或方法功能说明1.paint面板类,用于绘制棋盘,实现用鼠标进行走棋的动作。

fillOval方法,setColor(Color.black);绘制黑棋;fillOval方法,setColor(Color.white);绘制白棋;2.FiveS IntFC 主类窗口类,创建游戏主窗口以及游戏说明。

3.win类自定义类,实现判断输赢的方法。

核心算法:创建一个二维数组,其中储存的数据和棋子在棋盘上的位置一一对应,数组中某一数据等于10则表示棋盘上这个位置上是黑棋,若为1则表示棋盘上这个位置上是白棋,每下一步棋就对整个棋盘进行查找是否有连续五颗颜色相同的棋子。

棋盘如下:客服端界面:服务端界面:界面布局与菜单我们的程序设计由我们五个人共同完成,各人负责不同的模块程序界面布局主要使用了java.awt 组件兼和使用swing组件程序开始的欢迎框相关代码:主要用了JOptionPane.showMessageDialog程序的菜单菜单项使用JOptionPane.showMessageDialog制成的游戏帮助文档,单击菜单项后弹出以下各项游戏介绍与规则游戏介绍与规则事务监听相关代码对相关菜单项相关按钮事件源使用了事务监听beginGame=new MenuItem("开始下棋");//响应开始游戏菜单事件beginGame.addActionListener(new StartGo()); reBegin=new MenuItem("重开棋");//响应重开棋菜单事件reBegin.addActionListener(new ReBegin()); back=new MenuItem("梅棋");//响应梅棋菜单事件//相应帮助helpSite1=new MenuItem("游戏介绍");helpSite1.addActionListener(new HelpSite1()); helpSite2=new MenuItem("五子棋规则");helpSite2.addActionListener(new HelpSite2()); helpSite3=new MenuItem("胜负判定");helpSite3.addActionListener(new HelpSite3());btnStartGo=new Button("开始下棋");btnStartGo.addActionListener(new StartGo()); btnReBegin=new Button("重开棋");btnReBegin.addActionListener(new ReBegin()); btnBack=new Button("梅棋");btnBack.addActionListener(new BackChess());游戏相关功能走棋运用数据结构的进栈,每走一步棋进行top++运算,记录下棋//走棋Coordinate push(Coordinate e){point[top]=e;top++;return e;}悔棋利用了数据结构的进栈出栈,每下一步top++一遍,按下悔棋按钮后,进行top--运算,以实现五子棋的悔棋功能//梅棋Coordinate pop(){Coordinate point1=new Coordinate();if(top>0){top--;point1=point[top];}return point1;}boolean isEmpty(){if(top==0){return true;}else{return false;}}}重开棋利用循环,把棋盘上的每个棋子设为初始化状态0,即没有放置任何棋子public void clear(){for(int i=0;i<15;i++){for(int j=0;j<15;j++){chess[i][j]=0;}}聊天功能服务端监听本机3333 端口,等待客服端连接btnConn.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){try{聊天功能server=newServerSocket(Integer.parseInt(tfPort.getText()));sk=server.accept();dataIn=newDataInputStream(sk.getInputStream());dataOut=newDataOutputStream(sk.getOutputStream());TAccept tAccept=new TAccept();Thread thread=new Thread(tAccept);thread.start();}catch (Exception ex){return;}btnConn.setEnabled(false);}}使用多线程接收对方的信息//多线程类,不断接收对方发送的信息class TAccept implements Runnable{public void run(){String[] ss;while (true){try{ss=dataIn.readUTF().split(" ");conn(ss);}catch (Exception ex){}}}主要算法棋盘算法绘制棋盘用drawLine方法画出横竖间隔30像素的15条直线,形成一个棋盘。

javawuziqi课程设计

javawuziqi课程设计

javawuziqi 课程设计一、教学目标本课程旨在让学生掌握Java编写五子棋游戏的基本技能,培养他们运用Java编程解决问题的能力。

具体目标如下:1.知识目标:学生能理解并掌握Java基本语法、面向对象编程思想、常用数据结构等知识。

2.技能目标:学生能运用Java编写简单的五子棋游戏,掌握调试和优化代码的方法。

3.情感态度价值观目标:学生通过课程学习,培养自主学习、合作交流、勇于创新的精神,增强对计算机科学的兴趣。

二、教学内容本课程的教学内容主要包括Java基本语法、面向对象编程、常用数据结构、五子棋游戏算法等。

具体安排如下:1.第一章:Java基本语法,包括变量、数据类型、运算符、控制语句等。

2.第二章:面向对象编程,包括类、对象、封装、继承、多态等。

3.第三章:常用数据结构,包括数组、链表、栈、队列、树等。

4.第四章:五子棋游戏算法,包括棋盘表示、棋局判断、算法实现等。

5.第五章:项目实践,学生分组完成五子棋游戏的编写、调试和优化。

三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:讲解Java基本语法、面向对象编程、数据结构等理论知识。

2.案例分析法:分析经典五子棋游戏案例,引导学生掌握游戏算法。

3.实验法:学生动手编写五子棋游戏,培养实际编程能力。

4.讨论法:分组讨论编程过程中遇到的问题,促进同学之间的交流与合作。

四、教学资源为实现教学目标,我们将提供以下教学资源:1.教材:《Java编程入门》、《Java进阶教程》等。

2.参考书:《Java核心技术》、《数据结构与算法》等。

3.多媒体资料:教学PPT、视频教程、在线编程练习等。

4.实验设备:计算机、网络环境、编程工具等。

5.辅助工具:在线评测系统、代码调试工具等。

五、教学评估本课程的教学评估采用多元化方式,全面客观地评价学生的学习成果。

具体评估方式如下:1.平时表现:学生课堂参与度、提问回答、小组讨论等,占总成绩的30%。

Java五子棋课程设计

Java五子棋课程设计

郑州科技学院Java程序设计课程设计设计(论文)题目:连珠五子棋所在院:信息工程学院专业班级:12计算机科学与技术(嵌入式)***名:***学号:************师:***2014年12月26日摘要 (I)Abstract (II)第一章:绪论 (1)1.1 前言 (1)1.2课程设计意义 (2)1.3课设目的 (2)第二章需求分析 (3)2.1业务需求 (3)2.1.1 此系统使用范围要求 (3)2.1.2 功能要求 (3)2.2 性能需求 (4)2.3 系统平台需求 (5)第三章五子棋的相关基础 (5)3.1五子棋解释 (5)3.2五子棋基本规则 (5)3.3五子棋常用术语 (7)第四章开发工具、环境及其技术 (9)4.1 JAVA简介 (9)4.2 JAVA 编程环境: (12)4.2.1 环境变量 (12)4.2.2 Eclipse插件 (13)第五章程序设计思路与实现 (14)5.1程序设计思路 (14)5.1.1.设计思想 (14)5.1.2.程序设计分析 (15)5.2 程序设计代码 (15)第六章程序调试及结果 (25)6.1程序调试 (25)6.2 程序试运行 (25)6.3程序运行结果 (26)第七章课程设计总结 (27)参考文献 (28)摘要人工智能是一门正在迅速发展的新兴的,综合性很强的交叉科学。

它与生物工程、空间技术一起被并列为二十一世界三大尖端技术。

它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。

目前各发达国家都把人工智能作为重点项目,列入本国的高科技发展计划当中,投入巨大的人力和物力。

计算机对弈也是其中之一。

作为人智能研究的一个重要分支,计算机博弈是检验人工水平的一个重要方面。

它的研究为人工智能带来了很多重要的方法和理论,产生了广泛的社会影响和学术影响。

五子棋对弈是计算机博弈中的一种。

研究其计算机算法,可以让我们看到人工智能的稚形,也有助于我们人脑的开发。

JAVA课程设计 五子棋

JAVA课程设计 五子棋

攀枝花学院课程业设计五子棋学生姓名:学号:所在院(系):数学院计算机学院专业:信息与计算科学指导教师:讲师二〇一四年六月攀枝花学院教务处制攀枝花学院本科学生课程设计任务书注:任务书由指导教师填写。

摘要五子棋作为一类棋类竞技运动,现在很流行,很多人把它作为一类开发智力的一种游戏,锻炼人的思维。

这次课题主要是完成人机对战,在对战中电脑根据人的思维做出相应的反应,电脑对战中通过深度的搜索,使得自身有更大的胜算,估值计算也是一种方法,可以提高电脑的智能度。

分析模块中影响智能的因素也不少,通过节点比较与节点连接后的结果做出估计提高智能,了解递归算法、电脑学习等对此有很大帮助。

算法是程序的灵魂,一旦算法正确那么程序将很好。

不同的人工智能将会有不同的帮助,多去了解将更能提高智能程度。

五子棋是我国的一门文化,这将使得它更受世界人们的欢迎。

有助我国文化发展。

关键词五子棋,智能,算法,模块,人机对战目录1 需求分析 (1)1.1需求来源 (1)1.2设计目的 (1)2 功能需求分析 (1)2.1功能需求 (1)3 设计与实现 (2)3.1设计思想 (2)3.2系统模块结构 (2)3.3流程图 (2)4 概要设计 (4)4.1抽象数据类型定义 (4)4.2程序包含模块 (4)4.3模块间关系 (4)4.4系统功能实现 (4)5 模块设计 (5)5.1主界面模块 (5)5.2选择模块 (5)5.3判断模块、 (5)5.4显示模块 (5)参考文献 (9)1 需求分析1.1需求来源计算机在我们的生活中有越来越重要的角色,我们也越来越离不开计算机,计算机带给我们许多便利,学习好计算机知识已经是必不可少的一项技能了。

特别是电子商务、电子邮件等,人工智能现在的热点方向,人们感叹计算机的高效是也感叹自己的聪明,人工智能现在是很好的以方面。

1.2设计目的该软件为用户提供一个在Windows系统上运行的五子棋游戏小系统。

应达到的目的是:建立人机对战的模块,可以机器思考如何应对。

五子棋java课程课程设计

五子棋java课程课程设计

五子棋java课程课程设计一、课程目标知识目标:1. 让学生掌握五子棋游戏的规则,理解其背后的逻辑和策略。

2. 让学生掌握Java编程语言的基本语法,如变量、循环、条件语句等。

3. 让学生了解面向对象编程的基本概念,如类、对象、方法等,并能运用到五子棋游戏的编程中。

技能目标:1. 培养学生运用Java语言编写五子棋游戏的能力,实现人机对战功能。

2. 培养学生分析问题、解决问题的能力,通过编程解决五子棋游戏中的各种问题。

3. 培养学生的团队协作能力,分组完成五子棋游戏的开发。

情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学生自主学习编程的动力。

2. 培养学生面对挑战时的积极态度,勇于尝试和克服困难。

3. 培养学生的竞技精神,遵守游戏规则,尊重对手,公平竞争。

课程性质:本课程属于信息技术学科,结合五子棋游戏,让学生在实践中学习Java编程。

学生特点:学生处于初中年级,对编程有一定的基础,好奇心强,喜欢动手实践。

教学要求:结合学生特点,以实践为主,注重培养学生的动手能力和解决问题的能力。

教学过程中,注重引导学生主动探索,激发学生的学习兴趣。

通过分组合作,培养学生的团队协作能力。

在教学评估中,关注学生的知识掌握、技能提升和情感态度价值观的培养。

将课程目标分解为具体的学习成果,为后续教学设计和评估提供依据。

二、教学内容1. 五子棋游戏规则及策略分析- 五子棋基本规则- 常见开局、中局、残局策略2. Java编程基础知识- 数据类型、变量、运算符- 循环结构(for、while)- 分支结构(if、switch)- 数组的使用3. 面向对象编程基本概念- 类的定义与使用- 对象的创建与操作- 方法的定义与调用4. 五子棋游戏编程实现- 游戏界面设计- 棋盘类的设计与实现- 玩家类的设计与实现- 电脑对手的设计与实现- 游戏胜负判断逻辑5. 项目实战:分组完成五子棋游戏- 组内分工合作- 项目进度管理- 代码调试与优化教学内容安排与进度:第一周:五子棋游戏规则及策略分析,Java编程基础知识学习第二周:面向对象编程基本概念学习,五子棋游戏编程实现(1)第三周:五子棋游戏编程实现(2),项目实战分组,组内分工第四周:项目实战,代码编写与调试第五周:项目总结与展示,教学评价教学内容与课本关联性:教学内容与教材中关于Java编程、面向对象编程等内容紧密结合,通过五子棋游戏案例,让学生在实践中掌握编程知识,提高编程能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《Java程序设计》课程设计报告学院:理学院班级:姓名:学号:指导教师:课设时间: 2015-06-23 至2015-06-25二O一五年六月二十五日课程设计(论文)任务书理学院信息与计算科学专业2012-2班一、课程设计(论文)题目:人机对弈五子棋游戏二、课程设计(论文)工作:自2015 年6 月23 日起至2015 年6 月25日止三、课程设计(论文) 地点: 5-205四、课程设计(论文)内容要求:1.本课程设计的目的(1)使学生掌握软件开发的基本工作流程;(2)巩固JAVA程序设计课程所学的内容;(3)培养学生的计算机思维能力以及合作的精神;(4)培养学生分析、解决问题的能力;(5)提高学生的科技论文写作能力。

2.课程设计的任务及要求1)基本要求:(1)研究课程设计任务,并进行系统需求分析;(2)对系统进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码;(4)系统组装,测试、完善系统。

2)创新要求:在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求(1)要按照书稿的规格打印誊写课程设计论文(2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成4)参考文献:(1)丁振凡,《JAVA语言程序设计》,清华大学出版社(2)丁振凡,《JAVA语言程序设计实验指导与习题解答》,清华大学出版社(3)/5)课程设计进度安排内容天数地点系统总体设计 1 实验室软件设计及调试 1 实验室答辩及撰写报告 1 实验室、图书馆学生签名:2015年6月25日课程设计(论文)评审意见(1)课程设计过程(20分):优()、良()、中()、一般()、差();(2)是否完成调试,系统运行效果(30分):优()、良()、中()、一般()、差();(3)回答问题(20分):优()、良()、中()、一般()、差();(4)课程设计报告(30分):优()、良()、中()、一般()、差();(5)格式规范性及考勤是否降等级:是()、否()评阅人:职称:教授2015年 6月25日人机对弈五子棋游戏设计摘要:近些年来五子棋游戏成为了人们的最爱,游戏的下载量很高可以说一直排在前几位,也是人们日常生活中放松娱乐的最爱,特别是最近IT行业的发展,人工智能的实现,移动客户端的发展和普及为我们五子棋游戏的发展带来了新的生机,新的高潮,人工智能与五子棋的完美结合是五子棋的又一项重要发展,而我们现在开发的人机对弈更是掀起了五子棋发展的新篇章,为五子棋的发展与传播提供了新的机会,但是机会与挑战并存,我们相信通过我们对五子棋程序的不断优化和完善,五子棋一定会越来越受到大家的欢迎。

本次课程设计要求利用Java语言设计出一个人机对弈五子棋游戏,能实现人机对弈五子棋。

了解五子棋对弈规则后,利用本学期所学的Java高级图形界面编程方法的知识,并通过穷举法,考虑八个方向连成五子的几率高低,让计算机具有人工智能,成功设计出人机对弈五子棋的游戏。

除了人机对弈的功能,我们还增加了人人对战的功能。

这项功能使得人与人之间能够互下五子棋,不仅仅是人与计算机对弈。

除此之外,还增加了再来一局、认输、悔棋、退出游戏的功能,为了让游戏功能更加丰富,还增加了棋盘、模式、外观三个菜单栏供用户选择相应功能的菜单项。

目录1、课程设计的目的及目标 (1)1.1课程设计的目的 (1)1.2课程设计的目标 (1)2、概要设计 (1)2.1开发工具及环境 (1)2.2任务及需求分析 (1)2.3工作原理 (1)3、具体实现 (2)3.1类设计 (2)4、运行调试与分析讨论 (3)5、设计体会与小结 (10)6、参考文献 (10)附录:(源程序) (10)1、课程设计的目的及目标1.1课程设计的目的:本次课程设计的目的是为了让学生使用java语言编程的知识,通过编写一个简单的五子棋游戏,检验一个学期以来学习java语言的收获成果,以及检查自己在学习java语言的过程中的漏洞来弥补不足,以便以后更好、更熟练地使用java语言来编写方便、娱乐生活的程序。

1.2课程设计的目标:本次课程设计所要求的五子棋游戏应达到以下几方面的要求:1.运行程序后即刻出现棋盘并可以开始下棋;2.先手为黑棋,后手为白棋;人为先手,计算机为后手;3.程序能响应鼠标点击并在相应位置画出棋子;4.计算机具有一定的智能,能够与人进行五子棋对弈;5.程序可以正确判断出局面的胜负情况并及时报出结果,终止棋局;6.尽可能实现人人对战功能。

2、概要设计2.1开发工具及环境文本编辑器:记事本;运行环境:命令提示符(DOS环境)。

2.2任务及需求分析设计人机对弈五子棋程序,实现人与计算机进行五子棋对弈,具体任务如下:(1)棋盘布局设计;(2)计算机下子的算法分析;(3)编程实现棋子的绘制以及具体的再来一局、认输、悔棋、退出游戏等功能;(4)运行测试程序,调试纠正运行错误。

2.3工作原理(1)工作过程运行程序后,首先出现五子棋游戏窗体,用户点击游戏菜单项,出现相关子菜单,选择模式子菜单中的人机对弈便可进入人机对弈模式。

然后移动鼠标,在窗体的棋盘上点击鼠标下子,即可在棋盘中相应位置显示下的对应棋子。

接下来计算机会根据用户下的棋,采取穷举法选择八个方向上赢面最大的位置下子,用户与计算机谁先达到五子连成一线,谁便是获胜方。

若选择模式子菜单中的人人对战便可进入人人对战模式。

两个用户可同时玩游戏,同样谁先达到五子连成一线,谁便是获胜方。

若下棋过程中,双方中有一方要认输,便可选择游戏菜单项中的认输按钮,认输的一方显然失败,另外一方获胜。

若双方中有一方要悔棋,便可选择游戏菜单项中的悔棋按钮,经过对方的同意后,才能够重新翻盘,再来一局。

若双方势均力敌,可选择游戏菜单项中的棋盘子菜单,点击大号棋盘或超大号棋盘,以便避免棋盘空间不足造成无法分出胜负的情况。

若觉得窗体外观不太美观,可选择外观菜单中的三个选项进行选择。

为了显示程序的相关制作信息,程序提供了版本菜单进行显示。

具体功能实现见第四章节图。

(2)工作原理利用图形界面编程实现,利用到的知识点包括:❑窗体的创建和应用界面布局;❑事件处理,包括按钮的动作事件处理,鼠标事件,窗体事件;❑接口知识:事件处理中通过接口约束事件监听者必须实现相应接口中定义的方法;❑流程控制语句:通过条件判断区分不同事件源,作不同操作处理。

3、具体实现3.1类设计(1) 类名:ChessFrame作用:创建五子棋游戏主窗体和菜单。

该类继承JFrame类,实现ActionListener接口。

类中含有的方法介绍:❑ChessFrame()构造方法:构造五子棋游戏的主窗体;❑makeMenu()方法:构造五子棋游戏的主菜单;❑makeMenuItem()方法:构造五子棋游戏的菜单项;❑makeRadioButtonMenuItem()方法:构造五子棋游戏的单选按钮式菜单项。

(2) 类名:ChessModel作用:规定棋盘的宽度、高度、棋盘的模式;规定棋盘方格的横向、纵向坐标、棋盘方格的横向、纵向坐标所对应的棋子颜色;并且规定了记录棋盘棋子信息数组arrMapShow只有4个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子;定义了交换棋手的标识符isOdd,棋盘方格上是否有棋子的标识符isExist。

类中含有的主要方法介绍:❑ChessModel()构造方法:根据不同的棋盘模式(modeChess)来构建对应大小的棋盘;❑badxy()方法:判断下子的横向、纵向坐标是否越界;❑readyplay()方法:判断该坐标位置是否可下棋子;❑play()方法:在该坐标位置下棋子;❑computerDo()方法:用穷举法判断每一个坐标点的八个方向的的最大棋子数,最后得出棋子数最大值的坐标,计算机再下子(这八个方向分别是:左、右、上、下、左上、左下、右上、右下);❑checkMax()方法:计算棋盘上某一方格上八个方向棋子的最大值;❑showSuccess()方法:赢棋后的提示;❑showDefeat()方法:输棋后的提示。

(3) 类名:MainPanel作用:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等);该类继承JPanel类,实现MouseListener、MouseMotionListener接口。

类中含有的主要方法介绍:❑paintComponent()方法:根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子;❑mousePressed ()方法:响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等;❑mouseMoved()方法:响应鼠标的拖动事件。

(4) 类名:FiveChessAppletDemo作用:显示五子棋游戏窗体。

类中含有的方法介绍:❑main()方法:程序运行的入口,创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。

(5) 类名:ChessWindowEvent作用:响应退出窗口。

类中含有的方法介绍:❑windowClosing()方法:处理窗口关闭;❑ChessWindowEvent ()构造方法:提供无参构造方法。

4、运行调试与分析讨论图4-1 人机对弈模式选择界面图4-2 人机对弈界面图4-3 结果信息显示界面图4-4人人对战模式选择界面图4-5 悔棋界面图4-6 悔棋提示界面图4-7 悔棋后棋盘清空提示界面图4-8 悔棋后棋盘清空界面图4-9 认输界面图4-10 认输提示界面图4-11 认输后结果信息界面图4-12 棋盘选择界面图4-13 外观类型选择界面图4-14 版本选择界面图4-15 版本信息介绍界面5、设计体会与小结通过独立完成五子棋对弈系统的后,发现自己在进行软件开发方面提高不少,同时积极利用所学到的新技术用于自己的设计开发过程。

另外,在整个开发的过程中,时间也比较仓促。

因此,该系统必然会存在一些缺陷和不足。

如:没有讨论五子棋禁手的问题。

另一个就是电脑按即定的算法去与玩家下子。

这种算法有“固定”。

不太会变,玩家若是仔细观察,可以掌握其规律。

还有就是界面不是很华丽有待改进。

尽管本系统存在着很多不足,但其实现了最重要的功能就是有人工智能。

这也让我对计算机中的人工智能领域有一定的了解。

另一个就在做系统的过程中,我学到了Java的一些基本结构,还有就是对于Java有更深一步的认识。

6、参考文献[1] 丁振凡,《JAVA语言程序设计》,清华大学出版社.[2] 丁振凡,《JAVA语言程序设计实验指导与习题解答》,清华大学出版社.[3] Charles Petzold. Windows程序设计. 北京大学出版社,2002.[4] 陈明,《Java语言程序设计》,清华大学出版社.附录:(源程序)import java.awt.*;import java.awt.event.*;import javax.swing.*;class ChessFrame extends JFrame implements ActionListener{private String[] strsize={"标准棋盘","大号棋盘","超大号棋盘"};private String[] strmode={"人机对弈","人人对战"};public static boolean iscomputer=true,checkcomputer=true;private int width,height;private ChessModel cm;private MainPanel mp;public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"再来一局", null, "棋盘",null,"模式", null,"认输", null, "悔棋", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}public JMenu makeMenu(Object parent, Object items[], Object target){JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("大号棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("超大号棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对弈")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("再来一局")){restart();}if(arg.equals("悔棋")){if(!checkcomputer){int result = JOptionPane.showConfirmDialog(this, (FiveChessAppletDemo.isBlack==false?"白方悔棋,黑方是否同意?":"黑方悔棋,白方是否同意?"));if (result == 0) {JOptionPane.showMessageDialog(this, "双方同意悔棋决定,棋盘清空!请继续...");restart();}}}if(arg.equals("认输")){int result = JOptionPane.showConfirmDialog(this, "是否认输?");if (result == 0) {JOptionPane.showMessageDialog(this,"游戏结束,"+(FiveChessAppletDemo.isBlack==true?"黑方认输,白方获胜!":"白方认输,黑方获胜!")); }}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, " 制作者:黄甜,熊婷婷,谭飘宝,汤素娟,邓婷\n 制作时间:2015年6月25日", "课程设计制作介绍",JOptionPane.PLAIN_MESSAGE ); if(arg.equals("退出"))System.exit(0);}}class ChessModel {private int width,height,modeChess;private int x=0,y=0;private int[][] arrMapShow;private boolean isOdd,isExist;public ChessModel() {}public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++)for(int j = 0; j <= height; j++)arrMapShow[i][j] = -1;}public boolean getisOdd(){ return this.isOdd;}public void setisOdd(boolean isodd){if(isodd)this.isOdd=true;elsethis.isOdd=false;}public boolean getisExist(){ return this.isExist;}public int getWidth(){return this.width;}public int getHeight(){return this.height;}public int getModeChess(){return this.modeChess;}public int[][] getarrMapShow(){ return arrMapShow;}private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2) return true;return false;}public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){if(!chessExist(i,j)){max_white=checkMax(i,j,2);max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}public void setX(int x){ this.x=x;}public void setY(int y){this.y=y;} public int getX(){return this.x;}public int getY(){return this.y;}public int checkMax(int x, int y,int black_or_white){int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;return false;}public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果", RMATION_MESSAGE);}public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果", RMATION_MESSAGE);}}class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}public class FiveChessAppletDemo {public static Boolean isBlack = true;public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}class MainPanel extends JPanel implements MouseListener,MouseMotionListener{ private int width,height;private ChessModel cm;MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}public void draw(Graphics g, int i, int j, int v){int x = 20 * i+20;int y = 20 * j+20;if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);FiveChessAppletDemo.isBlack = true;}if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);FiveChessAppletDemo.isBlack = false;}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}。

相关文档
最新文档