简单的五子棋(人人对战)
来源:互联网 发布:互联网数据库 编辑:程序博客网 时间:2024/04/30 04:58
这是一个简单的五子棋游戏,目前只实现了简单的人人对战,就是自己跟自己下。。。具体效果如下:
实现这个效果也很简单,主要功能是:
1、点击棋盘能下棋子、棋子位置在棋盘点、点击点和下子点近似判断、黑白棋子交替出现
2、某个棋盘点下了棋子后不能被覆盖
3、判断输赢条件
4、分胜负之后不能再下
一般来说做这个棋盘应该用十几条直线交替画出来,我是用一张图片代替,所以省去了画直线的方法,然后主要的是计算图片中的棋盘点了
所以选用图片一定要选棋盘隔是均匀的矩形,这样方便我们计算每个交点的坐标。计算坐标时当然要考虑到这个图片的规格了,有个经验是用QQ的截图功能(ctrl+alt+A),去选取那个区域,上面会显示区域的长和宽,就可以得到坐标了,像这样:
这样我就知道棋盘左上角的第一个点坐标是(38,25),棋盘每个格的边长都是32。
接下来是画棋子,因为不可能让玩家鼠标点击的点总要刚好等于棋盘交线处的点才能下棋子,这样太费劲了,所以应该还做一个近似判断,就是当点击处离某一个交线点很近的时候,就视为在那个棋盘点下棋了。我的画棋子方法是在棋子类里面(每画一个棋子就创建一个棋子类,再调用棋子类里面的画棋子方法),棋子大小为24(所以画的时候要注意fillOval方法给的参数不是圆心而是左上角的坐标,这样就要减12)。
下棋分黑棋和白棋,黑白棋交替下这个用奇偶数判断就行了,即设置一个int型变量count,判断它%2的值为0还是1,0画白子,1画黑子,然后每下一次棋这个数加一即可。
然后还需判断这个点有没有下过棋子,这个地方我用的是一个18*18 的二维数组,就是涵盖所有棋盘点的数组,数组内的每个元素对应元素角标的棋盘点,这样给没下过棋子的棋盘点对应的元素赋值0,给下过的赋值1,这样当玩家下棋时判断这个点的值是不是0,是0才能下棋,也就不能覆盖了
代码如下:
//遍历所有棋盘点for(int i=0;i<18;i++){for(int j=0;j<18;j++){//近似判断if(Math.abs(38+32*i-x)<12&&Math.abs(25+32*j-y)<12){//这个点没有下过棋子且游戏没有结束if(point[i][j]==0&&winner==null){//创建新的棋子pieces[i][j] = new Pieces(38+32*i-12, 25+32*j-12,count);//画出此棋子pieces[i][j].drawPieces(g);game_panel.setPieces(pieces);//步数加一count++;//此点已占point[i][j]=1;if(count>=9){//判断游戏胜负的方法win();//有一方获胜if(winner!=null){//调用提示框的类new Message(winner,pieces,game_panel);}}}}}}
接下来就要实现判断输赢的功能了,这应该是在每下一个棋子时就判断一次,判断的原理就是遍历棋子的四个方向,如果棋子的颜色和某一方向的连续四个相邻棋子都相同,则这个颜色的玩家就赢了
//胜负判断public void win(){for(int i=0;i<18;i++){for(int j=0;j<18;j++){//右斜的棋子判断if(i<14&&j<14&point[i][j]==1){int flag=0;//连续四个棋子是否都一样for(int k=1;k<5;k++){if(pieces[i+k][j+k]!=null){//kind是存储这个棋子的颜色的属性if(!pieces[i+k][j+k].kind.equals(pieces[i][j].kind))break;}flag++;}if(flag==4){winner = pieces[i][j].kind+" win!";}}//左斜的棋子判断if(i<14&&j>3&point[i][j]==1){int flag=0;for(int k=1;k<5;k++){if(!pieces[i+k][j-k].kind.equals(pieces[i][j].kind))break;flag++;}if(flag==4){winner = pieces[i][j].kind+" win!";}}//横着的棋子判断if(i<14&&point[i][j]==1){int flag=0;for(int k=1;k<5;k++){if(!pieces[i+k][j].kind.equals(pieces[i][j].kind))break;flag++;}if(flag==4){winner = pieces[i][j].kind+" win!";}}//竖着的棋子判断if(j<14&&point[i][j]==1){int flag=0;for(int k=1;k<5;k++){if(!pieces[i][j+k].kind.equals(pieces[i][j].kind))break;flag++;}if(flag==4){winner = pieces[i][j].kind+" win!";}}}}}
- 简单的五子棋(人人对战)
- 五子棋 人人对战
- 五子棋-人人对战(一)
- 五子棋-人人对战(二)
- 五子棋人人对战实现
- 人人对战版五子棋
- 五子棋_人人对战_小结
- android开发五子棋人人对战
- 基于qt的五子棋 人人对战 人机对战 程序与程序对战
- Android小游戏——简单易懂单机人人对战五子棋源码详解
- 简单的五子棋人机对战(delphi)
- NodeJS+html5+css3 带人机对战和人人对战的 五子棋
- 期末课程设计之java实现五子棋的人机和人人对战
- 五子棋JAVA源码__支持人机、人人对战(转)
- 五子棋_Java_控制台窗口_人人对战
- 五子棋代码人人、人机对战写完了、还少人机电脑的智能下棋功能,欢迎大家一起讨论分享、完善功能
- 五子棋人机对战的实现
- 五子棋人机对战的心得
- memset 用法
- 十步完全理解SQL
- 黑马程序员------------------eclipse的使用、静态导入、自动拆装箱
- iOS多线程开发(二)--线程管理
- datafile 也能跨resetlogs ?
- 简单的五子棋(人人对战)
- iOS多线程开发(三)--Run Loop(一)
- UVa:10056 What is the Probability ?
- 一抹浅笑,秋意浓
- iOS多线程开发(三)--Run Loop(二,三)
- Oracle 里面如何实现只回滚某个事务的一部分内容?
- hdu 2844 多重背包的二进制优化
- iOS多线程开发(三)--Run Loop(四)
- Linux常用命令集合