/// <summary> /// Сюда будут приходить все сообщения от 2 игрока /// </summary> void WorkerRecieveMessagesEvent(string message) { //есть 5 видов сообщений: 1) при завершении игры посылается close //2) первое сообщение - это ник присоединившегося игрока //3) второе подтверждение OK_ник игрока хостера //4) сообщение вида 1_5 где 1 - строка, 5 столбец. причем нумерация столбцов и строк идет с 1 //5) значение 0, 1 или 2. Это возможные результаты хода: 0 - мимо, 1 - ранил, 2 - убил if (message == "close") { MessageBox.Show(string.Format("Game over. {0} win!", Model.CurrentNick)); ResetGame(); return; } var messageItems = message.Split('_'); if (messageItems.Length == 1 && !Utils.IsNum(messageItems[0])) //нет ни одного разделения по "_", close и статус мы исключили, остается ник (2 пункт) { SetEnemyNick(message); Worker.SendMessage(string.Format("OK_{0}", Model.CurrentNick)); } if (messageItems.Length == 2 && messageItems[0] == "OK")//пункт 3 { SetEnemyNick(messageItems[1]); SetGameStatus(GameStatus.InGameTurn); //джойнившийся ходит первым после получения ника от сервера } if (messageItems.Length == 2 && Utils.IsNum(messageItems[0]) && Utils.IsNum(messageItems[1])) //пункт 4 { int x = Convert.ToInt32(messageItems[0]) - 1; int y = Convert.ToInt32(messageItems[1]) - 1; ProcessEnemyTurn(x, y); CurrentBackground.Invalidate(); } if (messageItems.Length == 1 && Utils.IsNum(messageItems[0])) //пункт 5 { TurnsResult status = (TurnsResult)Convert.ToInt32(messageItems[0]); //int будет приведен к enum //это сообщение приходит в ответ на ход текущего игрока, поэтому мы уже знаем координаты ячейки которую атаковал игрок //теперь когда у нас есть результат хода можно установить на ее месте точку или хит var lastCurrentCoords = Model.LastCurrentCoords; Model.Enemy[lastCurrentCoords.X][lastCurrentCoords.Y] = status == TurnsResult.Miss ? Cell.Miss : Cell.Dead; if (status == TurnsResult.Kill || status == TurnsResult.Hit) {//если игрок попал он ходит еще раз, иначе ждет сообщения с координатами хода противника SetGameStatus(GameStatus.InGameTurn); } if (status == TurnsResult.Kill) { MarkShipAsDead(Model.Enemy, lastCurrentCoords.X, lastCurrentCoords.Y); } EnemyBackground.Invalidate(); } }
void ResetGame() { SetGameStatus(GameStatus.Ready); for (int i = 0; i < Model.Current.Length; i++) { for (int j = 0; j < Model.Current[0].Length; j++) { Model.Current[i][j] = Cell.Empty; Model.Enemy[i][j] = Cell.Empty; } } Worker.Reset(); RecountReadyShips(Model.Current, out Model.CurrentShips); UpdateShipsLabels(Model.CurrentShips); CurrentBackground.Invalidate(); EnemyBackground.Invalidate(); }