Как я могу репроектировать свою игру для лучшего разделения проблем и тестируемости? [закрыто]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу репроектировать свою игру для лучшего разделения проблем и тестируемости? [закрыто]

Сообщение Anonymous »

Я написал простую игру на основе консоли в C#, где:
Я загружаю прямоугольную карту (palya.txt), содержащую стены (x), floor (), начало игрока (O), выход (t) и несколько заключенных (*)
Переходит в совет, и они выполняют, что они проходят в виде пленки, ими. Cell. Код: < /p>
using System;
using System.Collections.Generic;
using System.IO;

class Program
{
static int sorok;
static int oszlopok;
static char[,] palya;
static int jatekosSor;
static int jatekosOszlop;
static List rabok = new List();
static int kijaratSor;
static int kijaratOszlop;
static int elkapottRabok = 0;

static void Main()
{
Beolvasas();

while (true)
{
Rajzol();
JatekosMozgatasa();
RabokMozgatasa();
Ellenorzes();
}
}

static void Beolvasas()
{
string[] sorokFajlbol = File.ReadAllLines("palya.txt");

sorok = sorokFajlbol.Length;
oszlopok = sorokFajlbol[0].Length;

palya = new char[sorok, oszlopok];

for (int i = 0; i < sorok; i++)
{
for (int j = 0; j < oszlopok; j++)
{
char karakter = sorokFajlbol[j];
palya[i, j] = karakter;

if (karakter == 'O')
{
jatekosSor = i;
jatekosOszlop = j;
}
else if (karakter == '*')
{
rabok.Add((i, j));
}
else if (karakter == 'T')
{
kijaratSor = i;
kijaratOszlop = j;
}
}
}
}

static void Rajzol()
{
Console.Clear();

for (int i = 0; i < sorok; i++)
{
for (int j = 0; j < oszlopok; j++)
{
Console.Write(palya[i, j]);
}
Console.WriteLine();
}

Console.WriteLine();
Console.WriteLine($"Elkapott rabok: {elkapottRabok} / {elkapottRabok + rabok.Count}");
}

static void JatekosMozgatasa()
{
ConsoleKey billentyu = Console.ReadKey(true).Key;

int ujSor = jatekosSor;
int ujOszlop = jatekosOszlop;

if (billentyu == ConsoleKey.W) ujSor--;
else if (billentyu == ConsoleKey.S) ujSor++;
else if (billentyu == ConsoleKey.A) ujOszlop--;
else if (billentyu == ConsoleKey.D) ujOszlop++;

if (ujSor < 0 || ujSor >= sorok || ujOszlop < 0 || ujOszlop >= oszlopok)
return;

if (palya[ujSor, ujOszlop] == 'X')
return;

for (int i = 0; i < rabok.Count; i++)
{
if (rabok.sor == ujSor && rabok.oszlop == ujOszlop)
{
rabok.RemoveAt(i);
elkapottRabok++;
break;
}
}

palya[jatekosSor, jatekosOszlop] = ' ';
jatekosSor = ujSor;
jatekosOszlop = ujOszlop;
palya[jatekosSor, jatekosOszlop] = 'O';
}

static void RabokMozgatasa()
{
Random r = new Random();
List ujRabok = new List();

foreach (var rab in rabok)
{
int irany = r.Next(4);
int ujSor = rab.sor;
int ujOszlop = rab.oszlop;

if (irany == 0) ujSor--;
else if (irany == 1) ujSor++;
else if (irany == 2) ujOszlop--;
else if (irany == 3) ujOszlop++;

if (ujSor < 0 || ujSor >= sorok || ujOszlop < 0 || ujOszlop >= oszlopok)
{
ujRabok.Add(rab);
continue;
}

char cel = palya[ujSor, ujOszlop];
if (cel == 'X' || cel == '*' || cel == 'O')
{
ujRabok.Add(rab);
continue;
}

if (ujSor == kijaratSor && ujOszlop == kijaratOszlop)
{
Console.Clear();
Console.WriteLine("Egy rab megszökött! VESZTETTÉL!");
Environment.Exit(0);
}

palya[rab.sor, rab.oszlop] = ' ';
palya[ujSor, ujOszlop] = '*';
ujRabok.Add((ujSor, ujOszlop));
}

rabok = ujRabok;
}

static void Ellenorzes()
{
if (rabok.Count == 0)
{
Console.Clear();
Console.WriteLine("Minden rabot elkaptál! GYŐZELEM!");
Environment.Exit(0);
}
}
}
using System;
using System.Collections.Generic;
using System.IO;

class Program
{
static int sorok;
static int oszlopok;
static char[,] palya;
static int jatekosSor;
static int jatekosOszlop;
static List rabok = new List();
static int kijaratSor;
static int kijaratOszlop;

static void Main()
{
Beolvasas();
Rajzol();
}

static void Beolvasas()
{
string[] sorokFajlbol = File.ReadAllLines("palya.txt");

sorok = sorokFajlbol.Length;
oszlopok = sorokFajlbol[0].Length;

palya = new char[sorok, oszlopok];

for (int i = 0; i < sorok; i++)
{
for (int j = 0; j < oszlopok; j++)
{
char karakter = sorokFajlbol[j];
palya[i, j] = karakter;

if (karakter == 'O')
{
jatekosSor = i;
jatekosOszlop = j;
}
else if (karakter == '*')
{
rabok.Add((i, j));
}
else if (karakter == 'T')
{
kijaratSor = i;
kijaratOszlop = j;
}
}
}
}

static void Rajzol()
{
Console.Clear();

for (int i = 0; i < sorok; i++)
{
for (int j = 0; j < oszlopok; j++)
{
Console.Write(palya[i, j]);
}
Console.WriteLine();
}

Console.WriteLine();
Console.WriteLine($"Elkapott rabok: 0 / {rabok.Count}");
}
}
< /code>
Здесь переведена версия для лучшего понимания: < /p>
using System;
using System.Collections.Generic;
using System.IO;

class Program
{
// Grid dimensions
static int rows;
static int cols;

// The game map: walls (X), floor ( ), player (O), exit (T), prisoners (*)
static char[,] map;

// Player position
static int playerRow;
static int playerCol;

// List of prisoner positions
static List prisoners = new List();

// Exit position
static int exitRow;
static int exitCol;

// Count of caught prisoners
static int caughtCount = 0;

static void Main()
{
LoadMap("map.txt");

while (true)
{
Draw();
MovePlayer();
MovePrisoners();
CheckEndCondition();
}
}

static void LoadMap(string filename)
{
// Read all lines from the map file
string[] lines = File.ReadAllLines(filename);

rows = lines.Length;
cols = lines[0].Length;
map = new char[rows, cols];

for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
char c = lines[j];
map[i, j] = c;

if (c == 'O')
{
playerRow = i;
playerCol = j;
}
else if (c == '*')
{
prisoners.Add((i, j));
}
else if (c == 'T')
{
exitRow = i;
exitCol = j;
}
}
}
}

static void Draw()
{
Console.Clear();

// Draw the map
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
Console.Write(map[i, j]);
Console.WriteLine();
}

Console.WriteLine();
Console.WriteLine($"Caught: {caughtCount} / {caughtCount + prisoners.Count}");
}

static void MovePlayer()
{
// Read a single key without echoing
var key = Console.ReadKey(true).Key;

int newRow = playerRow;
int newCol = playerCol;

// WASD movement
if (key == ConsoleKey.W) newRow--;
else if (key == ConsoleKey.S) newRow++;
else if (key == ConsoleKey.A) newCol--;
else if (key == ConsoleKey.D) newCol++;

// Check bounds
if (newRow < 0 || newRow >= rows || newCol < 0 || newCol >= cols)
return;

// Can't move into walls
if (map[newRow, newCol] == 'X')
return;

// Catch prisoner if present
for (int i = 0; i < prisoners.Count; i++)
{
if (prisoners.row == newRow && prisoners.col == newCol)
{
prisoners.RemoveAt(i);
caughtCount++;
break;
}
}

// Update map and player position
map[playerRow, playerCol] = ' ';
playerRow = newRow;
playerCol = newCol;
map[playerRow, playerCol] = 'O';
}

static void MovePrisoners()
{
var rand = new Random();
var newPositions = new List();

foreach (var p in prisoners)
{
int direction = rand.Next(4); // 0=up,1=down,2=left,3=right
int newRow = p.row;
int newCol = p.col;

if (direction == 0) newRow--;
else if (direction == 1) newRow++;
else if (direction == 2) newCol--;
else if (direction == 3) newCol++;

// Check bounds and collisions
if (newRow < 0 || newRow >= rows || newCol < 0 || newCol >= cols
|| map[newRow, newCol] == 'X'
|| map[newRow, newCol] == '*'
|| map[newRow, newCol] == 'O')
{
newPositions.Add(p);
continue;
}

// If prisoner reaches exit, game over
if (newRow == exitRow && newCol == exitCol)
{
Console.Clear();
Console.WriteLine("A prisoner escaped! YOU LOSE!");
Environment.Exit(0);
}

// Move prisoner on the map
map[p.row, p.col] = ' ';
map[newRow, newCol] = '*';
newPositions.Add((newRow, newCol));
}

prisoners = newPositions;
}

static void CheckEndCondition()
{
// Win if no prisoners remain
if (prisoners.Count == 0)
{
Console.Clear();
Console.WriteLine("All prisoners caught! YOU WIN!");
Environment.Exit(0);
}
}
}
< /code>
Проблемы /Цели: < /p>
Основной метод смешивает загрузку карты, рендеринг, обработку ввода и игровой логику в одном классе. и мерцать от перерисованности всей консоли каждую кадров. рендеринг и ввод в различные классы/модули? Console.clear ()? < /P>
Лучшие практики для инъекции случайного источника, чтобы тесты могли использовать предсказуемую последовательность. < /P>
Оптимизация рендеринга: < /p>
переопределяет всю сеть каждый поворот для простых игр конлят, или существует более эффективная часть. Примеры, рекомендации библиотеки или эскизы на высоком уровне архитектуры были бы очень оценены!

Подробнее здесь: https://stackoverflow.com/questions/796 ... estability
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»