From efa2dac012b9a0276b5901ac7f303810ad340808 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 7 Jan 2017 23:21:48 +0100 Subject: [PATCH] 2015.03.06 --- SnakeGame/Form1.Designer.cs | 1 + SnakeGame/Form1.cs | 16 +++- SnakeGame/Game.cs | 58 ++++++++++---- SnakeGame/GameRenderer.cs | 9 ++- SnakeGame/MSGBox.cs | 6 +- SnakeGame/MenuColorTable.cs | 15 +++- SnakeGame/NetMatch.cs | 7 +- SnakeGame/Network.Client.cs | 50 ++++++++++++ SnakeGame/Network.Server.cs | 155 ++++++++++++++++++++++++++++++++++++ SnakeGame/Network.cs | 142 +++++++++++---------------------- SnakeGame/Player.cs | 20 ++--- SnakeGame/SnakeGame.csproj | 2 + SnakeGame/SquareCoord.cs | 3 +- Web/index.php | 50 +++++++++--- 14 files changed, 392 insertions(+), 142 deletions(-) create mode 100644 SnakeGame/Network.Client.cs create mode 100644 SnakeGame/Network.Server.cs diff --git a/SnakeGame/Form1.Designer.cs b/SnakeGame/Form1.Designer.cs index 0f5597d..7f79ba2 100644 --- a/SnakeGame/Form1.Designer.cs +++ b/SnakeGame/Form1.Designer.cs @@ -163,6 +163,7 @@ this.Text = "Snake Game"; this.Activated += new System.EventHandler(this.Form1_Activated); this.Deactivate += new System.EventHandler(this.Form1_Deactivate); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed); this.Load += new System.EventHandler(this.Form1_Load); this.ResizeEnd += new System.EventHandler(this.Form1_ResizeEnd); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); diff --git a/SnakeGame/Form1.cs b/SnakeGame/Form1.cs index 92930b6..aa57a0e 100644 --- a/SnakeGame/Form1.cs +++ b/SnakeGame/Form1.cs @@ -103,7 +103,8 @@ namespace SnakeGame else if (e.KeyCode == Keys.Enter) { //MSGBox.CloseMSGBox(); - MSGBox.OnCloseEvent(sender, e); + if (MSGBox.OnCloseEvent != null) + MSGBox.OnCloseEvent(sender, e); } else if (e.KeyCode == Keys.P || e.KeyCode == Keys.Pause) { @@ -165,6 +166,11 @@ namespace SnakeGame gr.FillRectangle(new SolidBrush(Color.Black), new Rectangle(new Point(0, 0), panel1.Size)); GameRenderer.Render(); } + + private void Form1_FormClosed(object sender, FormClosedEventArgs e) + { + Network.Leave(); //Stop threads and such + } } public static class Ext { @@ -193,5 +199,13 @@ namespace SnakeGame } return field; } + + public static TResult Combine(this IEnumerable source, Func func) + { + TResult combiner = default(TResult); + foreach (var entry in source) + combiner = func(entry, combiner); + return combiner; + } } } diff --git a/SnakeGame/Game.cs b/SnakeGame/Game.cs index 0fa1397..d7800f0 100644 --- a/SnakeGame/Game.cs +++ b/SnakeGame/Game.cs @@ -11,11 +11,6 @@ namespace SnakeGame { public static class Game { - /// - /// Plans: - /// Replace MessageBox with own GUI; Add GUI to get GameSize... - /// Maybe select region to set one square's size and/or visualize changes when user stops interaction - /// public static Point GameSize; //public static List GameField; public static SqCoord[,] GameField; @@ -27,7 +22,7 @@ namespace SnakeGame public static Label LivesLabel; public static Panel DialogPanel; //public static string UserName; - public static Player Player = new Player("Player", 0, true); + public static Player Player = new Player("Player", true); private static int score; public static int Score { @@ -105,8 +100,9 @@ namespace SnakeGame int num = 0; if (int.TryParse(strs[1], out num)) { - var match = new NetMatch { Name = strs[0], MaxPlayers = num, OwnerIP = Network.GetIPs() }; + var match = new NetMatch { Name = strs[0], MaxPlayers = num, OwnerIP = Network.GetIPs(), OwnerName = Player.Name }; match.Players.Add(Game.Player); + Game.Reset(); Network.CreateGame(match); Game.Paused = false; } @@ -121,17 +117,19 @@ namespace SnakeGame break; } Network.DownloadGameList(); - string matches = ""; + /*string matches = ""; for (int i = 0; i < Network.Matches.Count; i++) { matches += Network.Matches[i].Name + " " + Network.Matches[i].Players.Count + "/" + Network.Matches[i].MaxPlayers + " " + Network.Matches[i].OwnerName + "\n"; - } + }*/ + string matches = Network.Matches.Combine((match, combiner) => combiner += match.Name + " " + match.Players.Count + "/" + match.MaxPlayers + " " + match.OwnerName + "\n"); MSGBox.ShowMSGBox("Connect to game", matches, MSGBoxType.List, new EventHandler(delegate(object s, string input) { //Network.Connect(Network.Matches[int.Parse(input)]); int num = 0; if (int.TryParse(input, out num) && num != -1) { + Game.Reset(); Network.Connect(Network.Matches[num]); Game.Paused = false; } @@ -168,6 +166,8 @@ namespace SnakeGame public static void Reset(bool fullreset) { + if (fullreset) + Network.Leave(); Size size = GameRenderer.Panel.Size; //GameSize = new Point { X = size.Width / 20, Y = size.Height / 20 }; GameField = new SqCoord[GameSize.X, GameSize.Y]; @@ -198,6 +198,7 @@ namespace SnakeGame { GameField[i, j].Type = SquareType.Player; GameField[i, j].Tick = Length; + GameField[i, j].PlayerName = Player.Name; } } } @@ -224,8 +225,13 @@ namespace SnakeGame GameField[i, j].Tick--; } } - Point nextcoord = MovePlayer(Player, MoveDirection); + Point nextcoord = MovePlayerPre(Player, MoveDirection); Network.SyncUpdate(NetUpdateType.Move); + /*if (nextcoord.X >= GameField.GetLength(0) || nextcoord.Y >= GameField.GetLength(1)) + { + MessageBox.Show("Error!"); + return; + }*/ if (Game.GameField[nextcoord.X, nextcoord.Y].Tick != 0 && Game.GameField[nextcoord.X, nextcoord.Y].Type != SquareType.Point) { Lives--; @@ -243,8 +249,9 @@ namespace SnakeGame } if (Score > 0) Score -= new Random().Next(1, 20); - GameRenderer.Render(); + MovePlayerPost(Player, nextcoord); } + GameRenderer.Render(); } public static void AddPoint() @@ -274,7 +281,7 @@ namespace SnakeGame Game.Paused = true; } - public static Point MovePlayer(Player player, Direction direction) + public static Point MovePlayerPre(Player player, Direction direction) { Point nextcoord; switch (direction) @@ -295,11 +302,32 @@ namespace SnakeGame nextcoord = player.Position; break; } - GameField[nextcoord.X, nextcoord.Y].Tick = Length; - GameField[nextcoord.X, nextcoord.Y].Type = SquareType.Player; - player.Position = new Point { X = nextcoord.X, Y = nextcoord.Y }; + //GameField[nextcoord.X, nextcoord.Y].Tick = Length; + //GameField[nextcoord.X, nextcoord.Y].Type = SquareType.Player; + //player.Position = new Point { X = nextcoord.X, Y = nextcoord.Y }; return nextcoord; } + public static void MovePlayerPost(Player player, Point point) + { + GameField[point.X, point.Y].Tick = Length; + GameField[point.X, point.Y].Type = SquareType.Player; + GameField[point.X, point.Y].PlayerName = player.Name; + player.Position = point; + } + public static Color GetRandomColor() + { + var values = Enum.GetValues(typeof(KnownColor)); + KnownColor[] colors = new KnownColor[values.Length]; + values.CopyTo(colors, 0); + values = null; + List colorlist = new List(colors); + colorlist.Remove(KnownColor.Black); + colorlist.Remove(KnownColor.Blue); + colorlist.Remove(KnownColor.Red); + colorlist.RemoveAll(entry => Color.FromKnownColor(entry).IsSystemColor); + colors = colorlist.ToArray(); + return Color.FromKnownColor(colors[new Random().Next(colors.Length)]); + } } public enum GameStartMode { diff --git a/SnakeGame/GameRenderer.cs b/SnakeGame/GameRenderer.cs index 5bf6a22..e800d8a 100644 --- a/SnakeGame/GameRenderer.cs +++ b/SnakeGame/GameRenderer.cs @@ -38,7 +38,14 @@ namespace SnakeGame if (Network.ConnectedMatch == null) RenderSquare(new Point { X = i, Y = j }, Color.LimeGreen); else - RenderSquare(new Point { X = i, Y = j }, Network.ConnectedMatch.GetPlayerByID(Game.GameField[i, j].PlayerID).Color); + { + Player player = Network.ConnectedMatch.GetPlayerByName(Game.GameField[i, j].PlayerName); + if (player != null) + RenderSquare(new Point { X = i, Y = j }, player.Color); + else + RenderSquare(new Point { X = i, Y = j }, Color.DarkGray); + + } else if (Game.GameField[i, j].Type == SquareType.Point) RenderSquare(new Point { X = i, Y = j }, Color.Blue); else diff --git a/SnakeGame/MSGBox.cs b/SnakeGame/MSGBox.cs index 629ebd9..da9ebcf 100644 --- a/SnakeGame/MSGBox.cs +++ b/SnakeGame/MSGBox.cs @@ -76,7 +76,11 @@ namespace SnakeGame break; case MSGBoxType.List: Game.DialogPanel.Size = new Size(200, 200); - string[] strs = inputtext.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); + string[] strs; + if (inputtext != null) //Combine method can produce null strings + strs = inputtext.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); + else + strs = new string[0]; //Game.DialogPanel.Controls.Add(new Label { Text = strs[0], Location = new Point(10, 60), Size = new Size(100, 20) }); ListBox listbox = new ListBox { Location = new Point(10, 60), Size = new Size(190, 100) }; for (int i = 0; i < strs.Length; i++) diff --git a/SnakeGame/MenuColorTable.cs b/SnakeGame/MenuColorTable.cs index b82c0e4..dff1d3e 100644 --- a/SnakeGame/MenuColorTable.cs +++ b/SnakeGame/MenuColorTable.cs @@ -24,11 +24,24 @@ namespace SnakeGame return Color.Black; } } + private Color prevcolor = Color.Blue; + private bool blue = false; public override Color MenuStripGradientEnd { get { - return Color.Blue; + //return Color.Blue; + //return Game.GetRandomColor(); + Color color = prevcolor; + if (color.G - 10 <= 0/* || color.B + 10 >= byte.MaxValue*/) + blue = false; + else if (/*color.B - 10 <= 0 || */color.G + 10 >= byte.MaxValue) + blue = true; + if (blue) + prevcolor = Color.FromArgb(color.R, color.G - 10, color.B); + else + prevcolor = Color.FromArgb(color.R, color.G + 10, color.B); + return color; } } public override Color MenuBorder diff --git a/SnakeGame/NetMatch.cs b/SnakeGame/NetMatch.cs index bde6f04..54c97e0 100644 --- a/SnakeGame/NetMatch.cs +++ b/SnakeGame/NetMatch.cs @@ -35,17 +35,18 @@ namespace SnakeGame } } public IPAddress[] OwnerIP; - public Player GetPlayerByID(int id) + public Player GetPlayerByName(string name) { try { - return Players.Single(entry => entry.ID == id); + //return Players.Single(entry => entry.ID == id); + return Players.Single(entry => entry.Name == name); } catch { return null; } } - public int NextID = 0; + //public int NextID = 0; } } diff --git a/SnakeGame/Network.Client.cs b/SnakeGame/Network.Client.cs new file mode 100644 index 0000000..228fe66 --- /dev/null +++ b/SnakeGame/Network.Client.cs @@ -0,0 +1,50 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SnakeGame +{ + partial class Network + { + private static void ClientListenerThreadRun() + { + //Connect to the server + TcpClient client = new TcpClient(AddressFamily.InterNetworkV6); + client.Connect(ConnectedMatch.OwnerIP, Port); + var ns = client.GetStream(); + var sw = new BinaryWriter(ns); + sw.Write(52); + JObject writedata = new JObject(); + writedata["PlayerName"] = Game.Player.Name; + writedata["Color"] = Game.Player.Color.ToArgb(); + sw.Write(writedata.ToString()); + var sr = new BinaryReader(ns); + JObject readdata = JObject.Parse(sr.ReadString()); + Game.GameSize = new Point((int)readdata["GameSize"]["X"], (int)readdata["GameSize"]["Y"]); + Game.GameField = new SqCoord[Game.GameSize.X, Game.GameSize.Y]; + Game.Length = (int)readdata["Length"]; + for (int i = 0; i < Game.GameSize.X; i++) + { + for (int j = 0; j < Game.GameSize.Y; j++) + { + Game.GameField[i, j].PlayerName = (string)readdata["GameField"][i][j]["PlayerName"]; + Game.GameField[i, j].Tick = (int)readdata["GameField"][i][j]["Tick"]; + Game.GameField[i, j].Type = (SquareType)Enum.Parse(typeof(SquareType), (string)readdata["GameField"][i][j]["Type"]); + } + } + foreach(JObject item in readdata["Players"]) + { + MessageBox.Show(item.ToString()); + } + + } + } +} diff --git a/SnakeGame/Network.Server.cs b/SnakeGame/Network.Server.cs new file mode 100644 index 0000000..a8109b9 --- /dev/null +++ b/SnakeGame/Network.Server.cs @@ -0,0 +1,155 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace SnakeGame +{ + partial class Network + { + private static TcpListener Listener; + private static void ServerListenerThreadRun() + { + //MessageBox.Show("Listener thread started."); + Listener = new TcpListener(IPAddress.IPv6Any, Port); + Listener.Start(); + while (true) + { + TcpClient client; + try + { + client = Listener.AcceptTcpClient(); + } + catch (SocketException) + { + return; + } + Thread t = new Thread(new ParameterizedThreadStart(ThreadPerPlayer)); + PlayerThreads.Add(t); + t.Start(client); + } + } + /// + /// Serverside + /// + /// + private static void ThreadPerPlayer(object c) + { + TcpClient client = c as TcpClient; + NetworkStream ns = client.GetStream(); + BinaryReader br = new BinaryReader(ns); + StopEventPerPlayer += delegate + { + client.Close(); //Then the thread should abort + }; + int is52 = br.ReadInt32(); + if (is52 != 52) + { + client.Close(); + return; + } + //Read and write inital data + //string playername = br.ReadString(); + JObject readdata = JObject.Parse(br.ReadString()); + string playername = readdata["PlayerName"].ToString(); + /*int initialcolor; + if (!int.TryParse(readdata["Color"].ToString(), out initialcolor)) + { + client.Close(); + return; + }*/ + Player player = new Player(playername, color: Color.FromArgb((int)readdata["Color"])); //Login==Connect + player.Client = client; + ConnectedMatch.Players.Add(player); + BinaryWriter bwp = new BinaryWriter(ns); + var senddata = new JObject(); + senddata["Length"] = Game.Length; + senddata["GameSize"]["X"] = Game.GameSize.X; + senddata["GameSize"]["Y"] = Game.GameSize.Y; + for (int i = 0; i < Game.GameSize.X; i++) + { + for (int j = 0; j < Game.GameSize.Y; j++) + { + senddata["GameField"][i][j]["PlayerName"] = Game.GameField[i, j].PlayerName; + senddata["GameField"][i][j]["Tick"] = Game.GameField[i, j].Tick; + senddata["GameField"][i][j]["Type"] = Game.GameField[i, j].Type.ToString(); + } + } + foreach (Player joinedplayer in ConnectedMatch.Players) + { + senddata["Players"][joinedplayer.Name]["Position"]["X"] = joinedplayer.Position.X; + senddata["Players"][joinedplayer.Name]["Position"]["Y"] = joinedplayer.Position.Y; + senddata["Players"][joinedplayer.Name]["Color"] = joinedplayer.Color.ToArgb(); + } + bwp.Write(senddata.ToString()); + while (true) + { + NetUpdateType updatetype = (NetUpdateType)br.ReadInt32(); + switch (updatetype) + { + case NetUpdateType.Name: + string newname = br.ReadString(); + player.Name = newname; + foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) + { //ForwardMessage prepares each send and then here the only thing to do is to send the extra data + bw.Write(newname); + } + break; + case NetUpdateType.Color: + Color color = Color.FromArgb(br.ReadInt32()); + player.Color = color; + foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) + { + bw.Write(color.ToArgb()); + } + break; + case NetUpdateType.Move: + Direction direction = (Direction)br.ReadInt32(); + Game.MovePlayerPost(player, Game.MovePlayerPre(player, direction)); + foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) + { + bw.Write((int)direction); + } + break; + /*case NetUpdateType.Login: + ConnectedMatch.Players.Add(new Player(playername, ConnectedMatch.NextID)); + break;*/ + case NetUpdateType.Leave: + foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) + { + } + Network.ConnectedMatch.Players.RemoveAll(entry => entry.Name == playername); + client.Close(); + break; + } + } + } + private static IEnumerable ForwardMessage(Player player, string playername, int updatetype) + { + if (ConnectedMatch.OwnerName == Game.Player.Name) + { + //foreach (Player p in ConnectedMatch.Players) + Player p; + while (ConnectedMatch.Players.GetEnumerator().MoveNext()) + { + p = ConnectedMatch.Players.GetEnumerator().Current; + if (p == player) + continue; + var bw = new BinaryWriter(p.Client.GetStream()); + //bw.Write(52); - It should only send it once + //bw.Write(playername); - It should only send it once + bw.Write(updatetype); + yield return bw; + } + } + yield break; + } + } +} diff --git a/SnakeGame/Network.cs b/SnakeGame/Network.cs index 3ef4852..96c7e8c 100644 --- a/SnakeGame/Network.cs +++ b/SnakeGame/Network.cs @@ -12,11 +12,13 @@ using Newtonsoft.Json.Linq; using System.Net.Sockets; using System.Threading; using System.Drawing; +using Newtonsoft.Json; namespace SnakeGame { - public static class Network + public static partial class Network { + public const int Port = 12885; public static void SyncUpdate(NetUpdateType updatetype) //If we are a server, forward every valid data we get { @@ -53,7 +55,7 @@ namespace SnakeGame MessageBox.Show("Error! The received text is in wrong format."); x++; for (int i = x; i < x + players; i++) - match.Players.Add(new Player(responses[i], match.NextID++)); + match.Players.Add(new Player(responses[i])); x += players; //match.OwnerIP = IPAddress.Parse(responses[x]); match.OwnerIP = responses[x].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Select(entry => IPAddress.Parse(entry)).ToArray(); @@ -73,6 +75,7 @@ namespace SnakeGame values["client"] = Game.Player.Name; values["name"] = match.Name; values["maxplayers"] = match.MaxPlayers.ToString(); + values["action"] = "create"; /*IPAddress[] ip = GetIPs(); if (ip == null) @@ -87,30 +90,58 @@ namespace SnakeGame MessageBox.Show("Error!\n" + responseString); else { - Join(match); + Join(match, true); } } } public static void Connect(NetMatch match) { - MessageBox.Show("Connect to game: " + match.Name + " (" + match.MaxPlayers + " players)"); - Join(match); + //MessageBox.Show("Connect to game: " + match.Name + " (" + match.MaxPlayers + " players)"); + Join(match, false); } - public static void Join(NetMatch match) + public static void Join(NetMatch match, bool server) { if (ConnectedMatch != null) Leave(); ConnectedMatch = match; - StartListening(); + StartListening(server); } + private static event EventHandler StopEventPerPlayer; public static void Leave() { if (ConnectedMatch == null) return; + if (ConnectedMatch.OwnerName == Game.Player.Name) + { + using (var client = new WebClient()) + { + var values = new NameValueCollection(); + values["client"] = Game.Player.Name; + values["name"] = ConnectedMatch.Name; + values["maxplayers"] = ConnectedMatch.MaxPlayers.ToString(); + values["action"] = "remove"; + + /*IPAddress[] ip = GetIPs(); + if (ip == null) + return;*/ + values["ip"] = ""; + Array.ForEach(ConnectedMatch.OwnerIP, new Action(entry => values["ip"] += entry.ToString() + ";")); + + var response = client.UploadValues("http://snakegame.16mb.com", values); + + var responseString = Encoding.Default.GetString(response); + if (responseString != "OK") + MessageBox.Show("Error!\n" + responseString); + } + } + Listener.Stop(); ReceiverThread.Abort(); + if (StopEventPerPlayer != null) + StopEventPerPlayer(null, null); foreach (Thread t in PlayerThreads) t.Abort(); PlayerThreads.Clear(); + ConnectedMatch = null; } public static IPAddress[] GetIPs() { @@ -127,101 +158,18 @@ namespace SnakeGame } public static Thread ReceiverThread; public static List PlayerThreads = new List(); - public static void StartListening() + public static void StartListening(bool server) { + /*if (ReceiverThread == null) + (ReceiverThread = new Thread(new ThreadStart(server ? ServerListenerThreadRun : ClientListenerThreadRun))).Start();*/ if (ReceiverThread == null) - (ReceiverThread = new Thread(new ThreadStart(ThreadRun))).Start(); - } - private static void ThreadRun() - { - MessageBox.Show("Listener thread started."); - var listener = new TcpListener(IPAddress.IPv6Any, 12885); - listener.Start(); - while(true) { - TcpClient client = listener.AcceptTcpClient(); - Thread t = new Thread(new ParameterizedThreadStart(ThreadPerPlayer)); - PlayerThreads.Add(t); - t.Start(client); + if (server) + (ReceiverThread = new Thread(new ThreadStart(ServerListenerThreadRun))).Start(); + else + (ReceiverThread = new Thread(new ThreadStart(ClientListenerThreadRun))).Start(); } } - private static void ThreadPerPlayer(object c) - { - TcpClient client = c as TcpClient; - NetworkStream ns = client.GetStream(); - BinaryReader br = new BinaryReader(ns); - int is52=br.ReadInt32(); - if(is52!=52) - { - client.Close(); - return; - } - string playername = br.ReadString(); - Player player = new Player(playername, ConnectedMatch.NextID++); //Login==Connect - player.Client = client; - ConnectedMatch.Players.Add(player); - while (true) - { - NetUpdateType updatetype = (NetUpdateType)br.ReadInt32(); - switch (updatetype) - { - case NetUpdateType.Name: - string newname = br.ReadString(); - player.Name = newname; - foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) - { //ForwardMessage prepares each send and then here the only thing to do is to send the extra data - bw.Write(newname); - } - break; - case NetUpdateType.Color: - Color color = Color.FromArgb(br.ReadInt32()); - player.Color = color; - foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) - { - bw.Write(color.ToArgb()); - } - break; - case NetUpdateType.Move: - Direction direction = (Direction)br.ReadInt32(); - Game.MovePlayer(player, direction); - foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) - { - bw.Write((int)direction); - } - break; - /*case NetUpdateType.Login: - ConnectedMatch.Players.Add(new Player(playername, ConnectedMatch.NextID)); - break;*/ - case NetUpdateType.Leave: - foreach (BinaryWriter bw in ForwardMessage(player, playername, (int)updatetype)) - { - } - Network.ConnectedMatch.Players.RemoveAll(entry => entry.Name == playername); - client.Close(); - break; - } - } - } - private static IEnumerable ForwardMessage(Player player, string playername, int updatetype) - { - if (ConnectedMatch.OwnerName == Game.Player.Name) - { - //foreach (Player p in ConnectedMatch.Players) - Player p; - while (ConnectedMatch.Players.GetEnumerator().MoveNext()) - { - p = ConnectedMatch.Players.GetEnumerator().Current; - if (p == player) - continue; - var bw = new BinaryWriter(p.Client.GetStream()); - bw.Write(52); - bw.Write(playername); - bw.Write(updatetype); - yield return bw; - } - } - yield break; - } } public enum NetUpdateType { diff --git a/SnakeGame/Player.cs b/SnakeGame/Player.cs index d134521..7a93dde 100644 --- a/SnakeGame/Player.cs +++ b/SnakeGame/Player.cs @@ -41,21 +41,17 @@ namespace SnakeGame } public Point Position; public TcpClient Client; - public readonly int ID; + //public readonly int ID; public readonly bool Own; - public Player(string name, int id, bool own = false) + public Player(string name, bool own = false, Color color = default(Color)) { Name = name; - var values = Enum.GetValues(typeof(KnownColor)); - KnownColor[] colors = new KnownColor[values.Length]; - values.CopyTo(colors, 0); - values = null; - List colorlist = new List(colors); - colorlist.Remove(KnownColor.Black); - colorlist.Remove(KnownColor.Blue); - colorlist.Remove(KnownColor.Red); - colors = colorlist.ToArray(); - Color = Color.FromKnownColor(colors[new Random().Next(colors.Length)]); + if (color == default(Color)) + { + Color = Game.GetRandomColor(); + } + else + Color = color; //ID = NextID; //NextID++; Own = own; diff --git a/SnakeGame/SnakeGame.csproj b/SnakeGame/SnakeGame.csproj index 6b8121f..e63393e 100644 --- a/SnakeGame/SnakeGame.csproj +++ b/SnakeGame/SnakeGame.csproj @@ -72,6 +72,7 @@ + @@ -91,6 +92,7 @@ Resources.resx True + SettingsSingleFileGenerator diff --git a/SnakeGame/SquareCoord.cs b/SnakeGame/SquareCoord.cs index acd15d1..165e927 100644 --- a/SnakeGame/SquareCoord.cs +++ b/SnakeGame/SquareCoord.cs @@ -61,7 +61,8 @@ namespace SnakeGame /// public int Tick { get; set; } public SquareType Type { get; set; } - public int PlayerID { get; set; } + //public int PlayerID { get; set; } + public string PlayerName { get; set; } } /// /// Only consider if Tick>0 diff --git a/Web/index.php b/Web/index.php index 5cca78e..5e0bb78 100644 --- a/Web/index.php +++ b/Web/index.php @@ -14,8 +14,12 @@ else $res=mysqli_query($conn, "SELECT * FROM games"); while($row=mysqli_fetch_array($res)) { - $namecount=count(explode(',', $row['playernames'])); - if($namecount==0 || $row['startdate']