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


相关文章
|
14天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
1天前
|
存储 安全 Java
Java并发编程中的高效数据结构:ConcurrentHashMap解析
【4月更文挑战第25天】在多线程环境下,高效的数据访问和管理是至关重要的。Java提供了多种并发集合来处理这种情境,其中ConcurrentHashMap是最广泛使用的一个。本文将深入分析ConcurrentHashMap的内部工作原理、性能特点以及它如何在保证线程安全的同时提供高并发性,最后将展示其在实际开发中的应用示例。
|
2天前
|
Java API 调度
[Java并发基础]多进程编程
[Java并发基础]多进程编程
|
2天前
|
Java API 调度
[AIGC] 深入理解Java并发编程:从入门到进阶
[AIGC] 深入理解Java并发编程:从入门到进阶
|
2天前
|
前端开发 Java 测试技术
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
2天前
|
IDE Java 开发工具
Java从入门到精通:1.3.1实践编程巩固基础知识
Java从入门到精通:1.3.1实践编程巩固基础知识
|
6天前
|
IDE Java 物联网
《Java 简易速速上手小册》第1章:Java 编程基础(2024 最新版)
《Java 简易速速上手小册》第1章:Java 编程基础(2024 最新版)
13 0
|
7天前
|
安全 Java 开发者
Java并发编程:深入理解Synchronized关键字
【4月更文挑战第19天】 在Java多线程编程中,为了确保数据的一致性和线程安全,我们经常需要使用到同步机制。其中,`synchronized`关键字是最为常见的一种方式,它能够保证在同一时刻只有一个线程可以访问某个对象的特定代码段。本文将深入探讨`synchronized`关键字的原理、用法以及性能影响,并通过具体示例来展示如何在Java程序中有效地应用这一技术。