第一篇:java五子棋游戏_控制台_总结报告
总结
一、目的:
1、完成疯狂java讲义第四章作业
2、提升代码能力
3、熟悉java语言
二、环境:
Windows8.1系统、jdk1.8、记事本(需要把文件扩展名改成java)
三、遇到的问题:
1、错误需要为class、interface或enum的问题
这个问题,经调试发现是因为注释的时候使用了嵌套注释,即在跨行注释/* */里面添加了跨行注释
2、如何提取控制台输入的问题
这个问题,根据书上例子,采用bufferedreader解决,具体可以参见api文档.3、斜方向棋子的检测问题
这个问题,解决它所需要的算法,着实让我头疼了一下.因为我是以棋盘左边第一列为基准进行斜上方和斜下方的检测,以及以棋盘最后一列为基准进行斜上方和斜下方的检测.第一列的检测会好做很多,因为只需要两层嵌套for循环的i和j相加或相减就可以实现斜方向的递进.而以最后一列的,则需要让两层嵌套for循环i和j的初始值设定为棋盘大小,然后递减.这就导致无法直接用i和j相加或相减来实现递进.我的解决办法是引入额外的变量reduce(具体详见源码),从0开始递增,这样就可以用i和reduce的相加或相减来实现递进.四、所做的内容: 和大多数五子棋游戏代码一样,我也是采用一个二维数组board来作为棋盘.同时采用一个全局变量boardsize来指定这个二维数组的大小,类似于这样:board[boardsize][boardsize].然后使用水平、竖直、斜方向来检测游戏是否出现结果。
有棋盘初始化函数,对二维数组board[][]进行赋值.有棋盘打印函数实现棋盘的显示.一个棋子输入函数.一个胜负检测函数.一个信息输出函数.然后在main函数里面采用while循环实现游戏的流程.列举几个很有用的变量:
Board[][];//字符串型,作为棋盘的二维数组,是全局变量
Boardsize;//int型,控制棋盘大小,是全局变量
E_o_t;//布尔变量,用来判断main函数中的while循环是否结束.即实现游戏是否结束功能.W_steps,B_steps;//int型,用来记录白棋,黑棋连在一起的棋子的个数,它们中的任何一个值达到5,则代表相应的棋手赢了.Reduce;//int型,在胜负检测函数中斜方向的检测用到,前面用介绍.控制台用到的命令:
Javac;//用来编译记事本写的程序.Java;//用来执行编译过的程序
五、总结:
这次的作业,感觉对自己的代码能力有一定的提升,同时,对java编程有了更深的认识, 同时了解到在java编程中,几乎所有的全局变量和方法函数,需要被定义成static.也认识到java提供的一些方法函数功能十分强大,例如bufferedreader.六、源码:
importjava.io.InputStreamReader;importjava.io.BufferedReader;public class test2{ private static String[][] board;private static intboard_size=16;
private static boolean PLAYER=true;//棋手,默认白棋先下.false代表黑棋,true代表白棋 private static booleane_o_n=true;//作为循环(游戏)是否结束的依据,意思为end or not.public static void board_init(){ board=new String[board_size][board_size];for(inti=0;i for(int j=0;j board[i][j]=“+”; } } } public static void board_print(){ for(inti=0;i if(i==0){ for(intbou=0;bou if(bou==0) System.out.print(bou+“-------”); else if(bou>=1&&bou<=9) System.out.print(“0”+bou+“-”); else System.out.print(bou+“-”); } System.out.print(“n”); } for(int j=0;j if(j==0){ System.out.print(i+1+“t”+board[i][j]); } else System.out.print(“-”+board[i][j]); } } System.out.print(“n”);} for(intbou=0;bou if(bou==0) System.out.print(“--------”); else if(bou>=1&&bou<=9) System.out.print(“0”+bou+“-”); else System.out.print(bou+“-”); } System.out.print(“n”); //实现棋子输入并调换棋手 public static void qizi_input(inta,int b){ int x=a-1; int y=b-1; if(x>=0&&y if(true==PLAYER){ board[x][y]=“●”; PLAYER=false; } else{ } } else board[x][y]=“○”;PLAYER=true; System.out.println(“【棋子必须落在棋盘上且该位置没有已下的棋子!】”); } public static void WINNERis(){ //实现判断胜负方法并输出输赢信息 intB_steps=0;intW_steps=0;for(inti=0;i for(int j=0;j if(board[i][j]==“●”){ W_steps++; } else{ W_steps=0;} if(board[i][j]==“○”){ B_steps++;} else{ B_steps=0;} if(5==W_steps){ System.out.print(“【白棋赢了O(∩_∩)O!黑棋输了~(╯﹏╰)~】”);e_o_n=false;break;} if(5==B_steps){ System.out.print(“【黑棋赢了O(∩_∩)O!白棋输了~(╯﹏╰)~】”); e_o_n=false; break; } } W_steps=0;B_steps=0; } for(int j=0;j for(inti=0;i if(board[i][j]==“●”){ W_steps++;} else{ W_steps=0;} if(board[i][j]==“○”){ B_steps++;} else{ B_steps=0;} if(5==W_steps){ System.out.print(“【白棋赢了O(∩_∩)O!黑棋输了~(╯﹏╰)~】”);e_o_n=false;break;} “); ”); if(5==B_steps){ System.out.print(“【黑棋赢了O(∩_∩)O!白棋输了~(╯﹏╰)~】”); e_o_n=false; break; } } W_steps=0;B_steps=0; } for(inti=0;i for(int j=0;j if(i+j if(board[i+j][j]==“●”){ W_steps++;} else{ W_steps=0;} if(board[i+j][j]==“○”){ B_steps++;} else{ B_steps=0;} if(5==W_steps){ System.out.print(“【白棋赢了O(∩_∩)O!黑棋输了~(╯﹏╰)~】 e_o_n=false;break;} if(5==B_steps){ System.out.print(”【黑棋赢了O(∩_∩)O!白棋输了~(╯﹏╰)~】 e_o_n=false; break; } } else continue;} for(int j=0;j if(board[i-j][j]==“●”){ “); ”); W_steps++;} else{ W_steps=0;} if(board[i-j][j]==“○”){ B_steps++;} else{ B_steps=0;} if(5==W_steps){ System.out.print(“【白棋赢了O(∩_∩)O!黑棋输了~(╯﹏╰)~】 e_o_n=false;break;} if(5==B_steps){ System.out.print(”【黑棋赢了O(∩_∩)O!白棋输了~(╯﹏╰)~】 e_o_n=false; break; } } else continue;} W_steps=0;B_steps=0; } for(inti=board_size-2;i>0;i--){ //实现最右列的斜方向的判断 int reduce=0;for(int j=board_size-1;j>0;j--){ if(i-reduce>0){ if(board[i-reduce][j]==“●”){ W_steps++;} else{ W_steps=0;} if(board[i-reduce][j]==“○”){ B_steps++;} “); ”); “); ”); else{ B_steps=0;} if(5==W_steps){ System.out.print(“【白棋赢了O(∩_∩)O!黑棋输了~(╯﹏╰)~】 e_o_n=false;break;} if(5==B_steps){ System.out.print(”【黑棋赢了O(∩_∩)O!白棋输了~(╯﹏╰)~】 e_o_n=false; break; } reduce++;} else continue;} reduce=0;for(int j=board_size-1;j>0;j--){ if(board_size>i+reduce){ if(board[i+reduce][j]==“●”){ W_steps++; } else{ W_steps=0; } if(board[i+reduce][j]==“○”){ B_steps++; } else{ B_steps=0; } if(5==W_steps){ System.out.print(“【白棋赢了O(∩_∩)O!黑棋输了~(╯﹏╰)~】 e_o_n=false;break;} if(5==B_steps){ System.out.print(”【黑棋赢了O(∩_∩)O!白棋输了~(╯﹏╰)~】 e_o_n=false; break; } reduce++; } else continue; } W_steps=0; B_steps=0; } } public static void INFO_SHOW(){ //显示棋盘及必要信息:落子方重新开始退出游戏 System.out.println(“【输入格式为:‘1,1’或者‘88,99’】”); if(true==PLAYER) System.out.print(“【想重新开始吗?请输入暗号88,88】【想退出游戏吗?请输入暗号66,66】n【现在落子方是白棋:”); else System.out.print(“【想重新开始吗?请输入暗号88,88】【想退出游戏吗?请输入暗号66,66】n【现在落子方是黑棋:”);} public static void main(String[] args)throws java.io.IOException { /** **实现整个逻辑流程的实现,** **黑白两方的步数统计 **胜负信息输出*/ test2 WUZIQI= new test2();//创建对象 System.out.print(“【控制台五子棋,超高逼格版】n【默认白棋先下,你无法改变,这就是命!】n【请务必根据指示操作】n”); WUZIQI.board_init(); WUZIQI.board_print(); //实现电脑控制台的输入读取 BufferedReader P_INPUT= new BufferedReader(new InputStreamReader(System.in)); String str_input= null; //循环体实现游戏框架 while(e_o_n){ INFO_SHOW(); } } str_input=P_INPUT.readLine();String[] posStrArr=str_input.split(“,”);intxPos=Integer.parseInt(posStrArr[0]);intyPos=Integer.parseInt(posStrArr[1]);if(88==xPos&&88==yPos){ WUZIQI.board_init();continue;} if(66==xPos&&66==yPos){ e_o_n=false;continue;} qizi_input(xPos,yPos);WUZIQI.board_print();WINNERis();System.out.println(“n【游戏结束,再见哦,亲!】”); } 一、实验目的 (1)使用Java编写五子棋程序 (2)掌握编写过程的一些类和类成员的使用,并且了解五子棋制作过程的一些步骤和了解一些算法。 二、实验环境 在电子楼2楼,装有My Eclipse 的计算机上进行 三、实验内容 编写一个五子棋程序。程序主要实现以下功能: 1.实现五子棋界面,要求人性化界面简洁美观; 2.实现黑白色轮流下棋功能,能提示下棋方; 3.实现连成五子自动判断功能; 4.实现时间设置功能,认输功能; 核心代码如下: 1.我的第一步是设计界面。在这个过程的要使用到以下的步骤: 1.使用MyEclipse 创建一个Project关于这个工程,加入两个类,分别是ChessFrame和Chess,而ChessFrame是这个工程中最重要的一个部分。创建过程中要继承JFrame类,并且要继承Runnable 和 MouseListener 这两个接口,分别是用来监听鼠标的移动和时间的变化。2.在给这个JFrame设置大小和颜色等一些东西。这里最主要的是使用了两个函数,是以前没见过的: 1.这个是用来设置默认的窗口关闭事件的 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);2.这两个是用来获得屏幕的大小的 Toolkit.getDefaultToolkit().getScreenSize().height;Toolkit.getDefaultToolkit().getScreenSize().width; 3.把本地的背景图片加到这个窗口中,作为这个窗口的背景图: 使用的到的类有BufferedImage和 ImageIO这两个类,这两个类是专门用来处理这种功能的。主要的代码如下: BufferedImage bg = null;bg = ImageIO.read(new File(“e:/background.jpg”));g.drawImage(bg,0,0,this);这样这个图片就加到了这个窗口的背景去了。 这里有一个改进就是双缓冲技术,可以防止闪屏。这个技术就是在界面和内存都有一幅图,我们的改动不是直接画界面,而是内存中先画好然后把内存中直接显示出来,那样就没有了一前一后的,那就没有了闪屏的事情发生了。 4.就是画棋盘和写一些游戏信息: 这步比较简单,也没什么可以说的,用到的一些画线的函数,和写String的一些函数。 以上做完以后就可以出现以下的界面: 1.我的第二步就是增加对mouse的点击和移动的处理,这样以后就可以用来下棋。在这个过程的要使用到以下的步骤: 1.增加对mouse的监视,然后重写它的一些函数: 1.我们在ChessFrame的构造函数中加入了addMouseListener()函数,然后重写关于这个的四个函数,我们这这里不重写所有的函数,就改写一个MousePress函数就可以了。改写的代码如下: public void mousePress(MouseEvent arg0){ this.x = arg0.getX();this.y = arg0.getY();if(this.canplay) } this.repaint();现在要处理的就是加上棋子了,我在这个做了一下小改动可以更加准确的定位下棋的位置: if(x >= 10 && x <= 374 && y >= 72 && y <= 450){ int sx1 =(this.x72)/ 20;int yx1 =(this.x72)% 20;if(yx1 >= 10){ } if(yy2 >= 10){ } sy2++;sx1++;就是这个,我们通过监控鼠标的就可以得到点击的X,Y坐标,我在这里通过对它求余,假如余数大于10(就是一个格子的一半)那就给+1,不然不变。后面的画棋子是很简单的一个过程,使用的是现成的函数(drawoval) 2.这部要做的就是记录棋子和五子连的判断: 1.我们通过一个数组int给保存棋子,如果是0就是没子,1表示是黑子,2表示白子。在每次重绘的时候遍历这个数组显示,这样就可以保存棋子了。2.判断五子连起来然后获胜的算法: 这个算法是鉴戒例子上的: private boolean isline(int x, int y, int xchange, int ychange, int color){ int tempx = xchange;int tempy = ychange;int count = 1;while(x + xchange >= 0 && y + ychange >= 0 && color == chess1[x + xchange][y + ychange]){ count++;if(xchange!= 0){ } if(ychange!= 0){ if(ychange < 0){ xchange++; } } } } ychange--;ychange++;} else { xchange = tempx;ychange = tempy;while(xychange >= 0 } if(count >= 5){ } return true;return false;} else { && color == chess1[xychange]){ count++;if(xchange!= 0){ } if(ychange!= 0){ } if(ychange < 0){ } ychange--;ychange++;} else { xchange++;中心思想就是要判断就要判断8个方向,其中有的只是相反的方向,我们使用关于X,Y的相对的变化来判断,并且使用count来计数,如果到了5个就可以判断胜利啦。 1.我的第三步就是时间的变化和一些键的设置 1.关于时间的变化主要是在于线程的使用,这里我们这个JFrame它继承了Runnable 这个接口,不过我们要重写Run函数,这个run函数的代码如下: public void run(){ if(this.second > 0){ while(true){ this.repaint();if(this.isblack){ this.ss1--; if(this.ss1 == 0){ JOptionPane .showMessageDialog(this, “黑方超时~~~~¡¤游戏结束”); this.message1=“0:0:0”; { “白方超时~~~~¡¤¡¤游戏结束”);this.message2=“0:0:0”;this.canplay = false; { { } this.ss2--; if(this.ss2 == 0){ this.message1 = this.ss 1/ 3600 + “ : ” +(this.ss1 / 60this.ss1 / 60 * this.ss1=-1; this.canplay = false; }else if(this.ss1>0)3600 * 60)60this.ss2 / 3600 + “ : ” +(this.ss2this.ss2 / 3600 * 60 * 60); this.repaint();}else { } try { } Thread.sleep(1000);e.printStackTrace();} catch(InterruptedException e){ 这个函数是用来事时间的变化,所以每操作以后就让线程sleep(1000)就可以了,那样就是一秒钟。这样就可以倒计时了。2.现在我们要点击一个按钮要它有响应。 这里我们其实就没用到什么button,那为什么会有反应呢,因为我们通过鼠标的点击范围来确定要响应什么函数,这就是这里面的秘密.在public void mouseClicked(MouseEvent arg0)函数里有下面这些if的判断 if(x1 >= 404 && x1 <= 473 && y1 >= 74 && y1 <= 103)if(x1 >= 404 && x1 <= 473 && y1 >= 127 && y1 <= 155)if(x1 >= 404 && x1 <= 473 && y1 >= 179 && y1 <= 208)if(x1 >= 404 && x1 <= 473 && y1 >= 286 && y1 <= 316)if(x1 >= 404 && x1 <= 473 && y1 >= 338 && y1 <= 367)if(x1 >= 404 && x1 <= 473 && y1 >= 390 && y1 <= 419)这就是为了确定鼠标的范围,然后相对调用函数。 其他还有就是一些Debug处理,在程序已经处理了,结果的还是蛮可以处理的,不过只能是人人对战。 四、实验心得与小结 这次试验总的来说没有想像中那么难,还有视屏的帮助,感觉起还是很容易动手的,不过由于自己没上心,没有做比较大的改动,最主要的人机的对战没做出来是满遗憾的,不过通过这个试验,让我学习了不少的知识,比如双缓冲,mouselistener 等许多许多的知识,还有关于五子棋算法的设计也是一部分。不管怎么说还是有学到知识的,没什么改动,但对现有的知识的掌握还是很可以的。 五、指导教师评议 成绩评定: 指导教师签名: 10:10-10:40 区域游戏 一、活动目标: 1、新增区域中幼儿能迅速接受理解新游戏。 2、大胆选择自己喜欢的游戏材料和游戏内容,自主愉快地游戏。 3、能与同伴合作游戏,积极交流自己的想法。 二、活动准备: 1、经验准备:知道各区域的游戏玩法。 2、物质准备:(1)各区游戏材料如:穿编游戏、飞行棋、小画板等。 (2)新增游戏区域材料如:五子棋 3、区域内容: (1)公共区域:大舞台、美发屋等。(2)班级区域: (3)美食区(关东煮):肉串、涮炉等。 美食区(面包店):面包、披萨等。 美食区(咖啡店):咖啡机、桌椅等。 动手区(制作区):剪刀、双面胶等。 动手区(编织区):编制篮等。 益智区(好玩的磁铁):磁铁、迷宫板等。 益智区(解锁):锁、钥匙等。 阅读区:书籍,桌椅等。 三、活动过程: (一)介绍玩法,激发兴趣。 教师:今天我们的益智区有了新的棋类游戏——五子 棋。 五子棋是中国民间的一种棋类小游戏,十分地简单,谁先横排、竖排、斜排列出5个棋子就算获胜。 (在电脑上下载五子棋的小游戏进行演示,并讲解。) (二)提出要求,注意安全。 师: 游戏前老师有几点要求提醒大家。 1、动手区里做粘贴画时要注意不要把豆子撒在地上,更不能放进鼻子耳朵里。 2、建构区的小朋友在堆摆易拉罐的时候请轻拿轻放。 3、益智区里初学五子棋的小朋友遇到问题主动找老师。 4、要和其他小朋友文明交往、合作,学会谦让。 5、垃圾放在垃圾桶,不可以随地乱丢。 小朋友们坐坐好,坐的好的小朋友先插卡进区。 (三)自主进区,观察记录 1、了解幼儿入区的情况,是否全部入区,情绪如何。 2、关注各区域活动情况,教师适当加入。 3、仔细观察并记录,给予有困难的幼儿帮助。 4、提醒幼儿遵守游戏规则,学会谦让合作。 (四)重点指导手工区——五子棋 (五)结束活动,观察记录。整理和收拾 督促幼儿收拾整理,做到轻、快、齐,教师协助收拾整理。 (六)游戏评价 (1)讲解与展示 幼儿自己介绍自己的作品,感受成功后的快乐。 (2)交流与发现 让幼儿交流今天的活动,活动中开心的事情和遇到的问题。 (3)小结 表扬与批评,出示活动中拍摄的照片进行点评,提出新要求。 《Java语言程序设计》 课程设计报告 学 院: 信息科学技术学院 班 级: 软件技术2班 姓 名: 王更新 学 号: 1108900505 指导教师: 郭韶升 课设时间: 2014-03-17 至2014-03-26 二O一四 年 三月 二十六 日 目 录 一、设计要求…………………………………………....2 二、设计步骤…………………………………………....2 2.1程序流程图………………………….…………...2 2.2程序的功能分配……………………….………...3 三、设计正文…………………………………………....6 3.1创建棋盘类……………………………………….6 3.2判断输赢功能实现……………………………….9 3.3测试结果……………………………………….....9 四、心得体会…………………………………………...12 五、参考文献…………………………………………...12 附录(源代码)……………………………………….13 一、课程设计要求 设计一个15╳15围棋棋盘,由两玩家交替进行对战,并可以实现以下功能: 1.选择落子的先后顺序 2.重置棋盘 3.刷新重新开始 4.退出提示 并且规定退出者判为负,但退出过程中要有提示。以防不小心点错了。最后判断某一方是否为五子连珠。 实现一个简单的多用户五子棋的游戏程序,包括如下两个界面(1)选择对弈桌(执黑、执白)。 (2)在游戏界面,有开始,退出(游戏未结束、点退出自动判负); 二、设计步骤 2.1程序流程图 2.2 程序的功能分配 a.棋盘的绘制 public void draw_qipan(Graphics G)//画棋盘 15*15{ G.setColor(Color.lightGray); G.fill3DRect(10,10,300,300,true); G.setColor(Color.black); for(int i=1;i<16;i++){ G.drawLine(20,20*i,300,20*i); G.drawLine(20*i,20,20*i,300); } } b.添加按钮 Button b1=new Button(“开始”);Button b2=new Button(“重置游戏”);Label lblWin=new Label(“ ”);Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button(“退出”);public void init(){ ckbHB[0]=new Checkbox(“执白”,ckgHB,false); ckbHB[1]=new Checkbox(“执黑”,ckgHB,false); ckbHB[2]=new Checkbox(“观看”,ckgHB, false);} c.鼠标棋子的触发事件 public void mouseClicked(MouseEvent e){ Graphics g=getGraphics(); int x1,y1; x1=e.getX(); y1=e.getY(); if(e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300){ return; } if(x1%20>10){ x1+=10; } if(y1%20>10){ y1+=10; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); m*=(-1);} d.按钮的触发事件 public void actionPerformed(ActionEvent e){ Graphics g=getGraphics(); if(e.getSource()==b1){ Game_start(); } else{ Game_re(); } if(e.getSource()==exist){ Game_re(); lblWin.setText(Get_qizi_color(color_Qizi)+“输了!”); intGame_Start=0; } e.判断落子的位置及画出相应的黑白棋子 public void set_Qizi(int x,int y)//落子{ if(intGame_Start==0)//判断游戏未开始{ return; } if(intGame_Body[x/20][y/20]!=0){ return; } Graphics g=getGraphics(); if(color_Qizi==1)//判断黑子还是白子{ g.setColor(Color.black); color_Qizi=0; } else{ g.setColor(Color.white); color_Qizi=1; } g.fillOval(x-10,y-10,20,20); intGame_Body[x/20][y/20]=color_Qizi+1;} f.判断胜负 if(Game_win_1(x/20,y/20))//判断输赢1{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”); intGame_Start=0; } if(Game_win_2(x/20,y/20))//判断输赢2{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”); intGame_Start=0;} if(Game_win_3(x/20,y/20))//判断输赢3{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);intGame_Start=0;} if(Game_win_4(x/20,y/20))//判断输赢4{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”); intGame_Start=0;} } 三、设计正文 3.1创建棋盘类 Public class WcyChess extends Applet ActionListener,MouseListener,MouseMotionListener,ItemListener{ int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子 int intGame_Start=0;//游戏开始标志 0未开始 1游戏中 int intGame_Body[][]=new int[16][16];//设置棋盘棋子状态 int m=-1;Button b1=new Button(“开始”);Button b2=new Button(“重置游戏”);Label lblWin=new Label(“ ”);Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button(“退出”);CheckboxGroup ckgHB=new CheckboxGroup();NetchatClient chat=new NetchatClient();public void init(){ setLayout(null); addMouseListener(this); add(b1); b1.setBounds(330,50,80,30); b1.addActionListener(this); add(b2); b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=new Checkbox(“执白”,ckgHB,false); ckbHB[0].setBounds(320,20,60,30); ckbHB[1]=new Checkbox(“执黑”,ckgHB,false); ckbHB[1].setBounds(380,20,60,30); ckbHB[2]=new Checkbox(“观看”,ckgHB, false); add(ckbHB[0]); add(ckbHB[1]); add(ckbHB[2]); ckbHB[0].addItemListener(this); ckbHB[1].addItemListener(this); add(lblWin); lblWin.setBounds(330,180,80,30); lblWin.setBackground(Color.red); lblWin.setText(“胜利者!”);//没有显示? ckbHB[2].setBounds(440, 20,60, 30); add(exist); exist.setBounds(330,130,80,30); implements // exist.addActionListener(this);add(chat);chat.setBounds(20, 500, 300, 300);chat.frame();chat.setVisible(true);Game_start_csh();setSize(500,600);setVisible(true);} public void itemStateChanged(ItemEvent e){ if(ckbHB[0].getState())//选择黑子还是白子{ color_Qizi=0;} else{ color_Qizi=1;} } public void mousePressed(MouseEvent e){} public void mouseClicked(MouseEvent e){ Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY();if(e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300){ return;} if(x1%20>10){ x1+=10;} if(y1%20>10){ y1+=10;} x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);m*=(-1);} public void actionPerformed(ActionEvent e){ Graphics g=getGraphics();if(e.getSource()==b1){ Game_start();} else { Game_re();} } if(e.getSource()==exist){ Game_re(); lblWin.setText(Get_qizi_color(color_Qizi)+“输了!”); intGame_Start=0;} } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void paint(Graphics g){ draw_qipan(g); 3.2判断输赢功能实现 if(Game_win_1(x/20,y/20)){ //判断输赢1 lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”); intGame_Start=0;} if(Game_win_2(x/20,y/20)){ //判断输赢2 lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”); intGame_Start=0;} if(Game_win_3(x/20,y/20))//判断输赢3{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”); intGame_Start=0;} if(Game_win_4(x/20,y/20))//判断输赢4{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”); intGame_Start=0;} 3.3 测试结果 a.进入游戏界面 游戏开始的界面有三个选择项,用户可以选择相应的角色,选择 完毕后点击开始进入游戏。 b.选择角色,开始下棋 首先达到五个棋子连在一块的赢了,并在红色区域显示谁赢了!c.下完后,重新开始 下完一盘后游戏停止,点击重新开始,界面回到初始界面,选择角色继续游戏.d.游戏中点退出,自动判输 在下棋的过程当中谁中途退出,即点击退出,系统自动判断谁输 四、课程设计心得体会 通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。 五、参考文献 1.吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社 2.柳西玲.许斌编著.Java语言应用开发基础.北京:清华大学出版社 3.丁振凡 Java 语言实用教程 :北京邮电大学出版社 附录(源代码) import java.net.*;import java.io.*;import java.applet.*;import java.awt.*;import java.awt.event.*;import java.applet.Applet;import java.awt.Color;Public class wuziqi extends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener{ int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子 int intGame_Start=0;//游戏开始标志 0未开始 1游戏中 int intGame_Body[][]=new int[16][16];//设置棋盘棋子状态 int m=-1;Button b1=new Button(“开始”);Button b2=new Button(“重新开始”);Label lblWin=new Label(“ ”);Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button(“退出”);CheckboxGroup ckgHB=new CheckboxGroup();public void init(){ setLayout(null); addMouseListener(this); add(b1); b1.setBounds(330,50,80,30); b1.addActionListener(this); add(b2); b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=new Checkbox(“执白”,ckgHB,false); ckbHB[0].setBounds(320,20,60,30); ckbHB[1]=new Checkbox(“执黑”,ckgHB,false); ckbHB[1].setBounds(380,20,60,30); ckbHB[2]=new Checkbox(“观看”,ckgHB, false); add(ckbHB[0]); add(ckbHB[1]); add(ckbHB[2]); ckbHB[0].addItemListener(this); ckbHB[1].addItemListener(this); add(lblWin); lblWin.setBounds(330,180,80,30); lblWin.setBackground(Color.red); e.getY()<20 || e.getY()>300){ lblWin.setText(“胜利者!”);//没有显示? ckbHB[2].setBounds(440, 20,60, 30);add(exist); exist.setBounds(330,130,80,30);exist.addActionListener(this);Game_start_csh();setSize(500,600);setVisible(true);} public void itemStateChanged(ItemEvent e){ if(ckbHB[0].getState())//选择黑子还是白子 { color_Qizi=0;} else { color_Qizi=1;} } public void mousePressed(MouseEvent e){} public void mouseClicked(MouseEvent e){ Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY(); if(e.getX()<20 || e.getX()>300 || return;} if(x1%20>10){ x1+=10;} if(y1%20>10){ y1+=10;} x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);m*=(-1)} public void actionPerformed(ActionEvent e){ Graphics g=getGraphics();if(e.getSource()==b1){ Game_start(); } else{ // 输了!“); 赢了!”); Game_re();} if(e.getSource()==exist){ Game_re(); color_Qizi=m; lblWin.setText(Get_qizi_color(color_Qizi)+“ intGame_Start=0; } } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void paint(Graphics g){ draw_qipan(g);} public void set_Qizi(int x,int y){ //落子 if(intGame_Start==0){//判断游戏未开始 return;} if(intGame_Body[x/20][y/20]!=0){ return;} Graphics g=getGraphics(); if(color_Qizi==1){//判断黑子还是白子 g.setColor(Color.black); color_Qizi=0;} else{ g.setColor(Color.white); color_Qizi=1;} g.fillOval(x-10,y-10,20,20); intGame_Body[x/20][y/20]=color_Qizi+1;if(Game_win_1(x/20,y/20)){ //判断输赢1 lblWin.setText(Get_qizi_color(color_Qizi)+” intGame_Start=0; 了!“); 赢了!”); 赢了!“); 15*15 } if(Game_win_2(x/20,y/20)){ //判断输赢2{ lblWin.setText(Get_qizi_color(color_Qizi)+”赢 intGame_Start=0;} if(Game_win_3(x/20,y/20)){ //判断输赢3 lblWin.setText(Get_qizi_color(color_Qizi)+“ intGame_Start=0;} if(Game_win_4(x/20,y/20)){ //判断输赢4 lblWin.setText(Get_qizi_color(color_Qizi)+” intGame_Start=0;} } public String Get_qizi_color(int x){ if(x==0){ return “黑子”;} else { return “白子”;} } public void draw_qipan(Graphics G){ //画棋盘 G.setColor(Color.lightGray); G.fill3DRect(10,10,300,300,true);G.setColor(Color.black);for(int i=1;i<16;i++){ G.drawLine(20,20*i,300,20*i); G.drawLine(20*i,20,20*i,300);} } public void Game_start(){ //游戏开始 intGame_Start=1; Game_btn_enable(false); b2.setEnabled(true);} public void Game_start_csh(){//游戏开始初始化 intGame_Start=0; Game_btn_enable(true); b2.setEnabled(false); ckbHB[0].setState(true); for(int i=0;i<16;i++){ for(int j=0;j<16;j++){ intGame_Body[i][j]=0; } } lblWin.setText(“");} public void Game_re(){ //重新开始游戏 repaint(); Game_start_csh();} public void Game_btn_enable(boolean e){ //设置组件状态 b1.setEnabled(e); b2.setEnabled(e); ckbHB[0].setEnabled(e); ckbHB[1].setEnabled(e);} public boolean Game_win_1(int x,int y){ //横向判断输赢 int x1,y1,t=1; x1=x; y1=y; for(int i=1;i<5;i++){ if(x1>15){ break; } if(intGame_Body[x1+i][y1]==intGame_Body[x][y]){ t+=1; } else{ break; } } for(int i=1;i<5;i++){ if(x1<1){){ t+=1; } else{ break; } } if(t>4){ return true; } else{ return false; } } public boolean Game_win_2(int x,int y){ //纵向判断输赢 int x1,y1,t=1; x1=x; y1=y; for(int i=1;i<5;i++){ if(x1>15){ break; } if(intGame_Body[x1][y1+i]==intGame_Body[x][y]){ t+=1; } else{ break; } } for(int i=1;i<5;i++){ if(x1<1){ break; } if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){ t+=1; } break; } if(intGame_Body[x1-i][y1]==intGame_Body[x][y] else{ break; } } if(t>4){ return true; } else{ return false; } } public boolean Game_win_3(int x,int y){ //左斜判断输赢 int x1,y1,t=1; x1=x; y1=y; for(int i=1;i<5;i++){ if(x1>15){ break; } if(intGame_Body[x1+i][y1-i]==intGame_Body[x][y]){ t+=1; } else{ break; } } for(int i=1;i<5;i++){ if(x1<1){ break; } if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]){ t+=1; } else{ break; } } if(t>4){ return true; } else{ return false; } } public boolean Game_win_4(int x,int y){ //左斜判断输赢 int x1,y1,t=1; x1=x; y1=y; for(int i=1;i<5;i++){ if(x1>15){ break; } if(intGame_Body[x1+i][y1+i]==intGame_Body[x][y]){ t+=1; } else{ break; } } for(int i=1;i<5;i++){ if(x1<1){ break; } if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]){ t+=1; } else{ break; } } if(t>4){ return true; } else{ return false; } } } 软件工程设计 专 业:班 级:姓 名:学 号:指导老师: I 目录 第一章 需求分析.......................................................1 1.1 总体分析..........................................................1 1.2 初始化............................................................1 1.3 主循环控制模块....................................................1 1.4 玩家下子..........................................................1 1.5 盘面分析填写棋型表................................................2 1.6 对方下子..........................................................2 1.7 胜负判断..........................................................2 第二章 功能描述.......................................................3 2.1 功能模块图........................................................3 2.2 功能说明..........................................................3 第三章 系统设计.......................................................4 3.1 流程图............................................................4 3.2 流程图说明........................................................5 第四章 运行结果.......................................................6 第五章 总结...........................................................7 附录一 源代码.........................................................8 II 软件工程设计 五子棋游戏 第一章 需求分析 1.1 总体分析 软件需求分析是软件开发周期的第一个阶段,也是关系到软件开发成败的关键一步。对于任何一个软件而言,需求分析工作都是至关重要的一步。只有通过软件需求分析,才能把软件的功能和性能由总体的概念性描述转化为具体的规格说明,进而建立软件开发的基础。实践表明,需求分析工作进行得好坏,在很大程度上决定了软件开发的成败。 软件需求分析的任务是:让用户和开发者共同明确将要开发的是一个什么样的软件。具体而言,就是通过对问题及其环境的理解、分析和综合,建立逻辑模型,完成新软件的逻辑方案设计。 基于本游戏,首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组Table[15][15](15*15是五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用‘0’表示空位、‘1’代表己方的子、‘2’代表对方的子;这张表也是今后分析的基础。在此之后还要为两个玩家双方各建立一张棋型表Computer[15][15][4]和Player[15][15][4],用来存放棋型数据。 1.2 初始化 首先,建立盘面数组Table[15][15]、对战双方的棋型表Computer[15][15][4]和Player[15][15][4]并将它们清零以备使用;然后初始化显示器、键盘、鼠等输入输出设备并在屏幕上画出棋盘(棋盘可以不显示)。 1.3 主循环控制模块 控制下棋顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。 1.4 玩家下子 当轮到玩家下时,您通过键盘或鼠标在棋盘上落子,程序会根据该点的位置,在Table[15][15]数组的相应地方记录‘2’,以表明该子是玩家下的。 软件工程设计 1.5 盘面分析填写棋型表 您在下五子棋时,一定会先根据棋盘上的情况,找出当前最重要的一些点位,如“活三”、“冲四”等;然后再在其中选择落子点。先来分析己方的棋型,我们从棋盘左上角出发,向右逐行搜索,当遇到一个空白点时,以它为中心向左挨个查找,如果遇到己方的子则记录然后继续,如果遇到对方的子、空白点或边界就停止查找。左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,然后把棋型的编号填入到Computer[x][y][n]中就行了(x、y代表坐标,n=0、1、2、3分别代表横、竖、左斜、右斜四个方向)。而其他三个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,己方棋型表也就填写完毕了。然后再用同样的方法填写对方棋型表。 注意:所有棋型的编号都要事先 定义好,越重要的号数越大! 1.6 对方下子 有了上面填写的两张棋型表,就是遍历棋型表Computer[15][15][4]和Player[15][15][4]找出其中数值最大的一点,在该点下子即可。但这种算法的弱点非常明显,只顾眼前利益,不能顾全大局,这就和许多五子棋初学者一样犯了“目光短浅”的毛病。如果在这儿下子将会形成对手不得不防守的棋型(例如:‘冲四’、‘活三’);那么下一步对手就会照您的思路下子来防守您,如此一来便完成了第一步的预测。这时再调用模块4对预测后的棋进行盘面分析,如果出现了‘四三’、‘双三’或‘双四’等制胜点,那么己方就可以获胜了(当然对黑棋而言‘双三’、‘双四’是禁手,另当别论);否则照同样的方法向下分析,就可预测出第二步、第三步„„ 等一等,要是盘面上没有对手必须防的棋型,哪该怎么办呢?进攻不成的话就得考虑防守了,将自己和对手调换一下位置,然后用上面的方法来预测对手的棋,这样既可以防住对手巧妙的攻击,又能待机发动反击,何乐而不为呢! 1.7 胜负判断 务须多言,某方形成五子连即获胜;若黑棋走出‘双三’、‘双四’或长连即以禁手判负。 软件工程设计 第二章 功能描述 2.1 功能模块图 五子棋游戏判断棋盘是否已满判断是否出错并提示判断那方获胜交替循环双方下棋 图2.1 功能模块图 2.2 功能说明 该五子棋程序基本上实现了五子棋的游戏功能,有双方下棋的界面及最终判定结果的界面。同时该游戏采用二维坐标实现,明了易懂,方便玩家在游戏过程中的基本操作,使游戏更加简便。在细节方面,该系统提供实时存储功能,随时记录为完成的游戏,使用户可以很好的处理意外中断的情况。该游戏基本实现了游戏的一些要求和特征。在游戏的源程序及文档方面,我们也严格遵守软件工程思想,立足实验要求,确定任务,需求分析,设计和编码,每个步骤力求清晰易懂。原代码注释详尽,各功能模块功能分明,可移植性强。当然该系统也有很多不足的地方,第一次进行独立的课程设计,也有很多细节方面是考虑到的,这款游戏也是在不断的调试和修改中产生和完善的。希望老师能够指出不足,帮助我不断提高。 软件工程设计 第三章 系统设计 3.1 流程图 开始棋盘已满是输出平局否“0”方选位置判断该位置是否有棋有另找位置无“0”方落子否判断“0”方是否获胜是输出“0”方获胜否棋盘已满是输出平局结束否“x”方选位置判断该位置是否有棋有另找位置无“x”方落子判断“x”方是否获胜是输出“x”方获胜 图3.1 流程图 软件工程设计 3.2 流程图说明 本程序定义了各种操作函数、各种状态判定宏,思想明确,思路清晰。各个判断选择了不同路径,因此继续进行或输出结果。程序中,“循环”的利用非常直接和清晰,双方交替下棋,因此循环往复。最终决出胜负或最终平局。分析时,也考虑了许多种情况,针对各个情况均作出了相对措施和解决方案。 程序采用循环进行双方交替下棋,并进行了很多判断。首先判断棋盘是否已满,若棋盘已满,则输出平局,结束游戏;若棋盘未满,则继续进行。然后判断“0”方是否胜出,若“0”方获胜,则输出“0”方获胜,结束游戏;若“0”方没有获胜,则继续进行。再判断“x”方是否获胜,若“x”方获胜,则输出“x”方获胜,结束游戏;若“x”方没有获胜,则继续进行。回到“首先”的判断。如此循环„„ 软件工程设计 第四章 运行结果 图4.1 运行结果初始图 图4.2 游戏过程图 图4.3 软件工程设计 图4.4 图4.5 软件工程设计 图4.6 图4.7 软件工程设计 图4.8 游戏进行图 图4.9 “0”方获胜图 软件工程设计 附录一 源代码 #include using namespace std; int Hsheng(char a[][15]); //判断o子是否获胜的函数 int Bsheng(char a[][15]); //判断x子是否获胜的函数 int he(char a[][15]); //判断是否平局(也就是棋盘下满了)的函数 void qipan(char a[15][15]) //执行输出棋盘命令 { cout<<“本游戏采用二维数组实现,棋盘为15X15的二维直角坐标系,均从1到15,祝二位游戏愉快.”;for(int i=0;i<15;i++) //打印棋盘 {第二篇:Java五子棋实现报告
第三篇:区域游戏五子棋
第四篇:五子棋JAVA语言课程设计报告
第五篇:五子棋游戏软件工程课程设计