//Метод ожидания сообщений от противника, запускается через поток private void Wait() { if (isNeedToReceive) { //ставим в режим ожидания isWaiting = true; oponentField.Enabled = false; //принимаем сообщение от противника CMessage msg = CMessage.Deserialize(client.RecieveLast()); switch (msg.CommandCode) { case CMessage.Command.Hit: AcceptHit(msg.Data[0], msg.Data[1]); break; case CMessage.Command.HitShip: oponentField.GetCellAt(msg.Data[0], msg.Data[1]).SetState(Cell.State.HitShip); oponentField.GetCellAt(msg.Data[0], msg.Data[1]).Enabled = false; MessageBox.Show("Hit!"); hasMove = true; break; case CMessage.Command.SinkShip: oponentField.GetCellAt(msg.Data[0], msg.Data[1]).SetState(Cell.State.SinkShip); oponentField.GetCellAt(msg.Data[0], msg.Data[1]).Enabled = false; MessageBox.Show("Sink!"); RepaintOponentShip(msg.Data[0], msg.Data[1]); hasMove = true; break; case CMessage.Command.HitWater: oponentField.GetCellAt(msg.Data[0], msg.Data[1]).SetState(Cell.State.HitWater); oponentField.GetCellAt(msg.Data[0], msg.Data[1]).Enabled = false; MessageBox.Show("Miss!"); hasMove = false; break; case CMessage.Command.Lose: oponentField.GetCellAt(msg.Data[0], msg.Data[1]).SetState(Cell.State.SinkShip); oponentField.GetCellAt(msg.Data[0], msg.Data[1]).Enabled = false; RepaintOponentShip(msg.Data[0], msg.Data[1]); MessageBox.Show("Victory!"); startButton.Text = "You won."; isNeedToReceive = false; oponentField.Enabled = false; break; case CMessage.Command.Exit: MessageBox.Show("Disconnected!"); startButton.Text = "Disconnected!"; isNeedToReceive = false; oponentField.Enabled = false; break; } if (!hasMove && isNeedToReceive) { //Если противник опять ходит/ опять ждём(рекурсивно) startButton.Text = "Oponents move..."; Wait(); } else if (isNeedToReceive) { startButton.Text = "Your move."; oponentField.Enabled = true; } //выходим из режима ожидания isWaiting = false; } }