zoukankan      html  css  js  c++  java
  • C#聊天+五子棋

    此系统只是为了让自己多了解一下有关底层通信协议的相关知识。


    聊天功能是通过Socket利用Tcp协议来实现。

    聊天服务端:chatServer

    聊天客户端:chatClient

    ---聊天,是通过聊天服务端监听,一旦有客户连接上此服务端,那么聊天服务端就保存这个客户端的Socket实例,并存放在一个IDictionnary内(全部的在线用户),然后将已经存在的用户信息发送给此聊天客户端(客户端显示在线列表),再将此客户端的信息发送给所有已经存在的客户端用户(及时更新客户端在线用户列表)。与此同时,在服务端为每个连接上服务器的客户端Socket实例,创建一个线程去监听客户端发来的信息。

    五子棋游戏是通过Socket封装的TcpClient类来实现。

    游戏服务端:每个聊天客户端都可以充当游戏服务端(邀请者=游戏服务端)

    游戏客户端:那就是接收邀请的用户了

    --五子棋游戏,首先通过聊天的功能发送邀请给指定用户(作为游戏服务端开始监听),用户如果接受邀请,那么就创建连接。之后利用游戏建立的通信来发送五子棋的坐标。

    个人觉得需要注意的方面:
    1、操作不同线程的控件。
      解决方式:利用委托或者直接声明线程间的控件可以互用。参考:http://www.cnblogs.com/cadlife/articles/2425820.html

    2、画棋盘方面,例:当窗体程序最小化,再打开时,棋盘会自动重绘。
      解决方式:重绘棋盘的同时,再让其重绘棋子即可。(期待有好的方法)

    3、判断胜利

    View Code
            /// <summary>
            /// 判断是否胜利
            /// </summary>
            /// <returns>是否有人胜利,1红棋胜利、2黑棋胜利、0无人胜利</returns>
            public int whetherSuccess()
            {
                #region 横向
                for (int i = 0; i <= 10; i++)
                {
                    for (int j = 0; j <= 6; j++)
                    {
                        if (array[j, i] == array[j + 1, i] && array[j + 1, i] == array[j + 2, i] && array[j + 2, i] == array[j + 3, i] && array[j + 3, i] == array[j + 4, i] && array[j + 4, i] == 1)
                        {
                            //红色胜利
                            return 1;
                        }
                        if (array[j, i] == array[j + 1, i] && array[j + 1, i] == array[j + 2, i] && array[j + 2, i] == array[j + 3, i] && array[j + 3, i] == array[j + 4, i] && array[j + 4, i] == 2)
                        {
                            //黑色胜利
                            return 2;
                        }
                    }
                }
                #endregion
    
                #region 纵向
                for (int i = 0; i <= 10; i++)
                {
                    for (int j = 0; j <= 6; j++)
                    {
                        if (array[i, j] == array[i, j + 1] && array[i, j + 1] == array[i, j + 2] && array[i, j + 2] == array[i, j + 3] && array[i, j + 3] == array[i, j + 4] && array[i, j + 4] == 1)
                        {
                            //红色胜利
                            return 1;
                        }
                        if (array[i, j] == array[i, j + 1] && array[i, j + 1] == array[i, j + 2] && array[i, j + 2] == array[i, j + 3] && array[i, j + 3] == array[i, j + 4] && array[i, j + 4] == 2)
                        {
                            //黑色胜利
                            return 2;
                        }
                    }
                }
                #endregion
    
                #region 左上-右下
                for (int i = 6; i <= 0; i--)
                {
                    for (int j = 0; j <= 6 - i; j++)
                    {
                        bool left = array[j, i + j] == array[j + 1, i + j + 1] && array[j + 1, i + j + 1] == array[j + 2, i + j + 2] && array[j + 2, i + j + 2] == array[j + 3, i + j + 3] && array[j + 3, i + j + 3] == array[j + 4, i + j + 4];
                        bool right = array[i + j, j] == array[i + j + 1, j + 1] && array[i + j + 1, j + 1] == array[i + j + 2, j + 2] && array[i + j + 2, j + 2] == array[i + j + 3, j + 3] && array[i + j + 3, j + 3] == array[i + j + 4, j + 4];
    
                        int nRet = left == true && array[j, i + j] != 0 ? array[j, i + j] : right == true && array[i + j, j] != 0 ? array[i + j, j] : 0;
                        if (nRet != 0)
                            return nRet;
    
                    }
                }
                #endregion
    
                #region 右上-左下
                for (int i = 4; i <= 10; i++)
                {
                    for (int j = 0; j <= i - 4; j++)
                    {
                        bool left = array[i - j, j] == array[i - j - 1, j + 1] && array[i - j - 1, j + 1] == array[i - j - 2, j + 2] && array[i - j - 2, j + 2] == array[i - j - 3, j + 3] && array[i - j - 3, j + 3] == array[i - j - 4, j + 4];
                        bool right = array[10 - j, 10 - i + j] == array[10 - j - 1, 10 - i + j + 1] && array[10 - j - 1, 10 - i + j + 1] == array[10 - j - 2, 10 - i + j + 2] && array[10 - j - 2, 10 - i + j + 2] == array[10 - j - 3, 10 - i + j + 3] && array[10 - j - 3, 10 - i + j + 3] == array[10 - j - 4, 10 - i + j + 4];
                        int nRet = left == true && array[i - j, j] != 0 ? array[i - j, j] : right == true && array[10 - j, 10 - i + j] != 0 ? array[10 - j, 10 - i + j] : 0;
                        if (nRet != 0)
                            return nRet;
                    }
                }
                #endregion
                return 0;//未分出胜负
    
            }

    4、资源的释放。

       源码下载  存在问题之处请指正....

  • 相关阅读:
    北邮OJ103.反转单词 c++/java
    北邮oj 104. 912星球的研究生
    北邮oj 97. 二叉排序树
    北邮OJ 89. 统计时间间隔 java版
    用欧几里得定理求最大公约数和最小公倍数
    shell执行${var:m:n}报错Bad substitution解决办法
    基于ffmpeg不同编码方式转码后的psnr对比
    ffmpeg使用ss与t参数对视频进行剪辑
    黑菜菌的JAVA学习笔记
    Linux服务器内存监控—每小时检查&超出发送邮件&重启占用最高的Java程式
  • 原文地址:https://www.cnblogs.com/wupeiqi/p/3053170.html
Copyright © 2011-2022 走看看