急求鉴定 五子棋判断输赢的算法

粉色小调 2012-06-14 04:20:27
小妹做Java课程设计——五子棋的,两人对战模式

就是不能判断输赢
请路过的大侠看看帮帮忙!!!!
看看那部分怎样才能判断输赢……
...全文
783 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
that_fellow_again 2012-08-29
  • 打赏
  • 举报
回复
我也觉得只需要检查当前棋子即可..
[Quote=引用 8 楼 的回复:]
在每次落子之后,
从刚下的棋子开始找。
[/Quote]
dai_ 2012-06-18
  • 打赏
  • 举报
回复
这是个神马情况,吃饭都要手把手教啊
magong 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

师傅,能在我原先程序里面,把程序加上去不???小妹学疏才浅

[/Quote]
下面的代码是你的代码加后的,可以判断输赢了。

class ChessPad extends Panel implements MouseListener, ActionListener {
boolean isBlack = true;
Button reset = new Button("重新开局");
TextField text_1 = new TextField("请黑棋下子"), text_2 = new TextField();
boolean[][] mapB = new boolean[18][18]; //是否有白子
boolean[][] mapW = new boolean[18][18];

ChessPad() {
setSize(440, 440);
setLayout(null);
setBackground(Color.orange);
addMouseListener(this);
add(reset);
reset.setBounds(10, 5, 60, 26);
reset.addActionListener(this);
add(text_1);
text_1.setBounds(90, 5, 90, 24);
add(text_2);
text_2.setBounds(290, 5, 90, 24);
text_1.setEditable(false);
text_2.setEditable(false);
}

public void paint(Graphics g) {
for (int i = 40; i <= 380; i = i + 20) {
g.drawLine(40, i, 400, i);
}
g.drawLine(40, 400, 400, 400);
for (int j = 40; j <= 380; j = j + 20) {
g.drawLine(j, 40, j, 400);
}
g.drawLine(400, 40, 400, 400);
g.fillOval(337, 97, 6, 6);
g.fillOval(97, 97, 6, 6);
g.fillOval(97, 337, 6, 6);
g.fillOval(337, 337, 6, 6);
g.fillOval(217, 217, 6, 6);
}

public void mousePressed(MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON1_MASK) {
int x = (int) e.getX();
int y = (int) e.getY();
ChessPoint_black chesspoint_black = new ChessPoint_black(this);
ChessPoint_white chesspoint_white = new ChessPoint_white(this);
int cx = (x+10)/20-2;
int cy = (y+10)/20-2;
if (cx>-1 && cy>-1 && cx<18 && cy<18) {
if (isBlack) {
this.add(chesspoint_black);
mapB[cx][cy] = true;
chesspoint_black.setBounds(cx * 20 + 30, cy * 20 + 30, 20, 20);
boolean winB = checkWin(mapB, cx, cy);
if (winB) System.out.println("Black Win");
isBlack = !isBlack;
text_2.setText("请白棋下子");
text_1.setText("");
} else{
this.add(chesspoint_white);
chesspoint_white.setBounds(cx * 20 + 30, cy * 20 + 30, 20, 20);
mapW[cx][cy] = true;
boolean winW = checkWin(mapW, cx, cy);
if (winW) System.out.println("White Win");
isBlack = !isBlack;
text_1.setText("请黑棋下子");
text_2.setText("");
}
}
}
}

private boolean checkWin(boolean[][] map, int x, int y) {
int[] deltaX = {1, 1, 1, 0 };
int[] deltaY = {0, 1,-1, 1 };
for(int i=0; i<4; i++){
int cx = x;
int cy = y;
int count = 0;
while(cx>-1 && cy>-1 && cx<18 && cy<18 && map[cx][cy]){
cx -= deltaX[i];
cy -= deltaY[i];
count++;
}
cx = x;
cy = y;
while(cx>-1 && cy>-1 && cx<18 && cy<18 && map[cx][cy]){
count ++;
cx += deltaX[i];
cy += deltaY[i];
}
if (count>5) return true;
}
return false;
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {
}

public void actionPerformed(ActionEvent e) {
this.removeAll();
isBlack = true;
add(reset);
reset.setBounds(10, 5, 60, 26);
add(text_1);
text_1.setBounds(90, 5, 90, 24);
text_2.setText("");
text_1.setText("请黑棋下子");
add(text_2);
text_2.setBounds(290, 5, 90, 24);
}
}

class ChessPoint_black extends Canvas implements MouseListener {
ChessPad chesspad = null;

ChessPoint_black(ChessPad p) {
setSize(20, 20);
chesspad = p;
addMouseListener(this);
}

public void paint(Graphics g) {
g.setColor(Color.black);
g.fillOval(0, 0, 20, 20);
}

public void mousePressed(MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON3_MASK) {
chesspad.remove(this);
chesspad.isBlack = true;
chesspad.text_2.setText("");
chesspad.text_1.setText("请黑棋下子");
}
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {
if (e.getClickCount() >= 2)
chesspad.remove(this);
}
}

class ChessPoint_white extends Canvas implements MouseListener {
ChessPad chesspad = null;

ChessPoint_white(ChessPad p) {
setSize(20, 20);
addMouseListener(this);
chesspad = p;
}

public void paint(Graphics g) {
g.setColor(Color.white);
g.fillOval(0, 0, 20, 20);
}

public void mousePressed(MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON3_MASK) {
chesspad.remove(this);
chesspad.isBlack = false;
chesspad.text_2.setText("请白棋下子");
chesspad.text_1.setText("");
}
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {
if (e.getClickCount() >= 2)
chesspad.remove(this);
}
}

public class Chess extends Frame {
ChessPad chesspad = new ChessPad();

Chess() {
setVisible(true);
setLayout(null);
Label label = new Label("单击左键下棋子,双击吃棋子,用右键单击棋子悔棋", Label.CENTER);
add(label);
label.setBounds(70, 55, 440, 26);
label.setBackground(Color.orange);
add(chesspad);
chesspad.setBounds(70, 90, 440, 440);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
pack();
setSize(600, 500);
}

public static void main(String args[]) {
Chess chess = new Chess();
}
}
mimitracely 2012-06-17
  • 打赏
  • 举报
回复

private boolean checkWin(){

int color=markChess[x][y];

boolean flag=false;

if(checkCount(1,0,color)>=5){

flag=true;

} else if(checkCount(0,1,color)>=5){

flag=true;

} else if(checkCount(1,-1,color)>=5){

flag=true;

} else if(checkCount(1,1,color)>=5){

flag=true;

}

return flag;

}



//返回相连棋子的个数

private int checkCount(int xChange,int yChange,int color){

int count=1;

int tempX=xChange;

int tempY=yChange;



while(x+xChange>=0&&x+xChange<=18&&y+yChange>=0&&y+yChange<=18

&& color==markChess[x+xChange][y+yChange]){

count++;

if(xChange!=0){

xChange++;

}

if(yChange!=0){

if(yChange>0){

yChange++;

}

else yChange--;

}

}

xChange=tempX;

yChange=tempY;

while(x-xChange>=0&&x-xChange<=18&&y-yChange>=0&&y-yChange<=18

&&color==markChess[x-xChange][y-yChange]){

count++;

if(xChange!=0){

xChange++;

}

if(yChange!=0){

if(yChange>0){

yChange++;

}

else yChange--;

}

}



return count;

}
粉色小调 2012-06-17
  • 打赏
  • 举报
回复
师傅,能在我原先程序里面,把程序加上去不???小妹学疏才浅
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

这个程序无法判断输赢

你这个程序没有在棋盘中用矩阵记录哪个点中是哪个子,判输赢就没法做了。
在ChessPad类上加一个二维数组成员字段,每次下子的时候,记得更新二维数组中的元素值,然后马上判断输赢。
[/Quote]
magong 2012-06-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

这个程序无法判断输赢
[/Quote]
你这个程序没有在棋盘中用矩阵记录哪个点中是哪个子,判输赢就没法做了。
在ChessPad类上加一个二维数组成员字段,每次下子的时候,记得更新二维数组中的元素值,然后马上判断输赢。
nai598455803 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
从左上的点往右下遍历,
从每个子往右、右下、下、左下四个方向搜5连子是否出现就行了。
[/Quote]

up
yjflinchong 2012-06-15
  • 打赏
  • 举报
回复
楼上正解

http://jfong.diandian.com/ 我听说这个博客可以绑一级域名。 我弄了个试试
magong 2012-06-15
  • 打赏
  • 举报
回复
从左上的点往右下遍历,
从每个子往右、右下、下、左下四个方向搜5连子是否出现就行了。
GodsJoker 2012-06-15
  • 打赏
  • 举报
回复
不是5个连成一条线就赢了???你加了禁手?
粉色小调 2012-06-15
  • 打赏
  • 举报
回复
import java.awt.*;
import java.awt.event.*;
class ChessPad extends Panel implements MouseListener,ActionListener
{ int x=-1,y=-1,棋子颜色=1;
Button button=new Button("重新开局");
TextField text_1=new TextField("请黑棋下子"),
text_2=new TextField();
ChessPad()
{ setSize(440,440);
setLayout(null);setBackground(Color.orange);
addMouseListener(this);add(button);button.setBounds(10,5,60,26);
button.addActionListener(this);
add(text_1);text_1.setBounds(90,5,90,24);
add(text_2);text_2.setBounds(290,5,90,24);
text_1.setEditable(false);text_2.setEditable(false);
}
public void paint(Graphics g)

{ for(int i=40;i<=380;i=i+20)
{ g.drawLine(40,i,400,i);
}
g.drawLine(40,400,400,400);
for(int j=40;j<=380;j=j+20)
{ g.drawLine(j,40,j,400);
}
g.drawLine(400,40,400,400);
g.fillOval(337,97,6,6);
g.fillOval(97,97,6,6);
g.fillOval(97,337,6,6);
g.fillOval(337,337,6,6);
g.fillOval(217,217,6,6);
}
public void mousePressed(MouseEvent e)
{ if(e.getModifiers()==InputEvent.BUTTON1_MASK)
{ x=(int)e.getX();y=(int)e.getY();
ChessPoint_black chesspoint_black=new ChessPoint_black(this);
ChessPoint_white chesspoint_white=new ChessPoint_white(this);
int a=(x+10)/20,b=(y+10)/20;
if(x/20<2||y/20<2||x/20>19||y/20>19)
{}
else
{
if(棋子颜色==1)
{
this.add(chesspoint_black);
chesspoint_black.setBounds(a*20-10,b*20-10,20,20);
棋子颜色=棋子颜色*(-1);
text_2.setText("请白棋下子");
text_1.setText("");
}
else if(棋子颜色==-1)
{ this.add(chesspoint_white);
chesspoint_white.setBounds(a*20-10,b*20-10,20,20);
棋子颜色=棋子颜色*(-1);
text_1.setText("请黑棋下子");
text_2.setText("");
}
}
}
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void actionPerformed(ActionEvent e)
{ this.removeAll();棋子颜色=1;
add(button);
button.setBounds(10,5,60,26);
add(text_1);text_1.setBounds(90,5,90,24);
text_2.setText("");text_1.setText("请黑棋下子");
add(text_2);text_2.setBounds(290,5,90,24);
}
}
class ChessPoint_black extends Canvas implements MouseListener
{ ChessPad chesspad=null;
ChessPoint_black(ChessPad p)
{ setSize(20,20);
chesspad=p;
addMouseListener(this);
}
public void paint(Graphics g)
{ g.setColor(Color.black);g.fillOval(0,0,20,20);
}
public void mousePressed(MouseEvent e)
{ if(e.getModifiers()==InputEvent.BUTTON3_MASK)
{ chesspad.remove(this);
chesspad.棋子颜色=1;
chesspad.text_2.setText("");chesspad.text_1.setText("请黑棋下子");
}
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e)
{ if(e.getClickCount()>=2)
chesspad.remove(this);
}
}
class ChessPoint_white extends Canvas implements MouseListener
{ ChessPad chesspad=null;
ChessPoint_white(ChessPad p)
{ setSize(20,20);addMouseListener(this);
chesspad=p;
}
public void paint(Graphics g)
{ g.setColor(Color.white);g.fillOval(0,0,20,20);
}
public void mousePressed(MouseEvent e)
{ if(e.getModifiers()==InputEvent.BUTTON3_MASK)
{ chesspad.remove(this);
chesspad.棋子颜色=-1;
chesspad.text_2.setText("请白棋下子");chesspad.text_1.setText("");
}
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e)
{ if(e.getClickCount()>=2)
chesspad.remove(this);
}
}
public class Chess extends Frame
{ ChessPad chesspad=new ChessPad();
Chess()
{ setVisible(true);
setLayout(null);
Label label=new Label("单击左键下棋子,双击吃棋子,用右键单击棋子悔棋",Label.CENTER);
add(label);
label.setBounds(70,55,440,26);
label.setBackground(Color.orange);
add(chesspad);
chesspad.setBounds(70,90,440,440);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{System.exit(0);}});
pack();
setSize(600,500);
}
public static void main(String args[])
{ Chess chess=new Chess();
}}


这个程序无法判断输赢


gukuitian 2012-06-15
  • 打赏
  • 举报
回复
在每次落子之后,
从刚下的棋子开始找。
粉色小调 2012-06-15
  • 打赏
  • 举报
回复
我不知道怎么加判断语句,在哪里加
[Quote=引用 2 楼 的回复:]

从左上的点往右下遍历,
从每个子往右、右下、下、左下四个方向搜5连子是否出现就行了。
[/Quote]
粉色小调 2012-06-15
  • 打赏
  • 举报
回复
没有啊
[Quote=引用 1 楼 的回复:]

不是5个连成一条线就赢了???你加了禁手?
[/Quote]
淡定的峰哥 2012-06-15
  • 打赏
  • 举报
回复
没放一个子都去遍历,效率有点低,可以等到下第二个字之后将能连成2个的存起来,然后以此类推

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧