C# :: Aufgabe #106 :: Lösung #6

10 Lösungen Lösungen öffentlich
#106

Stein, Papier, Schere, Echse, Spock

Anfänger - C# von Energy - 24.09.2015 um 15:22 Uhr
Programmiere das Spiel Stein, Papier, Schere, Echse, Spock, sodass man selbst eine Figur auswählen kann und der Computer eine zufällige Figur auswählt. Ermittele dann, wer diese Partie gewonnen hat.
#6
vote_ok
von aheiland (650 Punkte) - 21.10.2015 um 12:13 Uhr
Quellcode ausblenden XML-Code
<Window x:Class="SSPES.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="181" Width="270">
    <StackPanel HorizontalAlignment="Center" Margin="5">
        <Label HorizontalAlignment="Center">Opponend</Label>
        <Label Name="lbl_choice" HorizontalAlignment="Center">Choice</Label>
        <Label HorizontalAlignment="Center">VS</Label>
        <StackPanel Orientation="Horizontal">
            <Button Name="btn_sissor" Margin="5">Sissor</Button>
            <Button Name="btn_stone" Margin="5">Stone</Button>
            <Button Name="btn_paper" Margin="5">Paper</Button>
            <Button Name="btn_lizard" Margin="5">Lizard</Button>
            <Button Name="btn_spock" Margin="5">Spock</Button>
        </StackPanel>
        <Label Name="lbl_result" HorizontalAlignment="Center"></Label>
    </StackPanel>
</Window>

Quellcode ausblenden C#-Code
namespace SSPES
{
    public partial class MainWindow : Window
    {
        private Game gameInstance;
        private Brush neutral;

        public MainWindow()
        {
            InitializeComponent();
            gameInstance = new Game();
            neutral = btn_lizard.Background;
            btn_lizard.Click += btn_Click;
            btn_paper.Click += btn_Click;
            btn_sissor.Click += btn_Click;
            btn_spock.Click += btn_Click;
            btn_stone.Click += btn_Click;
        }

        void btn_Click(object sender, RoutedEventArgs e)
        {
            var used = new SolidColorBrush(Color.FromRgb(255, 0, 0));
            resetButtons();
            if (sender == btn_lizard)
            {
                gameInstance.choose(Items.Lizard);
                ((Button)sender).Background = used;
                show_result();
            }
            else if(sender == btn_paper)
            {
                gameInstance.choose(Items.Paper);
                ((Button)sender).Background = used;
                show_result();
            }
            else if (sender == btn_sissor)
            {
                gameInstance.choose(Items.Sissor);
                ((Button)sender).Background = used;
                show_result();
            }
            else if (sender == btn_spock)
            {
                gameInstance.choose(Items.Spock);
                ((Button)sender).Background = used;
                show_result();
            }
            else if (sender == btn_stone)
            {
                gameInstance.choose(Items.Stone);
                ((Button)sender).Background = used;
                show_result();
            }
            else
            {

            }

        }

        private void resetButtons()
        {
            btn_lizard.Background = neutral;
            btn_paper.Background = neutral;
            btn_sissor.Background = neutral;
            btn_spock.Background = neutral;
            btn_stone.Background = neutral;            
        }

        private void show_result()
        {
            lbl_choice.Content = gameInstance.Choice.ToString();
            lbl_result.Content = gameInstance.Result.ToString();
        }
    }
}


Quellcode ausblenden C#-Code
using Game;

namespace SSPES
{
    public enum Items
    {
            [SuccessorItems(Items.Stone, Items.Sissor)] Lizard,
            [SuccessorItems(Items.Sissor, Items.Lizard)] Paper,
            [SuccessorItems(Items.Spock, Items.Stone)] Sissor,
            [SuccessorItems(Items.Lizard, Items.Paper)] Spock,
            [SuccessorItems(Items.Paper, Items.Spock)] Stone 
    }

    public class Game
    {
        private Random rand;
        

        public Game()
        {
            rand = new Random();
        }

        public string Item { get; private set; }

        public void choose(Items item)
        {
            Choice = rand.randomItem();
            Result = item.vs(Choice);
        }

        public Items Choice { get; private set; }

        public MatchResults Result { get; private set; }
    }

    public static class Helpers
    {
        public static MatchResults vs(this Items attacker, Items defender)
        {
            if (GetAttr(attacker).successors.Contains(defender))
            {
                return MatchResults.Lose;
            }else if(attacker.Equals(defender)) {
                return MatchResults.Draw;
            }
            return MatchResults.Win;
        }

        public static Items randomItem(this Random rand)
        {
            var ItemFields = typeof(Items).GetFields();
            var index = rand.Next(ItemFields.Length-1);
            var itemField = ItemFields[index+1];
            return ((Items)itemField.GetValue(null));
        }

        private static SuccessorItems GetAttr(Items item)
        {            
            return (SuccessorItems)Attribute.GetCustomAttribute(ForValue(item), typeof(SuccessorItems));
        }

        private static MemberInfo ForValue(Items item)
        {
            return typeof(Items).GetField(Enum.GetName(typeof(Items), item));
        }
    }
}


Quellcode ausblenden C#-Code
namespace SSPES
{
    public class SuccessorItems : Attribute
    {
        public SuccessorItems(params Items[] successors)
        {
            this.successors = successors;
        }

        public Items[] successors { get; private set; }
    }
}


Quellcode ausblenden C#-Code
namespace Game
{
    public enum MatchResults
    {
        Win,
        Draw,
        Lose
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben