Main
using System;
using System.Collections;
using System.Collections.Generic;
using Sifteo;


namespace App
{
    // Purpose:
    // Base class to derive game rules from.
    // There are variants to rock paper scissors, including types with more that three choices.
    // Derive each type from this.  This will handle deciding winners, images to display, etc.
    public class BaseRules
    {
        // Purpose:
        // Stores the information for the different selections in game.
        // This would hold the info needed for a rock, paper, etc.
        public class SelectionData
        {
            // Purpose:
            // Constructor.
            //
            // ID - ID that represents the selection.  Like "Rock" "Paper"
            // imageName      - Name of the image to display for the selection.
            // selectionBeats - Which selections the selection will win against.
            // selectionLoses - Which selections the selection will lose against.
            public SelectionData(String ID,
                                 String imageName,
                                 String [] selectionsBeats,
                                 String [] selectionsLoses)
            {
                m_ID = ID;
                m_imageName = imageName;
                m_selectionsBeats = selectionsBeats;
                m_selectionsLoses = selectionsLoses;

            }

            // Purpose:
            // Check what the outcome would be against the selection.
            // Will be wheither the object would win/lose/tie against the given value.
            // checkAgainst - What type to check against.
            //
            // Return:
            // Value is the result of a match between the object and the given type.       
            public ResultState ResultAgainst(String checkAgainst)
            {
                foreach(String value in m_selectionsBeats)
                {
                    if(value == checkAgainst)
                        return ResultState.e_win;
                }

                foreach(String value in m_selectionsLoses)
                {
                    if(value == checkAgainst)
                        return ResultState.e_lose;
                }

                return ResultState.e_tie;              
            }

            // Purpose:
            // Returns the name of the image that represents the selection.
            public String GetImageName()
            {
                return m_imageName;
            }

            // ID that repesents the selection.
            public String m_ID;

            // Name of the image to display for the selection.
            private String m_imageName;

            // Which selections the selection will win against.
            private String [] m_selectionsBeats;

            // Which selections the selection will lose against.
            private String [] m_selectionsLoses;
        }

        // Purpose:
        // Check what the outcome would be for the two selections.
        // Will be whether check for won/lost/tied.
        // checkFor     - What the check is for.  This will be winner/loser/tie.
        // checkAgainst - What type to check against.
        //
        // Return:
        // Value is the result of a match between the two selection types.     
        public ResultState ResultAgainst(String checkFor,
                                         String checkAgainst)
        {
            SelectionData hold = GetSelection(checkFor);
            if(null != hold)
                return hold.ResultAgainst(checkAgainst);
           
            return ResultState.e_none;     
        }

        // Purpose:
        // Return a random selection from the possible choices.
        //
        // rand - Random number generator to use.
        //
        // Return:
        // Value is the key for the randomly selected entry, null if no entrys are stored.
        public String RandomSelection(Random rand)
        {
            int numSkip = rand.Next(m_selections.Count);
            foreach(SelectionData entry in m_selections)
            {
                if(0 == numSkip)
                    return entry.m_ID;
                --numSkip;
            }

            return null;
        }

        // Purpose:
        // Find the next selection after the given selection.
        public String NextSelection(string selection)
        {
            bool useNext = false;

            foreach(SelectionData entry in m_selections)
            {
                if(useNext)
                    return entry.m_ID;

                if(entry.m_ID == selection)
                    useNext = true;
            }  

            return m_selections[0].m_ID;       
        }

        // Purpose:
        // Retrive the image name associated with the given selection type.
        //
        // Return:
        // Value is the image name if a match is found for the selection, null if not.
        public String GetSelectionImage(String selection)
        {
            SelectionData hold = GetSelection(selection);
            if(null != hold)
                return hold.GetImageName();
            return null;
        }

        // Purpose:
        // Find the selection data for the given selection type.
        //
        // selection - Selection to find.
        //
        // Return:
        // Value is the selection data if a match is found, null if not.
        private SelectionData GetSelection(String selection)
        {
            foreach(SelectionData entry in m_selections)
            {
                if(entry.m_ID == selection)
                    return entry;
            }
           
            return null;   
        }

        // Store the selection entries.  Each entry is a valid selection.
        protected List<SelectionData> m_selections = new List<SelectionData>();
    }

    // Purpose:
    // Handle rules for rock/paper/scissors.
    public class RPSRules : BaseRules
    {
        String rock = "Rock";
        String paper = "Paper";
        String scissors = "Scissors";

        // Purpose:
        // Constructor.  Setup all the rules.
        public RPSRules()
        {
            m_selections.Add(new SelectionData(rock, "Rock",
                                               new String[]{scissors},
                                               new String[]{paper}));

            m_selections.Add(new SelectionData(paper, "Paper",
                                               new String[]{rock},
                                               new String[]{scissors}));

            m_selections.Add(new SelectionData(scissors, "Scissors",
                                               new String[]{paper},
                                               new String[]{rock}));
        }
    }

    // Purpose:
    // Handle rules for Monkey/Pirate/Robot/Ninja/Zombie.
    public class MPRNZRules : BaseRules
    {
        String monkey = "Monkey";
        String pirate = "Pirate";
        String robot = "Robot";
        String ninja = "Ninja";
        String zombie = "Zombie";

        // Purpose:
        // Constructor.  Setup all the rules.
        public MPRNZRules()
        {
            m_selections.Add(new SelectionData(monkey, "Monkey",
                                               new String[]{ninja, robot},
                                               new String[]{zombie, pirate}));

            m_selections.Add(new SelectionData(pirate, "Pirate",
                                               new String[]{robot, monkey},
                                               new String[]{ninja, zombie}));

            m_selections.Add(new SelectionData(robot, "Robot",
                                               new String[]{ninja, zombie},
                                               new String[]{monkey, pirate}));

        m_selections.Add(new SelectionData(ninja, "Ninja",
                                               new String[]{pirate, zombie},
                                               new String[]{monkey, robot}));

        m_selections.Add(new SelectionData(zombie, "Zombie",
                                               new String[]{pirate, monkey},
                                               new String[]{ninja, robot}));
        }
    }
}

 
Website copyright (c) 2012 Benjamin Millek, all rights reserved.