实例介绍
【实例简介】
【实例截图】
【核心代码】
C#
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace 五子棋2 { public partial class main : Form { int[,] chessArr; //存储棋格中棋子的状态,列如chessArr[4,5]=0;表示第5行,第6列的交叉点是黑子。此外1代表白子,2代表空。 bool black = true; //是否到黑子下棋。 int num = 15; //棋盘的大小:num*num ControlInternet CI = new ControlInternet(); //实例化的联网对战类。 bool over = true; //是否结束,结束则定制落子。 bool internetFight = false; //该值为true时则为联网对战,此时black变量是固定的,一方为黑,一方为白。 List<PictureBox> picBoxList = new List<PictureBox>(); //使用PictureBox作为棋格。 bool put=true; //单机游戏时该值永远为true,联网时接收到数据设为true,发送数据后设为false。 public main() { InitializeComponent(); } //棋格初始化 private void main_Load(object sender, EventArgs e) { drawCheckerboar(); } //画棋格 public void drawCheckerboar() { chessArr = new int[num, num]; int currentPoint = 0; int chessLength = 30; int initX = 10; int initY = 10; int _x = initX; int _y = initY; PictureBox tmpBox; for (int x = 0; x < num * num; x ) { if (currentPoint % num == 0) { _x = initX; _y = ((int)currentPoint / num) * chessLength initY; } else { _x = chessLength; } tmpBox = new PictureBox(); tmpBox.Left = _x; tmpBox.Top = _y; tmpBox.Width = chessLength; tmpBox.Height = chessLength; tmpBox.Image = global::五子棋2.Properties.Resources.gezi; tmpBox.Name = (currentPoint % num).ToString() "-" ((int)currentPoint / num).ToString(); //x-y chessArr[currentPoint % num, (int)currentPoint / num] = 2; tmpBox.Click = new EventHandler(pic_click); picBoxList.Add(tmpBox); this.Controls.Add(tmpBox); tmpBox = null; currentPoint ; } } //单击棋格 private void pic_click(object sender,EventArgs e) { PictureBox pb = (PictureBox)sender; string[] stringArr = pb.Name.Split('-'); int[] intArr = new int[] { int.Parse(stringArr[0]),int.Parse(stringArr[1])}; if (chessArr[intArr[0],intArr[1]]==2&&!over&&put) { if (black) { pb.Image = global::五子棋2.Properties.Resources.black; chessArr[intArr[0], intArr[1]] = 0; if (!internetFight) black = false; else { CI.sendMsg(00,0,(intArr[0] intArr[1]*num).ToString()); put = false; } if (win(0)) { over = true; MessageBox.Show("black win!"); } } else { pb.Image = global::五子棋2.Properties.Resources.white; chessArr[intArr[0], intArr[1]] = 1; if (!internetFight) black = true; else { CI.sendMsg(00, 1, (intArr[0] intArr[1] * num).ToString()); put = false; } if (win(1)) { over = true; MessageBox.Show("white win!"); } } } } //是否胜利。 private bool win(int flag) { int checkPoint = 0; int _x = 0; int _y = 0; //横着检查。 for (int x = 0; x < num*num;x ) { int consecutive = 0; checkPoint = x; for (int y = 0; y < 5; y ) { _x = (checkPoint y)% num; _y = (int)checkPoint / num; if (checkPoint > (num * num - 1) || _x > num-1) break; if(chessArr[_x,_y]==flag) { consecutive ; } //checkPoint ; } if (consecutive == 5) return true; } //竖着检查 for (int x = 0; x < num * num; x ) { int consecutive = 0; checkPoint = x; for (int y = 0; y < 5; y ) { _x = (checkPoint y)% num; _y = (int)checkPoint/ num; if (checkPoint > (num * num - 1) || _x > num - 1) break; if (chessArr[ _y,_x] == flag) { consecutive ; } //checkPoint ; } if (consecutive == 5) return true; } //正斜 for (int x = 0; x < num * num; x ) { int consecutive = 0; checkPoint = x; for (int y = 0; y < 5; y ) { _x = checkPoint % num y; _y = ((int)checkPoint / num) y; if (_x > num - 1 || _y > num-1) break; if (chessArr[_x, _y] == flag) { consecutive ; } } if (consecutive == 5) return true; } //反斜 for (int x = 0; x < num * num; x ) { int consecutive = 0; checkPoint = x; for (int y = 0; y < 5; y ) { _x = checkPoint % num - y; _y = (int)checkPoint / num y; if (_x > num - 1 || _x < 0 || _y > num - 1 || _y < 0) break; if (chessArr[_x, _y] == flag) { consecutive ; } } if (consecutive == 5) return true; } return false; } //监听按钮 private void btn_listen_Click(object sender, EventArgs e) { Thread listenThread = new Thread(new ThreadStart(listen)); listenThread.Start(); } //监听函数 private void listen() { try { Thread.CurrentThread.IsBackground = true; Control.CheckForIllegalCrossThreadCalls = false; btn_connect.Enabled = false; btn_listen.Enabled = false; //btn_stopConnect.Enabled = true; txt_ip.Enabled = false; CI.listen(); over = false; //连接后才允许落子。 internetFight = true; CI.OnReceiveMsg = new ChessEventHander(manageChessEvent); } catch (Exception ex) { txt_talk.Text = "listen:\r\n" ex.Message "\r\n"; } } //连接 private void btn_connect_Click(object sender, EventArgs e) { try { CI.connect(txt_ip.Text); over = false; black = false; internetFight = true; CI.OnReceiveMsg = new ChessEventHander(manageChessEvent); btn_connect.Enabled = false; btn_listen.Enabled = false; //btn_stopConnect.Enabled = true; txt_ip.Enabled = false; } catch (Exception ex) { txt_talk.Text ="btn_connect_Click:\r\n" ex.Message "\r\n"; } } //发送消息 private void btn_sendMsg_Click(object sender, EventArgs e) { try { string player; if (black == true) player = "黑子玩家:\r\n"; else player = "白子玩家:\r\n"; CI.sendMsg(1, 0, player txt_send.Text); txt_talk.Text = player txt_send.Text "\r\n"; txt_send.Text = ""; } catch (Exception ex) { txt_talk.Text = "btn_sendMsg_Click:\r\n" ex.Message "\r\n"; } } //处理接收信息事件。 public void manageChessEvent(object sender, ChessEvent e) { Control.CheckForIllegalCrossThreadCalls = false; switch (e.Iclass) { case "0": //棋子信息。 int _x = int.Parse(e.content) % num; int _y = (int)(int.Parse(e.content) / num); chessArr[_x, _y] = int.Parse(e.flag); if (e.flag == "0") { picBoxList[int.Parse(e.content)].Image = global::五子棋2.Properties.Resources.black; if (win(0)) { over = true; MessageBox.Show("black Win"); } } else { picBoxList[int.Parse(e.content)].Image = global::五子棋2.Properties.Resources.white; if (win(1)) { over = true; MessageBox.Show("white win"); } } put = true; break; case "1": //聊天 txt_talk.Text = e.content "\r\n"; break; case "2": //重新开始。 restartGmae(); break; case"5": stopConnect(); break; } } private void btn_stopConnect_Click(object sender, EventArgs e) { CI.sendMsg(5, 0, "000"); CI = new ControlInternet(); stopConnect(); } //断开连接。 private void stopConnect() { CI.close(); CI = new ControlInternet(); btn_listen.Enabled = true; btn_connect.Enabled = true; btn_stopConnect.Enabled = false; txt_ip.Enabled = true; } //单机 private void btn_localGame_Click(object sender, EventArgs e) { over = false; btn_restart.Enabled = true; btn_localGame .Enabled= false; btn_internetGmae.Enabled = false; } //联网 private void btn_internetGmae_Click(object sender, EventArgs e) { btn_connect.Enabled = true; btn_internetGmae.Enabled = false; btn_localGame.Enabled = false; btn_listen.Enabled = true; btn_sendMsg.Enabled = true; txt_ip.Enabled = true; btn_restart.Enabled = true; } //按钮-重新开始游戏。 private void btn_restart_Click(object sender, EventArgs e) { CI.sendMsg(2, 0, "000"); restartGmae(); } //重新开始游戏执行函数 private void restartGmae() { over = false; //black = true; for (int m = 0; m < num; m ) { for (int n = 0; n < num; n ) { chessArr[m, n] = 2; } } foreach (PictureBox pc in picBoxList) { pc.Image = global::五子棋2.Properties.Resources.gezi; } } } //自定义消息函数 public class ChessEvent : EventArgs { public string Iclass; public string content; public string flag; public ChessEvent(string _class, string _flag, string _content) { Iclass = _class; content = _content; flag = _flag; } } //委托 public delegate void ChessEventHander(object sender,ChessEvent e); //联网对战接口。 public interface ISocket { void listen(); void connect(string ipStr); void sendMsg(byte @class,byte flag,string content); void receiveMsg(object obj); void close(); //event OnReceiveMsg(); } //联网对战类。 public class ControlInternet:ISocket { private Socket skRec = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private IPEndPoint ipeRec; private Socket skSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private IPEndPoint ipeSend; public event ChessEventHander OnReceiveMsg; public ControlInternet() { } public void listen() { try { IPAddress myIp = Dns.GetHostEntry(Dns.GetHostName()).AddressList[1]; skRec.Bind(new IPEndPoint(IPAddress.Parse(myIp.ToString()), 8880)); skRec.Listen(0); Socket clientRec = skRec.Accept(); Thread receiveMsgThread = new Thread(new ParameterizedThreadStart(receiveMsg)); receiveMsgThread.Start(clientRec); skSend.Bind(new IPEndPoint(IPAddress.Parse(myIp.ToString()), 8881)); skSend.Listen(0); skSend = skSend.Accept(); } catch (Exception ex) { MessageBox.Show("listen:" ex.Message); } } public void connect(string ipStr) { ipeSend = new IPEndPoint(IPAddress.Parse(ipStr), 8880); skSend.Connect(ipeSend); ipeRec = new IPEndPoint(IPAddress.Parse(ipStr), 8881); skRec.Connect(ipeRec); Thread receiveMsgThread = new Thread(new ParameterizedThreadStart(receiveMsg)); receiveMsgThread.Start(skRec); } public void sendMsg(byte @class,byte flag,string content) { try { byte[] tmpBytes = Encoding.Default.GetBytes(content); MessageControl.Message msg = new MessageControl.Message(@class, flag, tmpBytes); byte[] sendeBytes = msg.ToBytes(); skSend.Send(sendeBytes); } catch (Exception ex) { } } public void receiveMsg(object obj) { Thread.CurrentThread.IsBackground = true; Socket clientRec = (Socket)obj; MessageControl.Message msg = new MessageControl.Message(); MessageControl.MessageStream mst = new MessageControl.MessageStream(); int revb; try { while (clientRec.Connected) { byte[] recBytes = new byte[512]; revb = clientRec.Receive(recBytes); mst.Write(recBytes, 0, revb); if (mst.Read(out msg)) { OnReceiveMsg(this, new ChessEvent(msg.Class.ToString(), msg.Flag.ToString(), Encoding.Default.GetString(msg.Content))); } } } catch (Exception ex) { //skRec.Close(); //skSend.Close(); //clientRec.Close(); } } public void close() { skRec.Close(); skSend.Close(); // //skRec = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // //skSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } ~ControlInternet() { skRec.Close(); skSend.Close(); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论