private void panelPlayer2_Paint(object sender, PaintEventArgs e) { if (this.server != null) { DConsole.PaintClient(true); } if (this.client != null) { DConsole.PaintServer(); } }
private void btnStart_Click(object sender, EventArgs e) { DConsole.IsStart = true; if (this.server != null) { for (int i = 3; i < 18; i++) //嵌套for循环初始化54张牌 { for (int j = 1; j < 5; j++) { if (i <= 15) { DConsole.allPoker.Add(new Poker((PokerNum)i, (PokerColor)j)); } } if (i >= 16) { DConsole.allPoker.Add(new Poker((PokerNum)i, PokerColor.黑桃)); } } //嵌套for循环初始化54张牌 #if DEBUG Console.WriteLine(DConsole.allPoker.Count); foreach (Poker onePoker in DConsole.allPoker) { Console.WriteLine(onePoker.pokerColor.ToString() + onePoker.ToString()); } #endif if (!DConsole.IsRestart) { server.SendDataForClient("YouAreClient1", 1); } DConsole.shuffle(); //洗牌 DConsole.deal(); //发牌 this.player1.sort(); //把牌从大到小排序 this.player1.g = this.panelPlayer1.CreateGraphics(); //把panelPlayer1的Graphics传递给player1 this.player1.Paint(); //在panelPlayer1中画出player1的牌 this.player2.sort(); this.player3.sort(); server.SendDataForClient("SPokerCount" + "17", 1); Thread.Sleep(200); server.SendDataForClient("SPokerCount" + "17", 2); Thread.Sleep(200); server.SendDataForClient("PokerCount" + "17", 1); Thread.Sleep(200); server.SendDataForClient("PokerCount" + "17", 2); Thread.Sleep(200); DConsole.PaintClient(17, 1); DConsole.PaintClient(17, 2); DConsole.PaintLandLord(false); //this.panelPlayer1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelPlayer1_MouseClick); //给panelPlayer1添加一个点击事件 this.btnStart.Enabled = false; this.btnStart.Visible = false; } }
public void SelectLandLordEnd() { DConsole.PaintLandLord(true); if (this.isLandLord) { foreach (Poker poker in DConsole.LandLordPokers) { this.pokers.Add(poker); } this.sort(); this.Paint(); } }
/// <summary> /// 发牌 /// </summary> public static void deal() { PokerGroup player2Pokers = new PokerGroup(); PokerGroup player3Pokers = new PokerGroup(); player1.pokers.Clear(); for (int i = 0; i < 17; i++) { player1.pokers.Add(allPoker[i]); } for (int i = 17; i < 34; i++) { player2Pokers.Add(allPoker[i]); } for (int i = 34; i < 51; i++) { player3Pokers.Add(allPoker[i]); } LandLordNum = new Random().Next(1, 4); PokerGroup landLordPokers = new PokerGroup(); for (int i = 51; i < 54; i++) { landLordPokers.Add(allPoker[i]); } LandLordPokers = landLordPokers; player1.sort(); if (server.SendDataForClient("StartPokers", player2Pokers, 1) && server.SendDataForClient("StartPokers", player3Pokers, 2)) { DConsole.Write("[系统消息]发牌成功!"); server.SendOrder(LandLordNum); } //if (server.SendDataForClient(player2.pokers, 1) && server.SendDataForClient(player3.pokers, 2)) //{ // DConsole.Write("[系统消息]发牌成功!"); // server.SendOrder(DConsole.LandLordNum); //} else { DConsole.Write("[系统消息]发牌失败!"); } #if DEBUG //调试时在Console上显示的信息 Console.WriteLine("玩家一的牌"); foreach (Poker onePoker in player1.pokers) { Console.WriteLine(onePoker.pokerColor.ToString() + onePoker.ToString()); } #endif }
private void btnLead_Click(object sender, EventArgs e) //出牌按钮的事件处理程序 { if (player1.lead()) { this.btnLead.Visible = false; this.btnPass.Visible = false; if (this.server != null) { server.SendDataForClient("SPokerCount" + Convert.ToString(this.player1.pokers.Count), 1); Thread.Sleep(100); server.SendDataForClient("SPokerCount" + Convert.ToString(this.player1.pokers.Count), 2); Thread.Sleep(100); server.SendDataForClient("server", DConsole.leadPokers, 1); Thread.Sleep(100); server.SendDataForClient("server", DConsole.leadPokers, 2); Thread.Sleep(100); if (this.player1.pokers.Count == 0 && DConsole.IsStart) { DConsole.Winer = 1; DConsole.Restart(); } else { server.SendDataForClient("Order", 2); //当server端的牌出完了后,就不再传递出牌权限. } DConsole.player1.haveOrder = false; } if (this.client != null) { client.SendDataForServer("PokerCount" + Convert.ToString(this.player1.pokers.Count)); Thread.Sleep(500); client.SendDataForServer("client", DConsole.leadPokers); Thread.Sleep(100); this.player1.haveOrder = false; } player1.g.Clear(this.BackColor); player1.Paint(); DConsole.PaintPlayer1LeadPoker(); } else { DConsole.Write("[系统消息]:您出的牌不符合规则!"); } }
public new void Add(PokerGroup PG) { if (DConsole.IsRules(PG)) { if (PG.type == PokerGroupType.双王) { DConsole.multiple *= 3; } if (PG.type == PokerGroupType.炸弹) { DConsole.multiple *= 2; } base.Add(PG); } else { DConsole.Write("[系统消息]:有玩家作弊,重新启动游戏."); } }
private void btnNotLandLord_Click(object sender, EventArgs e) { this.player1.areYouLandLord = false; this.player1.isLandLord = false; this.btnNeedLandLord.Visible = false; this.btnNotLandLord.Visible = false; if (this.server != null) { if (DConsole.LandLordNum == 3) { DConsole.Restart(); return; } this.server.SendDataForClient("AreYouLandLord", 2); } if (this.client != null) { this.client.SendDataForServer("AreYouLandLord"); } }
private void 创建游戏ToolStripMenuItem_Click(object sender, EventArgs e) { this.server = new Server(); //创建服务器 DConsole.server = this.server; DConsole.player1 = this.player1; this.server.listener.Start(); //开始监听 this.player2 = new Player(); this.player3 = new Player(); this.acceptConn = new Thread(new ThreadStart(this.server.Connection)); //新建一个线程用于接受请求连接 this.acceptConn.IsBackground = true; this.acceptConn.Name = "检测客户端的连接并接受的线程"; this.acceptConn.Start(); //开始线程 DConsole.Write("[系统消息]:创建游戏成功,等待其他人链接"); this.timerServer.Enabled = true; ToolStripMenuItem tsmi = (ToolStripMenuItem)(this.menuStrip1.Items["游戏ToolStripMenuItem"]); tsmi.DropDownItems["创建游戏ToolStripMenuItem"].Enabled = false; tsmi.DropDownItems["自定义分数ToolStripMenuItem"].Enabled = false; tsmi.DropDownItems["加入游戏ToolStripMenuItem"].Enabled = false; //禁用相关菜单 }
/// <summary> /// 检测是否符合游戏规则,如果符合则出牌,否则返回flase /// </summary> public bool lead() { DConsole.leadPokers = leadPokers; this.leadPokers.Clear(); foreach (int selectPoker in this.selectPokers) //迭代循环把已选中的牌添加到leadPokers { this.leadPokers.Add(this.pokers[selectPoker]); } if (DConsole.IsRules(this.leadPokers)) { if (DConsole.player1.isBiggest || DConsole.leadPokers > DConsole.leadedPokerGroups[DConsole.leadedPokerGroups.Count - 1]) { if (DConsole.leadPokers.type == PokerGroupType.炸弹) { DConsole.multiple *= 2; } if (DConsole.leadPokers.type == PokerGroupType.双王) { DConsole.multiple *= 3; } DConsole.player1.isBiggest = true; this.BakPoker(); //备份现有pokers,下次出牌时需要用到 foreach (int selectPoker in this.selectPokers) //在pokers里移除已经出过的牌 { this.pokers.Remove(this.bakPokers[selectPoker]); } this.selectPokers.Clear(); //清空已选牌 return(true); } else { this.leadPokers.Clear(); return(false); } } else { this.leadPokers.Clear(); return(false); } }
private void btnOK_Click(object sender, EventArgs e) { if (this.client.SendOk()) { btnOK.Enabled = false; btnOK.Visible = false; this.timerClient.Enabled = true; if (this.AcceptServerData == null) { this.AcceptServerData = new Thread(new ThreadStart(client.AcceptServerData)); this.AcceptServerData.IsBackground = true; this.AcceptServerData.Name = "接收服务器数据"; } if (this.AcceptServerData.ThreadState == (ThreadState.Background | ThreadState.Unstarted)) { this.AcceptServerData.Start(); } DConsole.Write("[系统消息]:已向服务器发送准备消息,正在等待响应..."); } else { MessageBox.Show("准备失败,请检查网络连接", "火拼斗地主"); } }
private void panelLandLordPokers_Paint(object sender, PaintEventArgs e) { DConsole.PaintLandLord(); }
private void panelPlayer1LeadPoker_Paint(object sender, PaintEventArgs e) { DConsole.PaintPlayer1LeadPoker(); }
private void timerServer_Tick(object sender, EventArgs e) { if (this.server.client1 != null && this.server.client2 != null) { if (this.tbState.Text.IndexOf("连接建立成功,等待其他人准备", 0, this.tbState.Text.Length) < 0) //防止向用户重复发送此消息 { DConsole.Write("[系统消息]:连接建立成功,等待其他人准备"); } if (this.lblClient1Name.Text == "" && this.lblClient2Name.Text == "") { this.lblClient1Name.Text = server.client1Name; this.lblClient2Name.Text = server.client2Name; } if (this.AcceptClient1Data == null) //如果线程没有初始化则先初始化 { this.AcceptClient1Data = new Thread(new ThreadStart(server.AccpetClient1Data)); this.AcceptClient1Data.IsBackground = true; this.AcceptClient1Data.Name = "服务器检测客户端1是否发送准备消息"; } if (this.AcceptClient1Data.ThreadState == (ThreadState.Background | ThreadState.Unstarted)) //如果线程没有启动则先启动,由于之前把线程的IsBackGround设置为true,所以这里要这样写 { this.AcceptClient1Data.Start(); } if (this.AcceptClient2Data == null) //如果线程没有初始化则先初始化 { this.AcceptClient2Data = new Thread(new ThreadStart(server.AccpetClient2Data)); this.AcceptClient2Data.IsBackground = true; this.AcceptClient2Data.Name = "服务器检测客户端2是否发送准备消息"; } if (this.AcceptClient2Data.ThreadState == (ThreadState.Background | ThreadState.Unstarted)) //如果线程没有启动则先启动,由于之前把线程的IsBackGround设置为true,所以这里要这样写 { this.AcceptClient2Data.Start(); } if (this.server.client1IsOk && this.server.client2IsOk) { this.server.client1IsOk = false; this.server.client2IsOk = false; this.server.SendDataForClient("EveryOneIsOk", 1); this.server.SendDataForClient("EveryOneIsOk", 2); this.server.everyOneIsOk = true; } if (this.server.everyOneIsOk) //启动线程后,服务器循环获取客户端的NetworkStream,然后判断客户端是否发送"OK"信息,如果发送,则把everyOneIsOk设置为True. { this.server.everyOneIsOk = false; //为下一局做准备 DConsole.Write("[系统消息]:所有人已准备,可以开始游戏"); this.btnStart.Enabled = true; this.btnStart.Visible = true; } if (DConsole.player1.haveOrder) { this.btnLead.Enabled = true; this.btnLead.Visible = true; if (!DConsole.player1.isBiggest) { this.btnPass.Visible = true; } } else { this.btnLead.Visible = false; this.btnPass.Visible = false; } if (DConsole.player1.isBiggest) { this.btnPass.Visible = false; } if (DConsole.player1.areYouLandLord) { btnNeedLandLord.Visible = true; btnNotLandLord.Visible = true; } lblScore1.Text = "分数:" + DConsole.serverScore.ToString(); lblScore2.Text = "分数:" + DConsole.client1Score.ToString(); lblScore3.Text = "分数:" + DConsole.client2Score.ToString(); } }
/// <summary> /// 接收服务器发送的数据 /// </summary> public void AcceptServerData() { NetworkStream Ns = client.GetStream(); string str = ""; while (true) { byte[] bytes = new byte[108]; Ns.Read(bytes, 0, 108); str = Encoding.Default.GetString(bytes); if (str.StartsWith("StartPokers")) { DConsole.IsStart = true; str = str.Replace("StartPokers", ""); str.Trim(); byte[] bytePokers = Encoding.Default.GetBytes(str); PokerGroup pokers = new PokerGroup(bytePokers); if (pokers.Count == 17) { DConsole.player1.pokers.Clear(); DConsole.player1.pokers = pokers; DConsole.player1.sort(); DConsole.player1.Paint(); } DConsole.PaintLandLord(); continue; } if (str.StartsWith("CName")) { str = str.Replace("CName", ""); DConsole.OtherClientName = str; continue; } if (str.StartsWith("SPokerCount")) { str = str.Replace("SPokerCount", ""); int pokerCount = Convert.ToInt32(str); DConsole.PaintServer(pokerCount); continue; } if (str.StartsWith("PokerCount")) { str = str.Replace("PokerCount", ""); int pokerCount = Convert.ToInt32(str); DConsole.PaintClient(pokerCount); continue; } if (str.StartsWith("YouAreClient1")) { DConsole.ChangePlace(); continue; } if (str.StartsWith("EveryOneIsOk")) { this.everyIsOk = true; continue; } if (str.StartsWith("server")) { PokerGroup pokers = new PokerGroup(); str = str.Replace("server", ""); byte[] bytePg = Encoding.Default.GetBytes(str); pokers.GetPokerGroup(bytePg); DConsole.leadedPokerGroups.Add(pokers); DConsole.WriteLeadedPokers(); DConsole.PaintPlayer2LeadPoker(pokers); continue; } if (str.StartsWith("client")) { PokerGroup pokers = new PokerGroup(); str = str.Replace("client", ""); byte[] bytePg = Encoding.Default.GetBytes(str); pokers.GetPokerGroup(bytePg); DConsole.leadedPokerGroups.Add(pokers); DConsole.WriteLeadedPokers(); DConsole.PaintPlayer3LeadPoker(pokers); continue; } if (str.StartsWith("Order")) { DConsole.player1.haveOrder = true; continue; } if (str.StartsWith("ClientPass")) { DConsole.gPlayer3LeadPoker.Clear(DConsole.backColor); DConsole.gPlayer3LeadPoker.DrawString("不要", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 5, 5); continue; } if (str.StartsWith("ServerPass")) { DConsole.gPlayer2LeadPoker.Clear(DConsole.backColor); DConsole.gPlayer2LeadPoker.DrawString("不要", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 5, 5); continue; } if (str.StartsWith("IsBiggest")) { DConsole.player1.isBiggest = true; continue; } if (str.StartsWith("NoBiggest")) { DConsole.player1.isBiggest = false; continue; } if (str.StartsWith("AreYouLandLord")) { DConsole.player1.areYouLandLord = true; continue; } if (str.StartsWith("LandLordPokers")) { PokerGroup pokers = new PokerGroup(); str = str.Replace("LandLordPokers", ""); byte[] bytePg = Encoding.Default.GetBytes(str); pokers.GetPokerGroup(bytePg); DConsole.LandLordPokers = pokers; DConsole.player1.SelectLandLordEnd(); continue; } if (str.StartsWith("ClientIsLandLord")) { DConsole.lblClient2Name.Text += "(地主)"; DConsole.lblClient2Name.ForeColor = System.Drawing.Color.Red; DConsole.PaintClient(20); continue; } if (str.StartsWith("ServerIsLandLord")) { DConsole.lblClient1Name.Text += "(地主)"; DConsole.lblClient1Name.ForeColor = System.Drawing.Color.Red; DConsole.PaintServer(20); continue; } if (str.StartsWith("ReStart")) { DConsole.leadedPokerGroups.Clear(); DConsole.leadPokers.Clear(); DConsole.player1.pokers.Clear(); DConsole.player1.areYouLandLord = false; DConsole.player1.isBiggest = false; DConsole.player1.isLandLord = false; DConsole.player1.haveOrder = false; DConsole.lblClient1Name.Text = DConsole.lblClient1Name.Text.Replace("(地主)", ""); DConsole.lblClient2Name.Text = DConsole.lblClient2Name.Text.Replace("(地主)", ""); DConsole.lblClient1Name.ForeColor = System.Drawing.Color.Black; DConsole.lblClient2Name.ForeColor = System.Drawing.Color.Black; DConsole.PaintLandLord(false); DConsole.IsRestart = true; continue; } if (str.StartsWith("YouScore")) { str = str.Replace("YouScore", ""); DConsole.serverScore = Convert.ToInt32(str); continue; } if (str.StartsWith("ClientScore")) { str = str.Replace("ClientScore", ""); DConsole.client2Score = Convert.ToInt32(str); continue; } if (str.StartsWith("ServerScore")) { str = str.Replace("ServerScore", ""); DConsole.client1Score = Convert.ToInt32(str); continue; } } }
/// <summary> /// 循环接收客户端1的请求数据 /// </summary> public void AccpetClient1Data() { NetworkStream Ns1 = client1.GetStream(); string str1 = ""; while (true) { PokerGroup pg = new PokerGroup(); byte[] bytes1 = new byte[108]; Ns1.Read(bytes1, 0, 108); str1 = Encoding.Default.GetString(bytes1); if (str1.StartsWith("Name")) { str1 = str1.Replace("Name", ""); this.client1Name = str1; this.SendDataForClient("CName" + str1, 2); continue; } if (str1.StartsWith("OK")) { this.client1IsOk = true; continue; } if (str1.StartsWith("PokerCount")) { Thread.Sleep(sleep); SendDataForClient(str1, 2); str1 = str1.Replace("PokerCount", ""); int PokerCount = Convert.ToInt32(str1); if (PokerCount == 0 && DConsole.IsStart) { DConsole.Winer = 2; DConsole.Restart(); } DConsole.PaintClient(PokerCount, 1); continue; } if (str1.StartsWith("client")) { SendDataForClient(str1, 2); Thread.Sleep(sleep); str1 = str1.Replace("client", ""); pg.GetPokerGroup(Encoding.Default.GetBytes(str1)); DConsole.leadedPokerGroups.Add(pg); DConsole.PaintPlayer2LeadPoker(pg); DConsole.WriteLeadedPokers(); if (!DConsole.IsRestart) { DConsole.player1.haveOrder = true; //client1出牌后归server出牌,前提是没有Restart,Restart后出牌权限消失 } else { DConsole.IsRestart = false; } continue; } //Client放弃出牌,权限交给服务器 if (str1.StartsWith("Pass")) { DConsole.gPlayer2LeadPoker.Clear(DConsole.backColor); DConsole.gPlayer2LeadPoker.DrawString("不要", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 5, 5); DConsole.player1.haveOrder = true; SendDataForClient("ClientPass", 2); continue; } if (str1.StartsWith("IamIsBiggest")) { DConsole.player1.isBiggest = false; this.SendDataForClient("NoBiggest", 2); continue; } if (str1.StartsWith("AreYouLandLord")) { if (DConsole.LandLordNum == 1) { DConsole.Restart(); continue; } DConsole.player1.areYouLandLord = true; continue; } if (str1.StartsWith("IamLandLord")) { DConsole.lblClient1Name.Text += "(地主)"; DConsole.lblClient1Name.ForeColor = System.Drawing.Color.Red; SendDataForClient("ClientIsLandLord", 2); Thread.Sleep(sleep); DConsole.PaintClient(20, 1); SendDataForClient("LandLordPokers", DConsole.LandLordPokers, 1); Thread.Sleep(sleep); SendDataForClient("LandLordPokers", DConsole.LandLordPokers, 2); DConsole.player1.SelectLandLordEnd(); continue; } } }
/// <summary> /// 循环接收客户端2的请求数据 /// </summary> public void AccpetClient2Data() { NetworkStream Ns2 = client2.GetStream(); string str1 = ""; while (true) { PokerGroup pg = new PokerGroup(); byte[] bytes2 = new byte[108]; Ns2.Read(bytes2, 0, 108); str1 = Encoding.Default.GetString(bytes2); if (str1.StartsWith("Name")) { str1 = str1.Replace("Name", ""); this.client2Name = str1; this.SendDataForClient("CName" + str1, 1); continue; } if (str1.StartsWith("OK")) { this.client2IsOk = true; continue; } if (str1.StartsWith("PokerCount")) { Thread.Sleep(sleep); SendDataForClient(str1, 1); str1 = str1.Replace("PokerCount", ""); int PokerCount = Convert.ToInt32(str1); if (PokerCount == 0 && DConsole.IsStart) { DConsole.Winer = 3; DConsole.Restart(); } DConsole.PaintClient(PokerCount, 2); continue; } if (str1.StartsWith("client")) { SendDataForClient(str1, 1); Thread.Sleep(sleep); str1 = str1.Replace("client", ""); pg.GetPokerGroup(Encoding.Default.GetBytes(str1)); DConsole.leadedPokerGroups.Add(pg); DConsole.PaintPlayer3LeadPoker(pg); DConsole.WriteLeadedPokers(); if (!DConsole.IsRestart) { SendDataForClient("Order", 1); //权限交给client1 前提是没有Restart } else { DConsole.IsRestart = false; //当检测到已经Restart时,复位Restart使它还原为false供下次使用 } System.Threading.Thread.Sleep(sleep); continue; } //Client2放弃出牌,权限交给Client1 if (str1.StartsWith("Pass")) { DConsole.gPlayer3LeadPoker.Clear(DConsole.backColor); DConsole.gPlayer3LeadPoker.DrawString("不要", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 5, 5); SendDataForClient("ClientPass", 1); Thread.Sleep(500); SendDataForClient("Order", 1); continue; } if (str1.StartsWith("IamIsBiggest")) { DConsole.player1.isBiggest = false; this.SendDataForClient("NoBiggest", 1); continue; } if (str1.StartsWith("AreYouLandLord")) { if (DConsole.LandLordNum == 2) { DConsole.Restart(); continue; } SendDataForClient("AreYouLandLord", 1); continue; } if (str1.StartsWith("IamLandLord")) { DConsole.lblClient2Name.Text += "(地主)"; DConsole.lblClient2Name.ForeColor = System.Drawing.Color.Red; SendDataForClient("LandLordPokers", DConsole.LandLordPokers, 1); SendDataForClient("LandLordPokers", DConsole.LandLordPokers, 2); SendDataForClient("ClientIsLandLord", 1); DConsole.PaintClient(20, 2); DConsole.player1.SelectLandLordEnd(); continue; } } }