JAVA五子棋项目总结
2015-06-18 19:36
1196 查看
五天左右的时间完成了五子棋项目一些基本操作,对此项目的功能实现主要
人人对战,人机算法暂且不论。。。。
对人人对战中,主要难度在于判断胜利条,黑白棋子重绘功能,以及悔棋功能的实现。
棋盘的绘制主要应用重绘功能加上个for循环(代码如下):
(这里绘制的是12横线12竖线的棋盘)
public void paint(Graphics g){
super.paint(g);
//画横线
for (int i = 0; i < 12; i++) {
g.drawLine(20, 20+40*i, 460,20+40*i );
//利用直线功能绘制横线,(20, 20+40*i, 460,20+40*i )
为坐标
}
//画竖线
for (int i = 0; i < 12; i++) {
g.drawLine(20+40*i,20,20+40*i,460);
}
旗子的实现:
for (int i = 0; i < list.size(); i++) {
g.setColor(color);
g.fillOval(x-15,y-15,30,30);
}
}
而判断下棋子是黑白这里我则用了boolean来实现
boolean bool = false;
//如果bool是true则棋子是白色,否则为黑色
if(bool==true){
g.setColor(Color.WHITE);
color=Color.WHITE;
all[yM][xM] = Color.WHITE; //当前坐标有棋子当再次被点击时,则颜色不变
bool=!bool;
}else{
g.setColor(Color.BLACK);
color=Color.BLACK;
all[yM][xM]=Color.BLACK;
bool=!bool;
}
之后更是输赢的算法是,这里只说横排判断方法:
public boolean checkWin(int xM,int yM){
Color c = all[yM][xM]; //首先获得起点棋子的颜色
int qizi=1; //棋子初始为1
int XM;
XM=xM-1; //棋子的坐标向右移
Color color=all[yM][XM]; //获得棋子右移的颜色
while(true){
XM--;
if(XM<0){ //当检测坐标超出棋盘范围是则停止
break;
}
if(color==c){ //检测右移后的棋子颜色与初始棋子颜色是否相同
qizi= qizi+1; //棋子个数加一
color=all[yM][XM];
}else{
break;
}
}
XM=xM+1; //棋子的坐标向左移
// System.out.println(XM+""+yM);
color=all[yM][XM]; //获得
while(true){
XM++;
if(XM>11){
break;
}
if(color==c){
qizi= qizi+1; //棋子个数加
color=all[yM][XM];
}else{
break;
}
}
if(qizi>=5){ //检测棋子颜色相同的个数大于或者等于5
return true;
}else{
return false;
}
}
最后在到鼠标监听器调用此方法即可(因为检测的是当前下棋是坐标的棋子)
如: /**
* 调用checkWin方法
*/
boolean ifWin = checkWin(xM,yM);
if(ifWin){
//如果赢了,则提示胜利
JOptionPane.showMessageDialog(Wqz.this, "胜利","提示",
JOptionPane.ERROR_MESSAGE);
all=new Color[12][12];
list.clear(); //清空棋盘数据
repaint();
return;
}
姑且做到此处。。。。。。。。。。。。。。。。。。。。。
人人对战,人机算法暂且不论。。。。
对人人对战中,主要难度在于判断胜利条,黑白棋子重绘功能,以及悔棋功能的实现。
棋盘的绘制主要应用重绘功能加上个for循环(代码如下):
(这里绘制的是12横线12竖线的棋盘)
public void paint(Graphics g){
super.paint(g);
//画横线
for (int i = 0; i < 12; i++) {
g.drawLine(20, 20+40*i, 460,20+40*i );
//利用直线功能绘制横线,(20, 20+40*i, 460,20+40*i )
为坐标
}
//画竖线
for (int i = 0; i < 12; i++) {
g.drawLine(20+40*i,20,20+40*i,460);
}
旗子的实现:
for (int i = 0; i < list.size(); i++) {
g.setColor(color);
g.fillOval(x-15,y-15,30,30);
}
}
而判断下棋子是黑白这里我则用了boolean来实现
boolean bool = false;
//如果bool是true则棋子是白色,否则为黑色
if(bool==true){
g.setColor(Color.WHITE);
color=Color.WHITE;
all[yM][xM] = Color.WHITE; //当前坐标有棋子当再次被点击时,则颜色不变
bool=!bool;
}else{
g.setColor(Color.BLACK);
color=Color.BLACK;
all[yM][xM]=Color.BLACK;
bool=!bool;
}
之后更是输赢的算法是,这里只说横排判断方法:
public boolean checkWin(int xM,int yM){
Color c = all[yM][xM]; //首先获得起点棋子的颜色
int qizi=1; //棋子初始为1
int XM;
XM=xM-1; //棋子的坐标向右移
Color color=all[yM][XM]; //获得棋子右移的颜色
while(true){
XM--;
if(XM<0){ //当检测坐标超出棋盘范围是则停止
break;
}
if(color==c){ //检测右移后的棋子颜色与初始棋子颜色是否相同
qizi= qizi+1; //棋子个数加一
color=all[yM][XM];
}else{
break;
}
}
XM=xM+1; //棋子的坐标向左移
// System.out.println(XM+""+yM);
color=all[yM][XM]; //获得
while(true){
XM++;
if(XM>11){
break;
}
if(color==c){
qizi= qizi+1; //棋子个数加
color=all[yM][XM];
}else{
break;
}
}
if(qizi>=5){ //检测棋子颜色相同的个数大于或者等于5
return true;
}else{
return false;
}
}
最后在到鼠标监听器调用此方法即可(因为检测的是当前下棋是坐标的棋子)
如: /**
* 调用checkWin方法
*/
boolean ifWin = checkWin(xM,yM);
if(ifWin){
//如果赢了,则提示胜利
JOptionPane.showMessageDialog(Wqz.this, "胜利","提示",
JOptionPane.ERROR_MESSAGE);
all=new Color[12][12];
list.clear(); //清空棋盘数据
repaint();
return;
}
姑且做到此处。。。。。。。。。。。。。。。。。。。。。
相关文章推荐
- java中包的命名
- How to forward from a Java servlet to a JSP
- 关于Spring的AOP面向切面编程
- 【转】【九度1080题做题发现】JAVA之BigInteger
- Java 实现导出excel表 POI
- java冒泡排序
- Apriori(先验)的java实现
- java实现excel表格导出
- A Java int array example
- In Java, will the code in the finally block be called and run after a return statement is executed?
- Java并发编程-25-合并任务的结果
- Name for argument type [java.lang.String] not available......bug处理
- java 需要复习的知识点
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
- Java并发编程-24-创建Fork/Join线程池
- spring4.0.5 + quartz1.8.6/2.2.1集群搭建
- Eclipse4.4.2手动安装Veloeclipse-2.0.8
- Lucene:基于Java的全文检索引擎简介
- Java System.getProperty()
- spider JAVA如何判断网页编码