郑州有没有我家徒弟又挂了五子棋棋的俱乐部啊我是我是一个我家徒弟又挂了五子棋棋的爱好者嗯我就是找不到这方面

1821人阅读
程序人生(18)
简易五子棋的详细制作
&&&五子棋是我们日常经常玩的游戏,带给我们无无穷的乐趣。本文将详细的介绍简易五子棋的制作过程,五子棋虽然玩着简单,但要是制作的完美也需要很多耐心和技巧。
关键字&五子棋&制作
1&基本论述
&&&首先要说明一下,本五子棋设计除了计算机下子部分是参考了有关文献后,其余全部是自己独立完成,详细源代码可见附录。&
编写五子棋程序,在设计的初期,应该思考这样几个问题
(1)画棋盘和棋子。下棋时需要我们点击屏幕,一点击就要出现棋子,看似简单,但对于计算机来说,必须告诉它何时画,如何画,画哪里。
(2)对于落子的位置的准确判断,我们点击的时候,在我们想下子的那个地方,会有一小块区域,我们必须保证在该区域点击时棋子都能落在那个中心点上。这个过程有两个方法。一个是通过设计虚框;另一个就是对于边界的判断。
(3)解决落子问题后,对于棋手走的每一步,我们都需要判断胜负问题。最简单的办法就是穷举,虽然看似不巧妙,但是简单易操作。而且对于五子棋的设计,也不会花费太多的时间。
(4)以上问题可以解决人人对弈,我们还有实现人机对战,这就需要判断计算机应该在什么地方落子才合适。
&&&以上是制作五子棋需要重点考虑的问题,可以让我们从宏观上把控我们要制作的东西。
2&详细设计
2.1界面设计
&&&&frame=new&JFrame("五子棋--李亚勇");
&&&&&&&panel1=new&MyPanel();
&&&panel2=new&JPanel();
&&&frame.setLayout(null);
&&&frame.setSize(615,720);
&&&panel2.setLayout(null);
panel2.setSize(580,580);
panel2.setBackground(Color.orange);
panel2.add(panel1);
panel1.setLocation(10,10);
frame.add(panel2);
panel1.setSize(570,570);
panel1.setBackground(Color.ORANGE);
panel2.setLocation(10,70);
以上代码是对面板的设计,由于我对内容窗格的知识把握不好,因此面板的布局是任意布局,自己设定面板的大小,以及在框架中出现的位置和颜色。这个过程中我使用了两块面板,其中一块是自己定义类的对象,这样做的目的是为了更好的绘制棋盘和棋子,使它们不受其他因素的影响。
接下来是菜单栏的设计。看截图:
我的菜单条中有三个菜单,Choice是让用户选择对战模式;Set功能尚没有添加;About是版权信息。
JMenuBar&menubar=new&JMenuBar();
frame.setJMenuBar(menubar);
以上这段代码是将菜单条添加到界面中
JMenu&menu1=new&JMenu("Choice");
JMenuItem&m1=new&JMenuItem("人人对战");
m1.addActionListener(new&M1());
JMenu&m2=new&JMenu("人机对战");
JRadioButtonMenuItem&m21=new&JRadioButtonMenuItem("简单",true);
m21.addActionListener(new&M21());
JRadioButtonMenuItem&m22=new&JRadioButtonMenuItem("中等");
m22.addActionListener(new&M22());
JRadioButtonMenuItem&m23=new&JRadioButtonMenuItem("困难");
m23.addActionListener(new&M23());
m2.add(m21);
m2.add(m22);
m2.add(m23);
ButtonGroup&group=new&ButtonGroup();
group.add(m21);
group.add(m22);
group.add(m23);
JMenuItem&m3=new&JMenuItem("退出");
m3.addActionListener(new&M3());
menu1.add(m1);
menu1.add(m2);
menu1.addSeparator();
menu1.add(m3);
以上这段代码是给Choice添加三个菜单,人人对战,人机对战,退出。其中人机对战中又包括三个子菜单,是难度的选择,注意,这里的三个子菜单需要用到互斥菜单项,通过将它们分在一个组里实现。这样保证每次只能选择一个选项,而且设定默认选择状态。在退出上面,还加入一条分隔横线,menu1.addSeparator();这样使我们感觉非常有条理。样子设计出后&,我们要对每个功能菜单进行响应,这样才能实现我们想要的功能。其中,界面截图如下:
&&&&&&&&&&
JMenu&menu3=new&JMenu("About");
JMenuItem&m31=new&JMenuItem("关于我");
menu3.add(m31);
m31.addActionListener(new&Menu3());
对于About菜单,其中只有一个菜单,点击这个菜单时,可以弹出一个消息框,说明我的信息,响应函数如下:
public&class&Menu3&implements&ActionListener{
public&void&actionPerformed(ActionEvent&e)&{
//dialog.setVisible(true);
JOptionPane.showMessageDialog(frame,&"此五子棋版权属于李亚勇\n武汉理工大学-软件工程1001班\nQQ:");
效果截图如下:
frame.setResizable(false);这句代码的意思固定游戏面板的边框,使用户不能通过拖动实现边框的扩大与缩小,而且也不能实现最大化的效果。
2.2&绘制棋盘和棋子
这里需要说明一个问题,计算机中的一些画面,其实都是一种假象,它通过近
似来欺骗我们的眼睛。比如我们看一条直线,其实并不是直的,只有像素点足够小,就会给我们的眼睛造成假象。对于五子棋的棋盘时很容易画的,但是对于棋子,因为每次都需要我们点击时绘画,这就需要我们响应鼠标事件。但是Java中,单击鼠标的响应函数中,不能直接用绘图函数来实现,因此,我在此设计中使用的方法是,建立一个和棋盘一样大小的整型二维数组,每个元素的值为0时代表无棋子,1表示棋手1,2表示棋手2或计算机,这样,我们单击鼠标时,就对对应元素进行赋值。然后调用绘图函数,将棋盘,棋子重新绘制,从而给人一种点击落子的效果。
protected&void&paintComponent(Graphics&e)
super.paintComponent(e);
for(int&js=0;js&=560;js+=40)
&&&&e.drawLine(0,js,560,js);
&&&&&&&&&&&&for(int&js=0;js&=560;js+=40)
&&&&e.drawLine(js,0,js,560);
e.setColor(Color.black);
e.fillOval(115,115,10,10);
e.fillOval(435,115,10,10);
e.fillOval(115,435,10,10);
e.fillOval(435,435,10,10);
e.fillOval(275,275,10,10);
以上这段代码是画棋盘,其中还包括四个小黑点。
for(i=0;i&15;i++)
for(j=0;j&15;j++)
&&&&&&&&draw(e,i,j);
以上这段代码是对整个棋盘数组的检查,每个元素都传递给draw函数,对于非0的元素,经过坐标变化,在棋盘上画点。这里要注意,每次落子时,对相应的元素进行赋值,然后调用repaint(),就会实现棋子的绘制。
&&&&&&&&public&void&draw(Graphics&g,&int&i,&int&j){
if(chessmap[i][j]==1){
&&&&g.setColor(Color.black);
&&&&g.fillOval(40*i-20,40*j-20,40,40);&}
if(chessmap[i][j]==2){
g.setColor(Color.white);
g.fillOval(40*i-20,40*j-20,40,40);}}
上面的代码是画黑白棋子,这里要注意的是二维数组和面板上坐标的对应。
2.3&落子的判断
对于落子边界的判断,这里通过比较来实现,很简单
private&int&bj[]={0,40,80,120,160,200,240,280,320,360,400,440,480,520,560};这个数组中的每个元素值都是棋盘中网格线的坐标,点击棋盘的坐标可以通过函数e.getX()和e.getY()可以获取,然后和数组进行比较,由于每个方格的边长是20,只要它们之间的距离的绝对值小于20,说明就落在了用户想要的位置,非常简单,一下就是函数的具体代码:
int&pdbj(int&xx){
for(i0=0;i0&15;i0++)
if(((xx-bj[i0])&20)&&((xx-bj[i0])&-20))
xx=bj[i0];
return(xx/40);}
2.4&出子问题
由于对战的方式有多种,因此需要模式标记。当模式为人人对战时,需要设定棋手1和棋手2,一个棋手下完子,将下子权交给另一个,以此实现轮流落子的问题。具体代码如下:
else&if(gamemodel==1){
&&&x=pdbj(e.getX());
&&&y=pdbj(e.getY());
&&&if(chessmap[x][y]!=0){}
&&if(qsjh==1){
&&&&&&&&&chessmap[x][y]=1;
&&&&&&&&&qsjh=2;&}
&&&&&&else&if(qsjh==2){
&&&&&chessmap[x][y]=2;
&&&&&qsjh=1;}&}
&&&repaint();
&&&pdsy();}
qsjh是代表棋手的选择权,chessmap是棋盘数组,pdsy()是对棋盘进行扫描,进行胜负判断,后面会详细介绍。
对于计算机落子,比较复杂。虽然本例中有简单,中等,困难三种选择,但实际上只实现了一种下棋模式。核心算法就是对整个棋盘进行扫描。空白位置是我们可能落子的位置,因此我们要计算该空白子的地方,周围是否有棋子,如果有,要判断是人还是计算机的子,接着要看同子的数目。得出后进行比较。如果用户下子的连续数大于计算机,说明此时应该进行防守,在对自己有利的空白位置落子。反之,则进攻,在自己连续数最多的地方落子。判断了落子位置,调用绘图函数,即可实现落子。代码如下:
void&jsjcq(){
int&max_black,max_white,max_temp,max=0;
int&x=0,y=0;
for(int&i=0;i&15;i++){
&&&&for(int&j=0;j&15;j++){
&&&&&&&&if(chessmap[i][j]==0){
&&&&&&&&&&&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_
&&&&&&&&&&&&&&x=i;
&&&&&&&&&&&&&&y=j;&}}}}
&&&&&&&&&&&&chessmap[x][y]=2;}
对于棋盘的扫描,由于代码比较多,只取其中的两段,判断左边和右边
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_
&&&&//judge&right
for(int&i=1;i&5;i++){
x_temp1+=1;
if(x_temp1&14)
if(chessmap[x_temp1][y_temp1]==black_or_white)
&&&&//judge&left
&&&&x_temp1=x_
&&&&for(int&i=1;i&5;i++){
&&&&x_temp1-=1;
&&&&if(x_temp1&0)
&&&&break;
&&&&if(chessmap[x_temp1][y_temp1]==black_or_white)
&&&&&&&num++;
&&&&break;
&&&max_temp=
2.5&胜负判断
对于胜负的判断,这里采用的方法很简单。对这个棋盘的四个方向进行扫描,需要用到六个for循环
if(chessmap[i00][j00]==0){
&&&&pk1=0;
&&&&pk2=0;
else&if(chessmap[i00][j00]==1){
if(pk1==5){
&&&if(gamemodel==1)
&&&&&&JOptionPane.showMessageDialog(frame,&"黑棋胜!!!");
&&&else&&&JOptionPane.showMessageDialog(frame,&"恭喜!!!您胜了");
else&if(chessmap[i00][j00]==2){
if(pk2==5){
if(gamemodel==1)
JOptionPane.showMessageDialog(frame,&"白棋胜!!!");
else&&&JOptionPane.showMessageDialog(frame,&"Sorry!您输了");
对于每个元素,如果为0,对标记号进行归0,直接下一个,对于有数的,判断是哪一方,然后相应的加1,每次检查连续子数是否达到了5,一旦达到,即判断胜负。这里要注意,对应不同的模式。对于人人对战,应该显示哪一种棋色的棋子获胜,对于人机对战,应该提示是用户获胜还是计算机获胜。
其实这里还有一个小问题需要解决,就是当棋子提示胜负后,取消消息框,这时的棋盘应该不能再落子,所以这时用pk11和pk22这两个整型数来标记棋盘中是否有达到5的连续棋子,在没有的情况下,才可以进行落子,绘制棋子的操作。如图:
一些效果截图:
3&课程体会
本学期通过对软件开发工具的学习,是我对Java语言设计有了更深刻的体会,也激发了我对该语言的学习兴趣。在设计中我最大的体会就是,编程要从小做起,不能一下子把整个东西做出来。我每做一个小块,都会遇到很多错误,由于规模小,我很快就能发现错误,然后改正运行,这使我非常有信心做下去,当后面的代码增多,我也不会感到害怕,因为前面的代码都已经熟悉,而且没有错误,只改后面的错误就可以了。在编程中,一定要养成好的习惯。尽管eclipse软件的功能非常强大,但我们仍要注意,行之间的层次,这样可以使我们很快的找出错误。在编程过程中,不要迷信提示信息,不一定准确,也不要害怕错误很多,因为往往有时候很多的错误信息,其实就是因为你少加了一个括号造成的。同时,编程要有耐心。虽然当我们看到自己的产品做出来时很有成就感,但是制作过程是很枯燥和艰难的,我们一定要克服这个困难才可以。
除了书本知识,老师还教会我们许多做人求学问题的道理。人生在世,就要追求真知,剔除伪知。我们要不断的反省自己,思考自己以后的人生,未来的发展方向。计算机是一门伟大的科学,涉及了数学,哲学的思想,对我们的自身素养也是有极大地提高。
通过导师的讲解,我对计算机的由来,以及它的工作原理有了更深的认识。也通过该课程我接触到了数据库这个让我非常感兴趣的知识块。我会认真反思老师所讲,把软件这门学科学的扎扎实实。
4&读大学体会
&&&&我读大学的这三年,一直在反思大学是让我们来干什么的。我一直认为,大学和技校的性质是一样的,都是让人掌握技能,出去挣钱。但是大学里面有丰富的资源,有好的机遇,这是技校所不能给予的。我们在大学里,应该疯狂的掌握本专业的知识,努力的充实自己,不停的反思自己的不足,不断的去改进自己,这样,自己以后的人生才会辉煌。因此说,大学是我们人生中的一个重大机遇,把握好了,终身受益;荒废度日,日后只会空有遗憾。对于我们软件专业,我觉得应该多加练习编程,多学习有关编程方面的课程。再次也建议学院,能够多开设程序语言方面的课程,多布置编程作业,比赛,强化我们的基础,提高我们队程序的兴趣。
5&参考文献
【1】《Java程序设计》&辛运帏&饶一梅&马素霞&&清华大学出版社
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:60188次
排名:千里之外
原创:130篇
转载:21篇
(2)(1)(1)(1)(1)(1)(4)(1)(4)(8)(5)(6)(1)(3)(1)(1)(4)(3)(104)(1)(2)鏍忕洰瀵艰埅
鏂伴椈鎼滅储
缃戠珯瀵艰埅
鎴戠ぞ绗?笁娆′妇鍔炵渷浜斿瓙妫嬭禌
鈥滃ぉ鍏冩澂鈥

我要回帖

更多关于 我学会了下五子棋 的文章

 

随机推荐