fupeisen

导航

6月27日

围棋游戏的实现

摘  要

围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端和服务器端的交互用Class Message定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑AI方案,如递归算法、电脑学习等。算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。

关键词:数据结构;  围棋游戏;  信息自动化,JAVA

 

 

  

1  引言

2章  系统功能需求分析

2.1 问题描述:

2.2 需求分析

3  概要设计

3.1  抽象数据类型(ADT)

3.3 系统流程图

4  详细设计

4.1  重要程序段1

4.2 重要程序段2

4.3 重要程序段3

4.4 重要程序段4

4.5 重要程序段5

4.6 重要程序段6

5章 调试分析

6章 运行结果

7章 总结体会

附录

 

 

 

 

 

 

 

 

 

 

1章  引言

此设计是一个小游戏(围棋)的实现,主要运用了GUI(用户图形界面)API(应用程序借口)来实现。此程序没有用到图片的引用,棋盘和棋子的设计完全是应用函数绘制,  再加入复选框,按钮,标签及实现本游戏的用户界面布局。

在页面上通过单纯的JCreator实现的下棋程序,能够实现提子,打劫等简单的下棋功能。更好的掌握java编程以及布局和设计。通过课程设计把课堂上讲的内容融会贯通,学会设计程序、开发应用软件、开发系统软件等各项工作。通过实习掌握语言的语法结构,理解类和对象的概念,准确的使用各种数据类型,对面向对象中的继承和多态的概念要理解、会使用,在程序中提高代码的重用性,使设计的程序结构清晰、易于维护。

 

第2章 系统功能需求分析

2.1 问题描述: 

设计一个简易的围棋游戏。盘面有纵横各十九条等距离、垂直交叉的平行线,共构成361个交叉点(以下简称为"点")。棋子分黑白两色。对局双方各执一色棋子,黑先白后,交替下子,每次只能下一子。 棋子下在棋盘的点上。棋子下定后,不得向其它点移动。轮流下子是双方的权利,但允许任何一方放弃下子权。谁占据的点位越多谁获胜。

设计要求:

(1) 要求实现图形化界面;

(2) 要求实现棋谱的记录;

(3) 要求实现人人对弈和人机对弈;

2.2 需求分析

主要功能包括:

能实现联机对战,和单机版游戏对战。

 

 

开始游戏之后:

1、用户双方自行选择白棋和黑棋。

2、任何一方可以随时随地认输,游戏结束。

4、要实现围棋最基本吃掉对方的法则。

此设计为本人原创作品。其中包括:源程序,可执行程序,论文,录像,使用说明。

1)有一个或多个游戏服务器启动特定游戏服务;

2)游戏者到游戏网站下载客户端程序并申请游戏账号。然后启动客户端程序通过某种网络协议连接游戏服务器。

3)客户端负责处理客户端显示和操作界面,具有简单的逻辑处理功能力, 同时负责接收发送与服务器端交互的数据包。

4)服务器程序负方处理服务器端逻辑、游戏逻辑、客户之间的网络信息传递,以及数据库之间的数据读取保存工作。 同时服务器端还要承担客户端数据的接收、转发工作。

     

3章  概要设计

3.1  设计思路

此设计是一个小游戏(围棋)的实现,主要运用了GUI(用户图形界面)API(应用程序借口)来实现。此程序没有用到图片的引用,棋盘和棋子的设计完全是应用函数绘制,  再加入复选框,按钮,标签及实现本游戏的用户界面布局。

在页面上通过单纯的JCreator实现的下棋程序,能够实现提子,打劫等简单的下棋功能。更好的掌握java编程以及布局和设计。通过课程设计把课堂上讲的内容融会贯通,学会设计程序、开发应用软件、开发系统软件等各项工作。通过实习掌握语言的语法结构,理解类和对象的概念,准确的使用各种数据类型,对面向对象中的继承和多态的概念要理解、会使用,在程序中提高代码的重用性,使设计的程序结构清晰、易于维护。

 

3.2 工作流程

 private void jbInit() throws Exception

    {

        choice1.setBackground(new Color(236, 190, 98));

        button1.setBackground(new Color(236, 190, 98));

 //       try

 //       {

 //          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

 //       }catch(Exception e){e.printStackTrace();}

        this.setResizable(false);

        new Thread(this).start();//启动监听线程

        this.PORT=1976;

        this.isInitiative=false;//是否主动连接

        this.stopFlag=false;//是否继续监听的标志

        this.choice1.addItem("");

        this.choice1.addItem("");

        LastPoint=new Point();

        messagePoint=new Point();

        this.setSize(470,450);

        this.setTitle("围棋大战       制造者:郭欣");

        this.panelGo.setEnabled(false);//开始之前屏蔽掉盘面

        checkbox1.addMouseListener(new java.awt.event.MouseAdapter()

        {

            public void mouseClicked(MouseEvent e)

            {

                checkbox1_mouseClicked(e);

            }

        });

        this.goStartPoint=this.panelGo.getLocation();//

        this.setLayout(borderLayout1);

        panel1.setLayout(borderLayout2);

        checkbox1.setCheckboxGroup(checkboxGroup1);

        checkbox1.setLabel("单机");

        checkbox2.setCheckboxGroup(checkboxGroup1);

        checkbox2.setLabel("联机");

        checkbox2.addMouseListener(new java.awt.event.MouseAdapter()

        {

            public void mouseClicked(MouseEvent e)

            {

                checkbox2_mouseClicked(e);

            }

        });

        label1.setText("对方地址");

        button1.setLabel("连接");

 

3.3 系统流程图

 

 

 

4章  详细设计

此设计是一个小游戏(围棋)的实现,主要运用了GUI(用户图形界面)API(应用程序借口)来实现。此程序没有用到图片的引用,棋盘和棋子的设计完全是应用函数绘制,  再加入复选框,按钮,标签及实现本游戏的用户界面布局。

在页面上通过单纯的JCreator实现的下棋程序,能够实现提子,打劫等简单的下棋功能。更好的掌握java编程以及布局和设计。通过课程设计把课堂上讲的内容融会贯通,学会设计程序、开发应用软件、开发系统软件等各项工作。通过实习掌握语言的语法结构,理解类和对象的概念,准确的使用各种数据类型,对面向对象中的继承和多态的概念要理解、会使用,在程序中提高代码的重用性,使设计的程序结构清晰、易于维护。

4.1  重要程序段1

void initMyHash(Point startPoint,int interval)

    {

        One one;

        Point key;                                //逻辑点标志

        int i,j;                                  //定义i,j

        for(i=1;i<=19;i++)

            for(j=1;j<=19;j++)                    //循环

            {

                key=new Point(i,j);

                one=new One();                    //创建对象

                one.posX=startPoint.x+(i-1)*interval;//相邻点处理,获取

                one.posY=startPoint.y+(j-1)*interval;//相邻点处理。获取//获取相邻点

                

                one.pointAround[0]=new Point(i,j-1);      //

                one.pointAround[1]=new Point(i,j+1);      //

                one.pointAround[2]=new Point(i-1,j);      //

 

                one.pointAround[3]=new Point(i+1,j);      //

                if(i==1)one.pointAround[2]=one.OUT;       //左的周围

                if(i==19)one.pointAround[3]=one.OUT;      //右的周围

 

                if(j==1)one.pointAround[0]=one.OUT;       //上的周围

                if(j==19)one.pointAround[1]=one.OUT;      //下的周围

 

                myHash.put(key,one);                      //我的我的哈希表并且在里键入关键字

            }

    }

    //更新盘面

    public void paint(Graphics g)

    {

        Point startPoint=STARTPOINT;                     //创建对象,开始点

        int interval=INTERVAL;                           //定义成员变量

        this.paintChessboard(g,startPoint,interval);     //棋盘的操作

        this.paintChessman(g,startPoint,interval);       //棋子的操作

    }

//画棋盘

4.2 重要程序段2

public void run()

    {

        try

        {

            ServerSocket serverSocket=new ServerSocket(PORT);

            Socket receiveSocket=null;

            receiveSocket=serverSocket.accept();

            if(this.isInitiative)//如果已在进行,则不接受连接

                this.stopFlag=true;

            this.checkboxGroup1.setSelectedCheckbox(this.checkbox2);//自动选择联机

            this.button1.setEnabled(false);

            this.choice1.setEnabled(true);

            this.textField1.setEnabled(false);

            this.checkbox1.setEnabled(false);

            this.checkbox2.setEnabled(false);

            this.writer=new PrintWriter(receiveSocket.getOutputStream(),true);

            BufferedReader reader=new BufferedReader(new InputStreamReader(receiveSocket.getInputStream()));

            String message;

            while(!this.stopFlag)

            {

                this.panelGo.showError("接收连接成功");

                message=reader.readLine();

                this.doMessage(message);

            }

            reader.close();

            receiveSocket.close();

            serverSocket.close();

        }catch(IOException ioe){this.panelGo.showError("您赢了");}

    }

    //处理接收到的东西

4.3 重要程序段3

void doMessage(String message)

    {

        if(message.startsWith("start"))//判断开始

        {

            this.panelGo.showError("开始了");

            if(message.equals("start_black"))

                this.choice1.select("");

            else

                this.choice1.select("");

            if(this.choice1.getSelectedItem().equals(""))//只要你是黑的,就先走

                this.panelGo.setEnabled(true);

            this.paintMyColor();//表明颜色

            this.disableLink();

        }

        else//下子的信息

        {

            int color=Integer.parseInt(message.substring(0,1));

            this.messagePoint.x=Integer.parseInt(message.substring(1,3));

            this.messagePoint.y=Integer.parseInt(message.substring(3,5));

            this.panelGo.setEnabled(true);//解禁

            this.panelGo.doStep(this.messagePoint,color);

        }

    }

 

    //为鼠标定位

posted on 2023-06-27 00:30  20214073-付沛森  阅读(13)  评论(0编辑  收藏  举报