Морской бой в консоли - готовое решение - C#
Формулировка задачи:
Недавно начал изучать с#, вот моя первая программа.
Хотелось бы выслушать адекватную критику, ну и вдруг кому мой код пригодится
using System; namespace Battleship_Console { public class Battleship { protected const int four = 1; protected const int three = 2; protected const int two = 3; protected const int one = 4; public int[,] Field1 = new int[10, 10]; //0 - пустая клетка, 1 - корабль, 2 - попадание по кораблю, 3 - промах public static readonly string[] str1 = { "а", "б", "в", "г", "д", "е", "ж", "з", "и", "к" }; public static readonly string[] str2 = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; public int Step = new int(); protected int[] Letter = new int[101]; protected int[] Index = new int[101]; public int Points = 0; public static int Indent = 2; public int Number = 0; protected static int[,] BotField = new int[10, 10]; protected static int[,] UserField = new int[10, 10]; public void Output(int[,] Field) { if (Indent > 20) { Indent = 2; Console.Clear(); } for (int i = 0; i < 10; i++) { Console.SetCursorPosition(2 * i + 3, 0); Console.Write(str1[i]); } for (int i = 0; i < 10; i++) { Console.SetCursorPosition(0, i + 1); Console.Write(str2[i]); Console.SetCursorPosition(2, i + 1); Console.Write("| "); for (int j = 0; j < 10; j++) { Console.SetCursorPosition(2 * j + 3, i + 1); Part(UserField[i, j]); } } for (int i = 0; i < 10; i++) { Console.SetCursorPosition(2 * i + 3, 13); Console.Write(str1[i]); } for (int i = 0; i < 10; i++) { Console.SetCursorPosition(0, i + 14); Console.Write(str2[i]); Console.SetCursorPosition(2, i + 14); Console.Write("| "); for (int j = 0; j < 10; j++) { Console.SetCursorPosition(2 * j + 3, i + 14); Part(Field[i, j]); } } } public void Part(int a) { switch (a) { case 0: Console.Write('+'); break; case 1: Console.Write('\u25A0'); break; case 2: Console.Write('X'); break; case 3: Console.Write('O'); break; } } protected void Stroke(int[,] Field, int i, int j) { int Long = 1; int x = j; int y = i; for (int k = 1; k < 4; k++) { try { if (Field[i - k, j] == 2) { Long++; y--; } if (Field[i - k, j] == 1) { return; } if (Field[i - k, j] == 0 || Field[i - k, j] == 3) { break; } } catch (IndexOutOfRangeException) { break; } } for (int k = 1; k < 4; k++) { try { if (Field[i + k, j] == 2) { Long++; } if (Field[i + k, j] == 1) { return; } if (Field[i + k, j] == 0 || Field[i + k, j] == 3) { break; } } catch (IndexOutOfRangeException) { break; } } if (Long > 1) { for (int k = y - 1; k < y + Long + 1 && k < 10; k++) { if (k < 0) { k++; } for (int l = x - 1; l < x + 2 && l < 10; l++) { if (l < 0) { l++; } if (Field[k, l] != 2) { Field[k, l] = 3; Field1[k, l] = 3; } } } return; } for (int k = 1; k < 4; k++) { try { if (Field[i, j - k] == 2) { Long++; x--; } if (Field[i, j - k] == 1) { return; } if (Field[i, j - k] == 0 || Field[i, j - k] == 3) { break; } } catch (IndexOutOfRangeException) { break; } } for (int k = 1; k < 4; k++) { try { if (Field[i, j + k] == 2) { Long++; } if (Field[i, j + k] == 1) { return; } if (Field[i, j + k] == 0 || Field[i, j + k] == 3) { break; } } catch (IndexOutOfRangeException) { break; } } if (Long > 1) { for (int l = y - 1; l < y + 2 && l < 10; l++) { for (int k = x - 1; k < x + Long + 1 && k < 10; k++) { if (k < 0) { k++; } if (l < 0) { l++; } if (Field[l, k] != 2) { Field[l, k] = 3; Field1[l, k] = 3; } } } return; } if (Long == 1) { for (int k = y - 1; k < y + 2 && k < 10; k++) { if (k < 0) { k = 0; } for (int l = x - 1; l < x + 2 && l < 10; l++) { if (l < 0) { l = 0; } if (Field[k, l] != 2) { Field[k, l] = 3; Field1[k, l] = 3; } } } } } } public class User : Battleship { public User() { Console.Write("Случайная расстановка кораблей? "); if (Console.ReadLine() == "да") { Console.Clear(); Number = 0; Four(); while (Number < three) { Three(); } Number = 0; while (Number < two) { Two(); } Number = 0; while (Number < one) { One(); } } } public void Strike() { if (Win()) { return; } Console.SetCursorPosition(30, Indent++); Console.WriteLine("Выстрел №: " + ++Step); Boolean letter = true; while (letter) { Console.SetCursorPosition(30, Indent++); Console.Write("Ваш выстрел: "); switch (Console.Read()) { case 'а': Letter[Step] = 0; letter = false; break; case 'б': Letter[Step] = 1; letter = false; break; case 'в': Letter[Step] = 2; letter = false; break; case 'г': Letter[Step] = 3; letter = false; break; case 'д': Letter[Step] = 4; letter = false; break; case 'е': Letter[Step] = 5; letter = false; break; case 'ж': Letter[Step] = 6; letter = false; break; case 'з': Letter[Step] = 7; letter = false; break; case 'и': Letter[Step] = 8; letter = false; break; case 'к': Letter[Step] = 9; letter = false; break; } } Index[Step] = Convert.ToInt32(Console.ReadLine()) - 1; if (Hit(Index[Step], Letter[Step])) { Points++; Strike(); } } public bool Hit(int i, int j) { if (BotField[i, j] == 0) { BotField[i, j] = 3; Field1[i, j] = 3; Output(Field1); Console.SetCursorPosition(30, 0); Console.Write("Промах! "); return false; } if (BotField[i, j] == 1) { BotField[i, j] = 2; Field1[i, j] = 2; Stroke(BotField, i, j); Output(Field1); Console.SetCursorPosition(30, 0); Console.Write("Попадание!"); return true; } Console.SetCursorPosition(30, 0); Console.Write("Нельзя стрелять в эту клетку"); Console.SetCursorPosition(30, 4); Console.WriteLine(); Step--; return true; } public bool Win() { if (Points == 20) { Console.SetCursorPosition(10, 0); Console.Write("Вы победили!"); return true; } return false; } private void Four() { var random = new Random(); int x = random.Next(10); int y = random.Next(10); if (x > 5) { y = random.Next(5); for (int i = y; i < y + 4; i++) { UserField[i, x] = 1; } return; } if (y > 5) { x = random.Next(5); for (int j = x; j < x + 4; j++) { UserField[y, j] = 1; } return; } int k = random.Next(1); if (k == 0) { for (int i = y; i < y + 4; i++) { UserField[i, x] = 1; } } else { for (int j = x; j < x + 4; j++) { UserField[y, j] = 1; } } } private void Three() { var random = new Random(); var x = random.Next(10); var y = random.Next(10); if (y > 6) { x = random.Next(7); for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 4; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } for (int j = x; j < x + 3; j++) { UserField[y, j] = 1; } Number++; return; } if (x > 6) { y = random.Next(7); for (int i = y - 1; i < y + 4; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } { if (UserField[i, j] != 0) { return; } } } } for (int i = y; i < y + 3; i++) { UserField[i, x] = 1; } Number++; return; } int k = random.Next(1); if (k == 0) { for (int i = y - 1; i < y + 4; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } for (int i = y; i < y + 3; i++) { UserField[i, x] = 1; } Number++; } else { for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 4; j++) { if (j < 0) { j = 0; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } for (int j = x; j < x + 3; j++) { UserField[y, j] = 1; } Number++; } } private void Two() { var random = new Random(); var x = random.Next(10); var y = random.Next(10); if (y > 7) { x = random.Next(8); for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 3; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } for (int j = x; j < x + 2; j++) { UserField[y, j] = 1; } Number++; return; } if (x > 7) { y = random.Next(8); for (int i = y - 1; i < y + 3; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } for (int i = y; i < y + 2; i++) { UserField[i, x] = 1; } Number++; return; } int k = random.Next(1); if (k == 0) { for (int i = y - 1; i < y + 3; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } for (int i = y; i < y + 2; i++) { UserField[i, x] = 1; } Number++; } else { for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 3; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } for (int j = x; j < x + 2; j++) { UserField[y, j] = 1; } Number++; } } private void One() { var random = new Random(); var x = random.Next(10); var y = random.Next(10); for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (UserField[i, j] != 0) { return; } } } UserField[y, x] = 1; Number++; } } public class Bot : Battleship { public Bot() { Four(); while (Number < three) { Three(); } Number = 0; while (Number < two) { Two(); } Number = 0; while (Number < one) { One(); } } public void Strike() { if (Win()) { return; } Random(); Console.SetCursorPosition(30, Indent++); Console.WriteLine("Выстрел противника: " + str1[Letter[Step]] + (Index[Step] + 1)); if (Hit(Index[Step], Letter[Step])) { Step++; Points++; Strike(); } } private void Random() { var random = new Random(DateTime.Now.Millisecond); Letter[Step] = random.Next(9); Index[Step] = random.Next(9); if (Field1[Index[Step], Letter[Step]] > 0) { Random(); } } public bool Hit(int i, int j) { if (UserField[i, j] == 0) { Field1[i, j] = 3; UserField[i, j] = 3; return false; } if (UserField[i, j] == 1) { Field1[i, j] = 2; UserField[i, j] = 2; Stroke(UserField, i, j); return true; } if (UserField[i, j] > 1) { return false; } return false; } public bool Win() { if (Points == 20) { Console.SetCursorPosition(10, 0); Console.Write("Вы проиграли!"); return true; } return false; } private void Four() { var random = new Random(); int x = random.Next(10); int y = random.Next(10); if (x > 5) { y = random.Next(5); for (int i = y; i < y + 4; i++) { BotField[i, x] = 1; } return; } if (y > 5) { x = random.Next(5); for (int j = x; j < x + 4; j++) { BotField[y, j] = 1; } return; } int k = random.Next(1); if (k == 0) { for (int i = y; i < y + 4; i++) { BotField[i, x] = 1; } } else { for (int j = x; j < x + 4; j++) { BotField[y, j] = 1; } } } private void Three() { var random = new Random(); var x = random.Next(10); var y = random.Next(10); if (y > 6) { x = random.Next(7); for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 4; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int j = x; j < x + 3; j++) { BotField[y, j] = 1; } Number++; return; } if (x > 6) { y = random.Next(7); for (int i = y - 1; i < y + 4; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int i = y; i < y + 3; i++) { BotField[i, x] = 1; } Number++; return; } int k = random.Next(1); if (k == 0) { for (int i = y - 1; i < y + 4; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int i = y; i < y + 3; i++) { BotField[i, x] = 1; } Number++; } else { for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 4; j++) { if (j < 0) { j = 0; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int j = x; j < x + 3; j++) { BotField[y, j] = 1; } Number++; } } private void Two() { var random = new Random(); var x = random.Next(10); var y = random.Next(10); if (y > 7) { x = random.Next(8); for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 3; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int j = x; j < x + 2; j++) { BotField[y, j] = 1; } Number++; return; } if (x > 7) { y = random.Next(8); for (int i = y - 1; i < y + 3; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j > 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int i = y; i < y + 2; i++) { BotField[i, x] = 1; } Number++; return; } int k = random.Next(1); if (k == 0) { for (int i = y - 1; i < y + 3; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int i = y; i < y + 2; i++) { BotField[i, x] = 1; } Number++; } else { for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 3; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } for (int j = x; j < x + 2; j++) { BotField[y, j] = 1; } Number++; } } private void One() { var random = new Random(); var x = random.Next(10); var y = random.Next(10); for (int i = y - 1; i < y + 2; i++) { if (i < 0) { i++; } if (i > 9) { break; } for (int j = x - 1; j < x + 2; j++) { if (j < 0) { j++; } if (j > 9) { break; } if (BotField[i, j] != 0) { return; } } } BotField[y, x] = 1; Number++; } } internal class Program { public static void Main(string[] args) { var User = new User(); var Bot = new Bot(); Boolean yes = true; while (yes) { while (true) { User.Output(User.Field1); User.Strike(); if (User.Win()) { break; } Bot.Strike(); if (Bot.Win()) { break; } } Console.SetCursorPosition(30, 1); Console.WriteLine("Спасибо за игру! Хотите сыграть еще раз? "); if (Console.ReadLine() != "да") { yes = false; } } } } }
Решение задачи: «Морской бой в консоли - готовое решение»
textual
Листинг программы
int k = random.Next(1); if (k == 0) { for (int i = y; i < y + 4; i++) { UserField[i, x] = 1;//вертикальное положение } } else { for (int j = x; j < x + 4; j++) { UserField[y, j] = 1;//горизонтальное положение } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д