Загрузка данных
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace SlsWpfNoBinding
{
public partial class MainWindow : Window
{
// Логическая структура карты
public class Card
{
public string Name { get; set; }
public string Description { get; set; }
public int Cost { get; set; }
public Action Effect { get; set; }
}
// Состояние Игрока
private int _playerHp = 80;
private const int PlayerMaxHp = 80;
private int _playerBlock = 0;
private int _energy = 3;
// Состояние Врага (Культист)
private int _enemyHp = 50;
private const int EnemyMaxHp = 50;
private int _enemyBlock = 0;
private int _enemyStrength = 0;
private string _enemyIntentType = "Buff";
private int _enemyIntentValue = 3;
private int _turnCount = 0;
private readonly Random _random = new Random();
private readonly List<Card> _cardPool = new List<Card>();
private readonly List<Card> _currentHand = new List<Card>();
public MainWindow()
{
InitializeComponent();
InitCardPool();
StartBattle();
}
private void InitCardPool()
{
_cardPool.Add(new Card { Name = "Удар", Description = "Наносит 6 урона.", Cost = 1, Effect = () => DealDamageToEnemy(6) });
_cardPool.Add(new Card { Name = "Защита", Description = "Дает 5 Брони.", Cost = 1, Effect = () => AddBlockToPlayer(5) });
_cardPool.Add(new Card { Name = "Двойной Удар", Description = "Наносит 10 урона.", Cost = 2, Effect = () => DealDamageToEnemy(10) });
_cardPool.Add(new Card { Name = "Покос", Description = "Наносит 4 урона и дает 3 Брони.", Cost = 1, Effect = () => { DealDamageToEnemy(4); AddBlockToPlayer(3); } });
}
private void StartBattle()
{
_playerHp = PlayerMaxHp;
_enemyHp = EnemyMaxHp;
_enemyStrength = 0;
_turnCount = 0;
TxtLog.Text = "Ваш ход! Культист готовится к ритуалу.";
StartPlayerTurn();
}
private void StartPlayerTurn()
{
_turnCount++;
_energy = 3;
_playerBlock = 0;
// Набираем карты
_currentHand.Clear();
for (int i = 0; i < 5; i++)
{
_currentHand.Add(_cardPool[_random.Next(_cardPool.Count)]);
}
DetermineEnemyIntent();
UpdateUi();
RedrawHand(); // Программный рендеринг руки
}
private void DetermineEnemyIntent()
{
if (_turnCount == 1)
{
_enemyIntentType = "Buff";
_enemyIntentValue = 3;
TxtEnemyIntent.Text = "Намерение: Ритуал (+3 к Силе каждый ход)";
TxtEnemyIntent.Foreground = Brushes.Violet;
}
else
{
_enemyIntentType = "Attack";
_enemyIntentValue = 6 + _enemyStrength;
TxtEnemyIntent.Text = $"Намерение: Атака ({_enemyIntentValue} урона)";
TxtEnemyIntent.Foreground = Brushes.OrangeRed;
}
}
// Генерация UI элементов для карт вручную (взамен DataTemplate)
private void RedrawHand()
{
HandPanel.Children.Clear();
foreach (var card in _currentHand)
{
// Создаем кнопку-контейнер для карты
Button cardButton = new Button
{
Width = 130, Height = 180, Margin = new Thickness(10, 0, 10, 0),
Background = new SolidColorBrush(Color.FromRgb(42, 42, 58)),
Foreground = Brushes.White,
Tag = card // Сохраняем ссылку на объект карты внутрь кнопки
};
// Кастомный стиль и разметка внутренностей карты
Grid cardGrid = new Grid { Padding = new Thickness(10) };
cardGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
cardGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
cardGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
// Заголовок
TextBlock txtName = new TextBlock { Text = card.Name, FontWeight = FontWeights.Bold, FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, TextAlignment = TextAlignment.Center };
Grid.SetRow(txtName, 0);
// Описание
TextBlock txtDesc = new TextBlock { Text = card.Description, FontSize = 11, Foreground = Brushes.LightGray, TextWrapping = TextWrapping.Wrap, VerticalAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center, TextAlignment = TextAlignment.Center };
Grid.SetRow(txtDesc, 1);
// Энергия
Border energyBorder = new Border { Background = new SolidColorBrush(Color.FromRgb(0, 255, 204)), Width = 24, Height = 24, CornerRadius = new CornerRadius(12), HorizontalAlignment = HorizontalAlignment.Center };
TextBlock txtCost = new TextBlock { Text = card.Cost.ToString(), Foreground = Brushes.Black, FontWeight = FontWeights.Bold, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
energyBorder.Child = txtCost;
Grid.SetRow(energyBorder, 2);
cardGrid.Children.Add(txtName);
cardGrid.Children.Add(txtDesc);
cardGrid.Children.Add(energyBorder);
cardButton.Content = cardGrid;
cardButton.Click += CardButton_Click; // Подписываем на событие клика
HandPanel.Children.Add(cardButton);
}
}
private void CardButton_Click(object sender, RoutedEventArgs e)
{
if (_enemyHp <= 0 || _playerHp <= 0) return;
var button = sender as Button;
var card = button?.Tag as Card; // Извлекаем логику карты из Tag
if (card != null)
{
if (_energy >= card.Cost)
{
_energy -= card.Cost;
card.Effect.Invoke();
_currentHand.Remove(card);
UpdateUi();
RedrawHand(); // Перерисовываем руку после удаления карты
CheckWinCondition();
}
else
{
TxtLog.Text = "Недостаточно энергии!";
}
}
}
private void BtnEndTurn_Click(object sender, RoutedEventArgs e)
{
if (_enemyHp <= 0 || _playerHp <= 0) return;
_enemyBlock = 0;
if (_enemyIntentType == "Buff")
{
_enemyStrength += _enemyIntentValue;
TxtLog.Text = $"Культист кричит 'Вжик-вжик!' и получает +{_enemyIntentValue} к Силе!";
}
else if (_enemyIntentType == "Attack")
{
TakeDamagePlayer(_enemyIntentValue);
TxtLog.Text = $"Культист атаковал вас на {_enemyIntentValue} урона!";
_enemyStrength += 3; // Пассивка культиста расти на +3 после атаки
}
UpdateUi();
if (_playerHp <= 0)
{
TxtLog.Text = "ВЫ ПОГИБЛИ. ИГРА ОКОНЧЕНА.";
HandPanel.Children.Clear();
return;
}
StartPlayerTurn();
}
private void DealDamageToEnemy(int amount)
{
if (_enemyBlock >= amount) _enemyBlock -= amount;
else { amount -= _enemyBlock; _enemyBlock = 0; _enemyHp -= amount; if (_enemyHp < 0) _enemyHp = 0; }
}
private void TakeDamagePlayer(int amount)
{
if (_playerBlock >= amount) _playerBlock -= amount;
else { amount -= _playerBlock; _playerBlock = 0; _playerHp -= amount; if (_playerHp < 0) _playerHp = 0; }
}
private void AddBlockToPlayer(int amount) => _playerBlock += amount;
private void CheckWinCondition()
{
if (_enemyHp <= 0)
{
TxtLog.Text = "ПОБЕДА! Враг повержен.";
HandPanel.Children.Clear();
}
}
private void UpdateUi()
{
TxtPlayerHp.Text = $"HP: {_playerHp}/{PlayerMaxHp}";
TxtPlayerBlock.Text = $"Броня: {_playerBlock}";
TxtEnemyHp.Text = $"HP: {_enemyHp}/{EnemyMaxHp}";
TxtEnemyBlock.Text = $"Броня: {_enemyBlock}";
TxtEnergy.Text = $"Энергия: {_energy} / 3";
}
}
}