五子棋-Java课程设计

时间:2024.3.31

课程设计报告

简单的游戏——五子棋

小组成员(姓名、学号)

**(组长)  **

**          **

**          **

一、实验分工

二、开发环境(实验编译以及测试环境)

硬件环境:

CPU:Intel 奔腾双核E5200  主频 2.5GHz

内存:2G

软件环境:

操作系统:Windows 7

编程环境 JDK7.0

开发工具:Eclipse SDK

三、使用环境(用户运行环境)

硬件环境:

CPU主频在500MHZ以上,内存在128M以上

软件环境:

JAVA运行环境 + Windows XP或Windows 20## 以上操作系统

目  录

第一章 总体设计... 1

1.1设计的目的... 1

1.2本系统的主要功能... 1

1.3系统包含的类及类之间的关系。... 1

1.4 Java源文件及其功能... 2

1.5 项目构建思路... 2

第二章 模块功能介绍... 11

2.1主类Chess. 11

2.2类Autoplay. 12

2.3类Scan. 12

第三章 功能测试及运行效果... 14

3.1系统主界面... 14

3.2参考文献... 15

3.3工作总结... 15


第一章 总体设计

1.1设计的目的

《面向对象程序设计》课程设计是计算机科学与技术专业集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。本课程设计主要目的在于加深学生对面向对象基础理论和基本知识的理解,掌握面向对象程序设计的基本方法,进一步使学生综合运用所学知识和增强实际动手能力。

通过课程设计,学生在下述各方面的能力应该得到锻炼:

1. 通过本次设计,实现对本学期内容的回顾与综合运用,包括类的建立,用类创建对象,方法的调用,图形组件的使用方法,图形界面的布局形式,事件处理机制,文件对话框的使用,文件操作的基本方法,数据读写的基本用法等。

2. 对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。

3. 掌握自顶而下的设计方法,将大问题进行模块化、对象化,领会面向对象程序设计的方法。

4. 熟练掌握JAVA语言(C#)的基本语法,灵活运用各种预定义类、线程和事件处理。

1.2本系统的主要功能

本系统可以实现电脑可以自动下棋,扫描整个棋盘记录连在一起的黑白棋子数,实现人与电脑有次序的下棋,判断人与电脑的胜负,为电脑下棋提供帮助

1.3系统包含的类及类之间的关系。

本系统共包6个Java源文件。类之间的关系如图1-1所示。

1.4 Java源文件及其功能

1.5 项目构建思路

此程序旨在打造一个小型五子棋娱乐游戏,经过认真分析和探索。终于,在大家的共同努力之下,完成了这个小型五子棋游戏。

游戏编辑思路,五子棋是一种互动性的益智游戏。需要棋盘、棋子、棋手、裁判。

首先,我们绘制一个五子棋棋盘,关键代码如下:

//绘制棋盘函数

    publicvoid paint(Graphics g){ 

        for (int i=40;i<=400;i=i+20){

             g.drawLine(40,i,400,i);

             } //绘制棋盘 行

       

        for(int j=40;j<=400;j=j+20){

            g.drawLine(j,40,j,400);

            } //绘制棋盘 列

     

        g.fillOval(97,97,6,6);  //使用当前颜色填充外接指定矩形框的椭圆

        g.fillOval(337,97,6,6);

        g.fillOval(97,337,6,6);

        g.fillOval(337,337,6,6);

        g.fillOval(217,217,6,6);

        }

其次,我们生成两种颜色不一样的棋子,关键代码如下:

黑色棋子代码如下:

//ChessPoint_black 类 继承 Canvas类

classChessPoint_blackextends Canvas implements MouseListener{ 

     ChessPad chesspad=null;

     ChessPoint_black(ChessPad p){

         setSize(20,20);       //设置棋盘每一小格的长宽

         addMouseListener(this);

         chesspad=p;

         }

    

     publicvoid paint(Graphics g){ 

          g.setColor(Color.black);   //设置黑色棋子的颜色

          g.fillOval(0,0,18,18);   //使用黑色填充椭圆棋子

          }

白色棋子代码如下:

classChessPoint_whiteextends Canvas implements MouseListener{

      ChessPad chesspad=null;

      ChessPoint_white(ChessPad p){

         setSize(20,20);

         addMouseListener(this);

         chesspad=p;

         }

     

     publicvoid paint(Graphics g){  //绘制棋子的颜色

          g.setColor(Color.white);//设置为白色

          g.fillOval(0,0,18,18);//填充白子

          }

    

再次,为实现双方行棋,我们实现了电脑自动下棋的函数,一共分为8种情况,关键代码如下:

class AutoPlay{  //AutoPlay类实现电脑可以自动下棋

     int x,y; //X统计玩家的连起来的棋子数

     //Y电脑玩家的连起来的棋子数

     void autoPlay(int chesspad[][],int a,int b){

          int randomNumber=(int)(Math.random()*8)+1;  //获取一个随机数

          switch(randomNumber){  //分情况实现电脑自动下棋

             case(1):  //通过a,b的值 执行不同的运算,最后返回不同的

//值。达到执行不同的操作。

if(chesspad[a-1][b-1]==0)

                   {x=a-1;y=b-1;} 

  if(chesspad[a-1][b+1]==0)

                  {x=a-1;y=b+1;}

                  elseif(chesspad[a-2][b-2]==0)

                  {x=a-2;y=b-2;}

                  else {x=a-3;y=b-3;}  

                  break;

                  

             case(2):

                  if(chesspad[a-1][b]==0)

                  {x=a-1;y=b;}

                  elseif(chesspad[a-2][b]==0)

                  {x=a-2;y=b;}

                  else {x=a-3;y=b;}

                  break;

           case(3):

                  if(chesspad[a-1][b+1]==0)

                  {x=a-1;y=b+1;}

                  elseif(chesspad[a-2][b+2]==0)

                  {x=a-2;y=b+2;}

                  else {x=a-3;y=b+3;}

                  break;

             case(4):

                  if(chesspad[a][b+1]==0)

                  {x=a;y=b+1;}

                  elseif(chesspad[a][b+2]==0)

                  {x=a;y=b+2;}

                  else {x=a;y=b+3;}

                  break;

             case(5):

                   if(chesspad[a+1][b+1]==0)

                   {x=a+1;y=b+1;}

                   elseif(chesspad[a+2][b+2]==0)

                   {x=a+2;y=b+2;}

                   else {x=a+3;y=b+3;}

                   break;

             case(6):

                   if(chesspad[a+1][b]==0)

                   {x=a+1;y=b;}

                   else  if(chesspad[a+2][b]==0)

                   {x=a+2;y=b;}

                   else {x=a+3;y=b;}

                   break;

             case(7):

                    if(chesspad[a+1][b-1]==0)

                    {x=a+1;y=b-1;}

                    elseif(chesspad[a+2][b-2]==0)

                    {x=a+2;y=b-2;}

                    else {x=a+3;y=b-3;}

                    break;

             case(8):

                     if(chesspad[a][b-1]==0)

                     {x=a;y=b-1;}

                     elseif(chesspad[a][b-2]==0)

                     {x=a;y=b-2;}

                     else{x=a;y=b+3;}

                     break;

            }

      }

}

第四,为规范双方行棋的先后顺序,我们实现了一个判断函数,关键代码如下:

class Sort{  //sort类 实现人与电脑有次序的下棋

   publicvoid sort(int shape[][][]){

 

       int temp; 

       for(int i=0;i<19;i++)

         for(int j=0;j<19;j++){

                     for(int h=1;h<=4;h++){

                     for(int w=3;w>=h;w--){

                     if(shape[i][j][w-1]<shape[i][j][w]){

//如果前者小于后者,则交换

                      temp=shape[i][j][w-1];

                     shape[i][j][w-1]=shape[i][j][w];

                     shape[i][j][w]=temp;

                     }

                }

            }

       }

   }

 } 

第五,脑只是简单的执行代码,没有智能思考的能力。在行棋之前,他需要对整个棋盘上的棋子做一个判断,然后决定该怎么行棋,关键代码如下:

class Evaluate{ //Evaluate类

    int max_x,max_y,max;

   publicvoid evaluate(int shape[][][]){

       int i=0,j=0;

        

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

         for(j=0;j<19;j++){

           switch(shape[i][j][0]) {        

//电脑根据传进来的三维数组决定该怎么行棋,

                     case 5:

                        shape[i][j][4]=200;

                        break;

                    case 4:

                         switch(shape[i][j][1]){

                              case 4:

                              shape[i][j][4]=150+shape[i][j][2]+

                                                     shape[i][j][3];

                                 break;   

                              case 3:

                                  shape[i][j][4]=100+

                                                    shape[i][j][2]+

                                                    shape[i][j][3];

                                  break;

                              default:

                                  shape[i][j][4]=50+

                                                    shape[i][j][2]+  

                                       shape[i][j][3];

                       }

                         break;

                    case 3:

                          switch(shape[i][j][1]){

                               case 3:

                                    shape[i][j][4]=75+

                                                    shape[i][j][2]+

                                                    shape[i][j][3];

                                     break;             

                               default:

                                     shape[i][j][4]=20+

                                                    shape[i][j][2]+  

                                       shape[i][j][3];

                           }

                           break;

                   case 2:

                         shape[i][j][4]=10+shape[i][j][1]

                                                      +shape[i][j][2]  

                                         +shape[i][j][3];

                         break;

                   case 1:

                         shape[i][j][4]=shape[i][j][0]+shape[i][j][1]

                                                      +shape[i][j][2]  

                                         +shape[i][j][3];

                   default : shape[i][j][4]=0;                     

                  }  

             }      

    

     int x=0,y=0;

     max=0;

     for(x=0;x<19;x++)

         for(y=0;y<19;y++)

            if(max<shape[x][y][4]){  

               max=shape[x][y][4]; 

               max_x=x;  max_y=y;}    

     }

}

第六,在双方行棋后,我们需要判断那一方赢。裁判的功能代码如下

//判断人与电脑的胜负

class Judge{

   staticboolean judge(int a[][],int color){

      int i,j,flag;

      for(i=0;i<19;i++){  //行

          flag=0;

          for(j=0;j<19;j++)//列

              if(a[i][j]==color){  

                 flag++;  //棋子计数器

                 if (flag==5) //如果棋子数等于5

                   returntrue;} //返回true

             else   flag=0;   //返回false

         

      }

     

      for(j=0;j<19;j++){

           flag=0;   //棋子计数器

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

               if(a[i][j]==color) //每一列的棋子颜色一样

               {

                 flag++;  

               if(flag==5)    //棋子数为5

                   returntrue;}  //返回true 否则返回true

               else flag=0;

          }

     

      for(j=4;j<19;j++){

          flag=0; 

          int m=j;

          for(i=0;i<=j;i++){

            if(a[i][m--]==color){   //对角线棋字数一样

                  flag++;

                  if(flag==5)  //为5 则返回true

                  returntrue;}

                  else flag=0;}  //棋子计数器归零

          }         

     

      for(j=14;j>=0;j--){

          flag=0;  int m=j;

          for(i=0;i<=18-j;i++){

           

              if(a[i][m++]==color){  //对角线棋子数是否一样

                  flag++;

                  if(flag==5)  

                  returntrue;}  //棋子书为5 则返回true

                  else flag=0;}   //否则归零

          }          

     

      for(i=14;i>=0;i--){

          flag=0;    int n=i;

          for(j=0;j<19-i;j++){

         

              if(a[n++][j]==color){

                  flag++;

                  if(flag==5)

                  returntrue;}

                  else flag=0;}

          }         

     

       for(j=14;j>=0;j--){

          flag=0; int m=j;

          for(i=18;i>=j;i--){

             if(a[i][m++]==color){

                  flag++;

                  if(flag==5)

                  returntrue;}

                  else flag=0;}

          }                

       returnfalse;}  

   }         

最后,我们最终的程序是急于可视化的,所以,需要容器及组建来实现,关键代码如下:

classChessPadextends Panel implements MouseListener,ActionListener{

    //创建棋盘

   int array[][]=newint[19][19];//创建二维数组,生成棋盘

  

 Sort sort=new Sort();

  int i=0;   //控制棋子颜色

   int x=-1,y=-1,棋子颜色=1;

      Button button=new Button("重新开局");  //确定按钮

   TextField text_1=new TextField("请黑棋下子"), //创建文本组件 并初始化第一个

             text_2=new TextField(),

             text_3=new TextField();

  

   ChessPad(){  //ChessPad函数的构造函数

       setSize(440,440);  //

       setLayout(null);

       setBackground(Color.pink); //设置背景为粉色

       addMouseListener(this);

       add(button);//向组件添加指定的重新开局菜单

       button.setBounds(10,5,60,26);

       //移动组件并调整其大小。由 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。

       button.addActionListener(this);  //添加指定的操作侦听器,以接收来自此按钮的操作事件

       add(text_1);  text_1.setBounds(90,5,90,24);

       add(text_2);  text_2.setBounds(290,5,90,24);

       add(text_3);  text_3.setBounds(200,5,80,24);

      

       for(int i=0;i<19;i++)

        for(int j=0;j<19;j++)

            {array[i][j]=0;}  //初始化数组为0

      

       for(int i=0;i<19;i++)

        for(int j=0;j<19;j++)

         for(int h=0;h<5;h++)

            {scanp.shape[i][j][h]=0;

            scanc.shape[i][j][h]=0;}    //初始化三维数组为0

      

       text_1.setEditable(false);

       text_2.setEditable(false);  //设置文本组件为不可编辑

      

       }

第二章 模块功能介绍

2.1主类Chess

(1)成员变量见表2-1

(2)方法见表2-2

(3)源代码见文件Chess.java中的公共类 Chess

2.2类Autoplay

(1)成员变量见表2-3

(2)方法见表2-4

(3)源代码见文件Chess.java中的Autoplay类

2.3类Scan

(1)成员变量见表2.5

(2)方法见表2.6

(3)源代码见文件Chess.java中的Scan


第三章 功能测试及运行效果

3.1系统主界面

图3-1初始化棋盘效果,玩家为黑棋。

图3-2可以统计下棋步数,与下棋的位置。

图3-3可以实现胜负的判断,并终止游戏。

3.2参考文献

面向对象程序设计——Java(第二版).西安电子科技大学出版社2006【教材】

张孝祥. Java就业培训教程[M]. 北京:清华大学出版社,2003

陈国君等编著.Java2程序设计基础.北京:清华大学出版社,2006

3.3工作总结

一个编程语言最强大的地方不是它是容易学,或者难学,而是它拥有一个强大的库。JAVA是一个完全面向对象的语言,JAVA的命名规则是很容易让人接受的。而且容易被编程人员记住。经过实践训练,对JAVA的综合应用能力有了较大的提高,另外对JAVA的特点有了更深层次的认识。这次实践中使用的代码虽然不长,但类与类之间也有很强的逻辑关系,这就是面向对象语言的最大优势,这样可使我们更轻松的运用JAVA。

经过努力,查阅相关资料,终于完成该课题,虽然效果不是很好,但亲手做过之后还是很有成就感的。

通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。通过对此课题的开发,使我对用Eclipse开发平台有了一个比较清楚的认识,体会到理论和实践的重要性。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。

更多相关推荐:
java 五子棋 课程设计报告

课程设计论文任务书班一课程设计论文题目多用户五子棋游戏二课程设计论文工作自20xx年6月15日起至20xx年6月19日止三课程设计论文地点创新大楼310四课程设计论文内容要求1本课程设计的目的数据类型对面向对象...

五子棋JAVA语言课程设计报告

Java语言程序设计课程设计报告学院信息科学技术学院班级软件技术2班姓名王更新学号1108900505指导教师郭韶升课设时间20xx0317至20xx0326二O一四年三月二十六日目录一设计要求2二设计步骤22...

java五子棋项目报告

河南经贸职业学院信息管理系Java程序设计课程设计报告Java语言程序设计课程设计报告题目设计者班级学号指导教师系部专业信息管理系计算机应用技术20xx年6月25日1河南经贸职业学院信息管理系Java程序设计课...

五子棋JAVA语言课程设计报告

封面Java语言程序设计课程设计报告分院电信分院班级电子商务1班姓名何芳林学号20xx0210460123指导教师吴军良课设时间20xx1220至20xx1231二O一一年十二月二十日10电商1班何芳林Java...

五子棋-Java课程设计

面向对象程序设计课程设计报告实验时间20xx年10月26日实验班级实验报告总份片数1份片实验指导老师设计小组湖南省吉首市吉首大学课程设计报告简单的游戏五子棋小组成员姓名学号组长一实验分工二开发环境实验编译以及测...

java课程设计报告-五子棋

目录第一章软件开发平台游戏设计思路第二章小游戏五子棋的开发过程第一节JAVA基础知识第二节启动程序的分析第三节游戏设计过程第三章总结第四章参考文献第五章附录第一章游戏设计思路第二章第一节java程序基础知识本系...

JAVA语言课程设计报告 五子棋源代码

浙江科技学院经济管理学院JAVA语言课程设计报告选题名称五子棋小游戏学生学号专业班级学生姓名学生成绩指导教师朱军工作时间20xx0627目录1选题简介32需求分析321系统要实现的目标分析322对输入输出数据及...

Java课程设计-五子棋

Java论文错误未指定书签Java论文五子棋班级学号学生姓名提交日期成绩20xx0629评语及教师签名电子信息系1Java论文错误未指定书签设计题目五子棋一程序目的和功能实现图形用户界面的五子棋双人对战二各个类...

面向对象-五子棋-Java课程设计

面向对象程序设计小组成员姓名学号组长一实验分工二开发环境实验编译以及测试环境硬件环境CPUIntel奔腾双核E5200主频25GHz内存2G软件环境操作系统Windows7编程环境JDK70开发工具Eclips...

Java五子棋设计报告

南京晓庄学院JAVA程序设计课程设计报告题目五子棋游戏的设计与实现姓名陶野学号班级指导教师1213081812软件工程转本2班王峥完成时间7月1日成绩信息工程学院20xx年6月1目录1111112221引言1系...

java(J2EE)课程设计报告 (1)

附件二烟台工程职业技术学院系专业级课程设计论文题目会议管理设计姓名学号指导教师签名二一一年七月一十五日会议管理设计摘要无论任何组织为了实现本单位的工作目的经常组织相关人员一起讨论商议形成了许多文字资料由于资料的...

java五子棋小游戏实验报告(附源代码)

手机五子棋游戏的设计与实现专业姓名班级学号指导教师基于J2ME的手机五子棋游戏摘要J2MEJava2MicroEdition是近年来随着各种不同设备尤其是移动通信设备的飞速发展而诞生的一项开发技术它因其writ...

java五子棋课程设计报告(25篇)