Java编程:基于socket实现局域网双人联机对战五子棋-阿里云开发者社区

开发者社区> 一条coding> 正文

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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10018 0
C#网络编程技术FastSocket实战项目演练
一、FastSocket课程介绍         .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包、组包、粘包、维护连接列表等,UDP协议需要处理丢包、乱序,而且对于多连接并发,还要自己处理多线程等等。
1555 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13821 0
C#网络编程技术微软Socket实战项目演练(三)
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第三部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程!本次高级系列课程适合人群如下: 1、有一定的NET开发基础并对Socket技术有一定了解和认识。
1842 0
Java Socket编程 - 基于Socket实现HTTP下载客户端
没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客 户端。完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送 如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与 保存文件内容。
709 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11881 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7344 0
+关注
121
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载