基于JAVA实现的局域网五子棋游戏

Mockingjay

发布日期: 2019-04-15 18:54:29 浏览量: 248
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1、游戏界面框架

1.1 welcomPan layout : null

1.2 onlinePan layout : default -> FlowLayout

1.3 waitPan layout : null

1.4 gamePan extends JPanel

1.5 gameOverPan layout : null

2、代码结构

3、测试过程

  • 主界面的设计更换过多次

  • 局域网内主机通信通信失败过多次(好像是路由器的问题)

  • 输赢算法的判断时出现过失误

  • 游戏输赢的判断是忘了在对手主机判断

4、核心代码

4.1 接收广播

  1. //接收广播
  2. public static String ReceiveBroadCast() {
  3. String rec = null;
  4. try {
  5. DatagramSocket ds = new DatagramSocket(8888);// 创建接收数据报套接字并将其绑定到本地主机上的指定端口
  6. byte[] buf = new byte[1024];
  7. DatagramPacket dp = new DatagramPacket(buf, buf.length);
  8. ds.receive(dp);
  9. rec = new String(buf);
  10. ds.close();
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. return rec;
  15. }

4.2 发送广播

  1. //发送广播
  2. public static void SendBroadCast(String str, String ipStr) {
  3. try {
  4. InetAddress ip;
  5. if (ipStr == null) {
  6. ip = InetAddress.getByName("255.255.255.255");
  7. } else {
  8. ip = InetAddress.getByName(ipStr);
  9. }
  10. DatagramSocket ds = new DatagramSocket();
  11. DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, ip, 8888);
  12. ds.send(dp);
  13. ds.close();
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }// 创建用来发送数据报包的套接字
  17. }

4.3 游戏消息的传递(坐标)

  1. public void xiaQi(int x, int y) {
  2. String s = "(" + x + "," + y;
  3. Util.SendBroadCast(s, enemy.getIp());
  4. }
  5. // 对方解析
  6. if (recBC.charAt(0) == '(') {
  7. recBC = recBC.substring(1);
  8. u = recBC.split(",");
  9. read(Integer.parseInt(u[0]), Integer.parseInt(u[1]));
  10. }

4.4 画游戏界面

  1. @Override
  2. public void paint(Graphics g) {
  3. super.paint(g);
  4. for (int i = 0; i <= row; i++) {
  5. for (int j = 0; j <= col; j++) {
  6. if(points[i][j] == null){
  7. points[i][j] = new Point(i * span + 90, j * span + 30);
  8. System.out.println("add point:x." + (i * span + 90) + " y." + (j * span + 30));
  9. }
  10. g.drawLine(90, j * span + 30, col * span + 90, j * span + 30);///画横线
  11. }
  12. g.drawLine(i * span + 90, 30, i * span + 90, row * span + 30);///画竖线
  13. }
  14. for(int j=0;j<myQies.size();j++){
  15. Qi t = myQies.get(j);
  16. g.setColor(myColor);
  17. g.fillOval(t.x-15,t.y-15,30,30);
  18. }
  19. for(int j=0;j<enemyQies.size();j++){
  20. Qi t = enemyQies.get(j);
  21. g.setColor(enemyColor);
  22. g.fillOval(t.x-15,t.y-15,30,30);
  23. }
  24. //画我
  25. g.setColor(myColor);
  26. g.fillOval(300-15,540-15,30,30);
  27. g.fillRect(280,555,40,53);
  28. g.drawString("Me",330,575);
  29. //画敌人
  30. g.setColor(enemyColor);
  31. g.fillOval(655-15,45-15,30,30);
  32. g.fillRect(635,60,40,53);
  33. g.drawString("Enemy",685,83);
  34. //画出该谁下棋
  35. g.setColor(nextColor);
  36. g.fillRect(655,480,40,40);
  37. g.setColor(Color.BLACK);
  38. }

4.5 游戏输赢的判断

  1. public boolean isGameOver(Point myUsedPos,int judgeWho){
  2. boolean isOver = false;
  3. //遍历八个方向
  4. for(int i=0;i<4;i++){
  5. int count = 0;
  6. boolean flg = true;
  7. int tempX = myUsedPos.x;
  8. int tempY = myUsedPos.y;
  9. int otherDir = 1;
  10. while(flg){
  11. //向该棋子周围的八个方向移动
  12. tempX += (otherDir*dirs[i].x);
  13. tempY += (otherDir*dirs[i].y);
  14. //如果周围的点是我已经下过的点,就继续以那个点继续向同一个方向移动
  15. if(pointStatus[tempX][tempY].whoUsed == judgeWho){
  16. count++;
  17. if(count>=4){
  18. isOver = true;
  19. break;
  20. }
  21. }else{///该点周围的点不是我的店,转到相反方向继续判断
  22. if(otherDir != -1){//如果相反方向还没判断过
  23. otherDir = -1;
  24. tempX = myUsedPos.x;
  25. tempY = myUsedPos.y;
  26. }else{//相反方向已经判断过
  27. flg = false;
  28. }
  29. }
  30. }
  31. if(isOver){
  32. break;
  33. }
  34. }
  35. return isOver;
  36. }

5、界面展示

上传的附件 cloud_download 基于JAVA实现的局域网五子棋游戏.7z ( 283.89kb, 3次下载 )
error_outline 下载需要5点积分

发送私信

这个世界上唯一没有变的,就是,每个人都在变

19
文章数
17
评论数
最近文章
eject