Я написал простую игру на основе консоли в 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
Как я могу репроектировать свою игру для лучшего разделения проблем и тестируемости? [закрыто] ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Поверните игру с черепахой Python в многопользовательскую игру LAN LAN [закрыто]
Anonymous » » в форуме Python - 0 Ответы
- 42 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Превратите игру с черепахой Python в локальную многопользовательскую игру LAN
Anonymous » » в форуме Python - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-