怎么把五子棋用Socket做成网络版的

那年的坏人 2014-04-24 11:07:36
这个单机版五子棋,看了网络编程基础后,不知道从哪下手。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class FiveChessPanel extends Panel implements MouseListener
{
int chess[][] = new int[11][11]; //定义11行11列的棋盘
boolean BlackChess ;
/**
* 构造方法
* 初始化棋盘数据
* 设置Panel面板属性
*/
public FiveChessPanel()
{
BlackChess = true;
for(int i = 0;i < 11;i++)
{
for(int j = 0;j < 11;j++)
{
chess[i][j] = 0;
}
}
addMouseListener(this); //给鼠标注册监听器
setBackground(Color.gray);
setVisible(true);
}

/**
* 鼠标按下方法
*/
public void mousePressed(MouseEvent e)
{
//获取鼠标坐标
int x = e.getX();
int y = e.getY();

//计算是否超出棋盘边界
if(x < 30 || x > 360 ||y < 30 || y > 360)
{
JOptionPane.showMessageDialog(this, "超出棋盘边界");
return;
}
//计算此处是否有棋子,0为未下棋子
if(chess[x/30-1][y/30-1] != 0)
{
JOptionPane.showMessageDialog(this, "已有棋子");
return;
}
//////////////////////////////开始下棋,黑棋先下
if(BlackChess == true)
{
chess[x/30-1][y/30-1] = 1; //1为黑棋,2为白棋
BlackChess = false;
repaint(); //调用paint重绘方法
Justisewiner();
return;
}
if(BlackChess == false)
{
chess[x/30-1][y/30-1] = 2; //1为黑棋,2为白棋
BlackChess = true;
repaint();
Justisewiner();
return;
}
}
/**
* 画棋盘
* @param g
*/
public void Drawline(Graphics g)
{
for(int i = 30;i <= 330;i += 30)
{
for(int j = 30;j <= 330; j+= 30)
{
g.setColor(Color.WHITE);
g.drawLine(i, j, i, 330); //画垂直线,设置每个点坐标
}
}

for(int j = 30;j <= 330;j += 30)
{
g.setColor(Color.WHITE);
g.drawLine(30, j, 330, j); //画横线
}

}
/**
* 画棋子
* @param g
*/
public void Drawchess(Graphics g)
{
for(int i = 0;i < 11;i++)
{
for(int j = 0;j < 11;j++)
{
if(chess[i][j] == 1)
{
g.setColor(Color.BLACK);
g.fillOval((i + 1) * 30-8, (j + 1) * 30 - 8, 18, 18);
}
if(chess[i][j] == 2)
{
g.setColor(Color.WHITE);
g.fillOval((i + 1) * 30 - 8, (j + 1) * 30 - 8, 18, 18);
}
}
}
}


/**
* 判断输赢的方法
*/
public void Justisewiner()
{
int black_count = 0;
int white_count = 0;

//横向判断输赢
for(int i=0 ;i < 11;i++)
{
for(int j = 0;j < 11;j++)
{
if(chess[i][j] == 1) // 判断1为黑棋
{
black_count++;
if(black_count == 5) //黑棋横向判断
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();

}
}
else
{
black_count = 0;
}
if(chess[i][j] == 2) //判断2为白棋
{
white_count++;
if(white_count == 5) //白旗横向判断
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();

}
}
else
{
white_count = 0;
}
}
}

//纵向判断输赢
for(int i = 0;i < 11;i++)
{
for(int j = 0;j < 11;j++)
{
if(chess[j][i] == 1) //判断1为黑棋
{
black_count++;
if(black_count == 5) //黑棋纵向判断
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();

}
}
else
{
black_count = 0;
}
if(chess[j][i] == 2) //判断2为白棋
{
white_count++;
if(white_count == 5) //白棋纵向判断
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();

}
}
else
{
white_count = 0;
}
}
}

//左斜判断
for(int i = 0;i < 7;i++)
{
for(int j = 0;j < 7;j++)
{
for(int k = 0;k < 5;k++)
{
if(chess[i + k][j + k] == 1) //判断1为黑棋
{
black_count++;
if(black_count == 5) //黑棋左斜判断
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();

}
}
else
{
black_count = 0;
}
if(chess[i + k][j + k] == 2) //判断2为白棋
{
white_count++;
if(white_count == 5) //白棋左斜判断
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();

}
}
else
{
white_count = 0;
}
}
}
}

//右斜判断
for(int i = 4;i < 11;i++)
{
for(int j = 6;j >= 0;j--)
{
for(int k = 0;k < 5;k++)
{
if(chess[i - k][j + k] == 1) //判断1为黑棋
{
black_count++;
if(black_count == 5) //黑棋右斜判断
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();

}
}
else
{
black_count = 0;
}
if(chess[i - k][j + k] == 2) //判断2为白棋
{
white_count++;
if(white_count == 5) //白棋右斜判断
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();

}
}
else
{
white_count = 0;
}
}
}
}

}


/**
* 清除棋盘上的所有棋子坐标对应数据
* 清除棋子
* 重绘棋盘
*/
void Clear_Chess()
{
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
chess[i][j]=0;
}
}
repaint();//调用paint重绘方法
}


/**
* 调用画棋盘和画棋子的方法
*/
public void paint(Graphics g)
{
Drawline(g);
Drawchess(g);
}
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
}

class myframe
{

/**
* 主窗口构造方法
*/
myframe()
{
Frame frame=new Frame("五子棋");
frame.setBounds(200, 200, 360, 383);
FiveChessPanel panel = new FiveChessPanel();
panel.setBounds(0,24,360, 360);
frame.setLayout(null); //将Frame窗口的布局设置为null
frame.add(panel);

frame.setVisible(true);

frame.addWindowListener(new WindowListener(){ //给窗口注册监听器
public void windowClosing(WindowEvent frame)
{
frame.getWindow().setVisible(false); //设置为隐藏
((Frame)frame.getComponent()).dispose(); //释放资源
System.exit(0); //退出程序
}
public void windowDeactivated(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
});
}
}
public class FiveChess{
public static void main(String[] args){
myframe p=new myframe();
}
}
...全文
474 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
草原的雨夜 2014-04-25
  • 打赏
  • 举报
回复
楼主想问什么呢?这个问题太笼统,如果是想做成桌面版网络,那就是只需要将数据包装后发送就可以了,也可以直接发一个序列化的对象,但是不明白楼主到底要问什么? 比如网络传输只是传当前棋子的位置信息,棋子是什么等一些数据,当然还有p2p处理呢还是PSP处理等方式,都有很多。还有就是传输方式,比如是序列化的对象呢,还是一个xml字符串等等这些。。。
那年的坏人 2014-04-25
  • 打赏
  • 举报
回复
引用 4 楼 yangweihong20110929 的回复:
[quote=引用 3 楼 z66261123 的回复:] [quote=引用 1 楼 yangweihong20110929 的回复:] 楼主想问什么呢?这个问题太笼统,如果是想做成桌面版网络,那就是只需要将数据包装后发送就可以了,也可以直接发一个序列化的对象,但是不明白楼主到底要问什么? 比如网络传输只是传当前棋子的位置信息,棋子是什么等一些数据,当然还有p2p处理呢还是PSP处理等方式,都有很多。还有就是传输方式,比如是序列化的对象呢,还是一个xml字符串等等这些。。。
就是简单的实现人人网络对战,在服务器端下一个子,在客户端就会显示并计算输赢。[/quote] 那这个我2楼就已经说的很清楚了,传输的就是位置,还有一些棋子的信息,输赢这些可以放在服务器端判断,服务器做裁判,当然也可以在客户端做一些简单的逻辑处理,这个就看需要了。[/quote]非常非常感谢,我按你的思路做出来了
草原的雨夜 2014-04-25
  • 打赏
  • 举报
回复
引用 3 楼 z66261123 的回复:
[quote=引用 1 楼 yangweihong20110929 的回复:] 楼主想问什么呢?这个问题太笼统,如果是想做成桌面版网络,那就是只需要将数据包装后发送就可以了,也可以直接发一个序列化的对象,但是不明白楼主到底要问什么? 比如网络传输只是传当前棋子的位置信息,棋子是什么等一些数据,当然还有p2p处理呢还是PSP处理等方式,都有很多。还有就是传输方式,比如是序列化的对象呢,还是一个xml字符串等等这些。。。
就是简单的实现人人网络对战,在服务器端下一个子,在客户端就会显示并计算输赢。[/quote] 那这个我2楼就已经说的很清楚了,传输的就是位置,还有一些棋子的信息,输赢这些可以放在服务器端判断,服务器做裁判,当然也可以在客户端做一些简单的逻辑处理,这个就看需要了。
那年的坏人 2014-04-25
  • 打赏
  • 举报
回复
引用 1 楼 yangweihong20110929 的回复:
楼主想问什么呢?这个问题太笼统,如果是想做成桌面版网络,那就是只需要将数据包装后发送就可以了,也可以直接发一个序列化的对象,但是不明白楼主到底要问什么? 比如网络传输只是传当前棋子的位置信息,棋子是什么等一些数据,当然还有p2p处理呢还是PSP处理等方式,都有很多。还有就是传输方式,比如是序列化的对象呢,还是一个xml字符串等等这些。。。
就是简单的实现人人网络对战,在服务器端下一个子,在客户端就会显示并计算输赢。
流氓T-T兔 2014-04-25
  • 打赏
  • 举报
回复
lz 可以这么想, 五子棋的布局和计算操作 还是在服务器端完成的。利用socket将客户端的操作(放子位置)传到服务器计算就可以了。 再将绘图结果传给服务器。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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