Java编程:基于socket实现局域网双人联机对战五子棋

简介: Java编程:基于socket实现局域网双人联机对战五子棋

客户端:

package fivechess;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class MyClient {
    public static final String mip="10.25.50.131";
    public static boolean gameover=true;
    public static void main(String[] args) throws IOException {
        ChessBroad chessBroad=new ChessBroad();
        Socket socket=new Socket(mip,MyServer.mdk);
        OutputStream ou=socket.getOutputStream();
        InputStream in =socket.getInputStream();
        Scanner scanner=new Scanner(System.in);
while(gameover){
        while(true){
            if(ChessBroad.broad[0][0]==null){
                ChessBroad.init();
                ChessBroad.draw();
            }
            System.out.println("等待对方落子");
            byte[] buf=new byte[1024];
            int len=in.read(buf);
            String creceive=new String(buf,0,len);
            System.out.println("获得黑棋坐标:"+creceive);
            ChessBroad.iswhite=false;
            MyGame.list.add(creceive);
            String []ss=creceive.split(",");
            int x=new Integer(ss[0]);
            int y=new Integer(ss[1]);
            ChessBroad.broad[x][y]=ChessBroad.iswhite ? "○":"●";
            ChessBroad.draw();
            if(!MyGame.isover(x, y)){
                break;
            }
            System.out.println("请输入坐标:x,y");
            String line= scanner.next();
            while(true){
                if(!MyGame.list.contains(line)){
                    MyGame.list.add(line);
                    break;
                }else{
                    System.out.println("已存在旗子");
                    line=scanner.next();
                }
            }
            ou.write(line.getBytes());
            MyGame.list.add(line);
            ChessBroad.iswhite=true;
            ss=line.split(",");
            x=new Integer(ss[0]);
            y=new Integer(ss[1]);
            ChessBroad.broad[x][y]=ChessBroad.iswhite ? "○":"●";
            ChessBroad.draw();
            gameover=MyGame.isover(x, y);
        }
        System.out.println("请选择:1:重新开始,2:退出");
        int op=scanner.nextInt();
        if (op==1){
            gameover=true;
        }else if(op==2){
            System.exit(0);
        }
      }
    }
}

服务器:

package fivechess;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
public class MyServer {
    public ArrayList list=new ArrayList();
    public static final int  mdk=7790;
    public static boolean gameover=true;
    public static void main(String[] args) throws IOException  {
        ChessBroad chessBroad=new ChessBroad();
       ServerSocket server=new ServerSocket(mdk);
       Socket client= server.accept();
       System.out.println("连接成功");
       InetAddress address=client.getInetAddress();
       System.out.println(address.getHostAddress());
       InputStream in= client.getInputStream();
       OutputStream ou=client.getOutputStream();
       Scanner sc=new Scanner(System.in);
while(gameover){
       while(true){
           if(ChessBroad.broad[0][0]==null){
               ChessBroad.init();
               ChessBroad.draw();
           }
           System.out.println("请输入坐标:x,y");
           String send=sc.next();
           while(true){
               if(!MyGame.list.contains(send)){
                   MyGame.list.add(send);
                   break;
               }else{
                   System.out.println("已存在旗子");
                   send=sc.next();
               }
           }
           ou.write(send.getBytes());
           MyGame.list.add(send);
           ChessBroad.iswhite=false;
           String []ss=send.split(",");
           int x=new Integer(ss[0]);
           int y=new Integer(ss[1]);
           ChessBroad.broad[x][y]=ChessBroad.iswhite ? "○":"●";
           System.out.println(chessBroad.iswhite);
           ChessBroad.draw();
           if(!MyGame.isover(x, y)){
              break;
           }
           System.out.println("等待对方落子");
           byte []buf=new byte[1024];
           int len =in.read(buf);
           String receive=new String(buf,0,len);
           System.out.println("白棋坐标:"+receive);
           ChessBroad.iswhite=true;
           MyGame.list.add(receive);
           ss=receive.split(",");
           x=new Integer(ss[0]);
           y=new Integer(ss[1]);
           ChessBroad.broad[x][y]=ChessBroad.iswhite ? "○":"●";
           ChessBroad.draw();
           gameover=MyGame.isover(x, y);
       }
System.out.println("请选择:1:重新开始,2:退出");
        int op=scanner.nextInt();
        if (op==1){
            gameover=true;
        }else if(op==2){
            System.exit(0);
        }
     }  
   }
}

棋盘:

package fivechess;
public class ChessBroad {
    public static boolean iswhite = true;
    public static String[][] broad = new String[15][15];
    private static final int mlineNum = 15;
    public static void init() {
        for (int i = 0; i < mlineNum; i++) {
            for (int j = 0; j < mlineNum; j++) {
                if (i == 0 && j == 0) {
                    broad[i][j] = "┏";
                } else if (i == 0 && j > 0 && j < 14) {
                    broad[i][j] = "┳";
                } else if (j < 14 && j > 0 && i == 14) {
                    broad[i][j] = "┻";
                } else if (i == 0 && j == 14) {
                    broad[i][j] = "┓";
                } else if (i > 0 && i < 14 && j == 0) {
                    broad[i][j] = "┣";
                } else if (i > 0 && i < 14 && j == 14) {
                    broad[i][j] = "┫";
                } else if (j == 0 && i == 14) {
                    broad[i][j] = "┗";
                } else if (j == 14 && i == 14) {
                    broad[i][j] = "┛";
                } else {
                    broad[i][j] = "╋";
                }
            }
        }
    }
        public static void draw () {
            for (int i = 0; i < broad.length; i++) {
                for (int j = 0; j < broad.length; j++) {
                    System.out.print(broad[i][j]);
                }
                System.out.println();
            }
        }
    }

附:特殊符号打法:

1:软键盘:特殊符号:制表符

2.如图

1_120813014050_1.jpg

判断输赢:

package fivechess;
import java.util.ArrayList;
public class MyGame {
    public static ArrayList list=new ArrayList();
    public static boolean isover(int x,int y){
        int i = x;
        int j = y;
        int count = 0;
        //判断横向向左是否五连
        for (j = y; j >= 0 ; j--) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        //判断横向向右是否五连
        for (j = y; j <= 14 ; j++) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        count--;
        if (count >= 5) {
            System.out.println( ChessBroad.iswhite?"白":"黑"+ "棋胜!游戏结束!!!");
            return false;
        }
        //判断纵向向上是否五连
        i = x;
        j = y;
        count = 0;
        for (i = x; i >= 0 ; i--) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        //判断纵向向下是否五连
        for (i = x; i <= 14 ; i++) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        count--;
        if (count >= 5) {
            System.out.println( ChessBroad.iswhite?"白":"黑"+ "棋胜!游戏结束!!!");
            return false;
        }
        //判断左上是否五连
        count = 0;
        for (i = x,j = y; i >= 0 && j >=0 ; i--,j--) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        //判断右下是否五连
        for (i = x,j = y; i < 15 && j < 15 ; i++,j++) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        count--;
        if (count >= 5) {
            System.out.println( ChessBroad.iswhite?"白":"黑"+ "棋胜!游戏结束!!!");
            return false;
        }
        //判断左下是否五连
        count = 0;
        for (i = x,j = y; i < 15 && j >=0 ; i++,j--) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        //判断右上是否五连
        for (i = x,j = y; i >= 0 && j < 15 ; i--,j++) {
            if (list.contains(i+","+j)) {
                count++;
            }else {
                break;
            }
        }
        count--;
        if (count >= 5) {
            System.out.println(ChessBroad.iswhite?"白":"黑"+ "棋胜!游戏结束!!!");
            return false;
        }
        return true;
    }
    }

成果展示:

20180811134517822.png

githab源码地址:

https://github.com/cainiaolibiao/inspiration01/tree/master/FiveChess


相关文章
|
17天前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
218 1
|
3月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
264 83
|
2月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
283 3
|
17天前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
309 100
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
98 16
|
27天前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
132 2
|
2月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
2月前
|
安全 Java Shell
Java模块化编程(JPMS)简介与实践
本文全面解析Java 9模块化系统(JPMS),帮助开发者解决JAR地狱、类路径冲突等常见问题,提升代码的封装性、性能与可维护性。内容涵盖模块化核心概念、module-info语法、模块声明、实战迁移、多模块项目构建、高级特性及最佳实践,同时提供常见问题和面试高频题解析,助你掌握Java模块化编程精髓,打造更健壮的应用。
|
2月前
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
208 0

热门文章

最新文章