Show
Ignore:
Timestamp:
02/23/2012 02:18:54 PM (2 years ago)
Author:
acarter
Message:

Added checking in the Match minigame.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Code/oMaE/oMaE/MiniGames/Match.cs

    r58 r60  
    2020    public class Match : MiniGame 
    2121    { 
    22         private enum line_t { NONE, NEW, WRONG, CORRECT }; 
     22        private struct RadioPair { public RadioButton First, Second; public RadioPair(RadioButton first, RadioButton second) { First = first; Second = second; } } 
     23        // FIXME Base off of radio buttons and not locations. 
     24        private Dictionary<RadioButton, MatchImage> inputs = new Dictionary<RadioButton, MatchImage>(), outputs = new Dictionary<RadioButton, MatchImage>(); 
     25        private int totalLines = 6; 
     26        private int validLines = 0; 
     27        private int seed; 
     28        private enum LINE_TYPE { NONE, NEW, WRONG, CORRECT }; 
    2329        RadioGroup radioGroup, matchGroup; 
    2430        int[] offset = new int[]{22, 17, 0, 25, 38}; 
    2531        String[] energies = new String[] { "Kinetic Energy", "Electric Energy", "Chemical Energy", "Sound Energy", "Light Energy", "Thermal Energy", "Wind Energy" }; 
    26         Dictionary<Vector4, bool> lines = new Dictionary<Vector4, bool>(); 
     32        Dictionary<RadioPair, LINE_TYPE> pairs = new Dictionary<RadioPair, LINE_TYPE>(); 
     33 
     34        public Match(int seed = 0) 
     35        { 
     36            this.seed = seed; 
     37        } 
    2738        /// <summary> 
    2839        /// Initializes the match minigame. 
     
    3748            matchGroup = new RadioGroup(); 
    3849            children.Add(matchGroup); 
    39             children.Add(new MatchImage(matchGroup, new Image2D("Sprites/drum", new Rectangle(270, 70, 100, 100)))); 
    40             children.Add(new MatchImage(matchGroup, new Image2D("Sprites/microphone", new Rectangle(295, 190, 50, 100)))); 
    41             children.Add(new MatchImage(matchGroup, new Image2D("Sprites/speaker", new Rectangle(270, 310, 100, 100)))); 
     50            // FIXME 
     51            LinkedList<String[]> possibilities = new LinkedList<String[]>(); 
     52            possibilities.AddLast(new String[] { "Sprites/drum", "Kinetic Energy", "Sound Energy"}); 
     53            possibilities.AddLast(new String[] { "Sprites/microphone", "Sound Energy", "Electric Energy" }); 
     54            possibilities.AddLast(new String[] { "Sprites/speaker", "Electric Energy", "Sound Energy" }); 
     55            possibilities.AddLast(new String[] { "Sprites/lightbulb", "Electric Energy", "Light Energy" }); 
     56            possibilities.AddLast(new String[] { "Sprites/windmill", "Wind Energy", "Electric Energy" }); 
     57            for (int i = 0; i < 3; ++i) 
     58            { 
     59                int index = seed % possibilities.Count; 
     60                String[] temp = possibilities.ElementAt(index); 
     61                possibilities.Remove(temp); 
     62                int less_width = temp[0] == "Sprites/microphone" || temp[0] == "Sprites/windmill" ? 50 : 
     63                                 temp[0] == "Sprites/lightbulb" ? 32 : 0; 
     64                MatchImage image = new MatchImage(matchGroup, new Image2D(temp[0], new Rectangle(270 + less_width / 2, 70 + i * 120, 100 - less_width, 100)), temp[1], temp[2]); 
     65                children.Add(image); 
     66                inputs.Add(image.Left, image); 
     67                outputs.Add(image.Right, image); 
     68            } 
    4269            base.Initialize(); 
    4370        } 
     71        /// <summary> 
     72        /// Updates the radio button pairs 
     73        /// </summary> 
    4474        public override void Update() 
    4575        { 
    4676            if (radioGroup.ActiveButton != null && matchGroup.ActiveButton != null) 
    4777            { 
    48                 Vector4 line = new Vector4(radioGroup.ActiveButton.Center.X, 
    49                                            radioGroup.ActiveButton.Center.Y, 
    50                                            matchGroup.ActiveButton.Center.X, 
    51                                            matchGroup.ActiveButton.Center.Y); 
    52                 if (!lines.ContainsKey(line)) 
    53                     lines.Add(line, true); 
    54                 else 
    55                     lines[line] = !lines[line]; 
     78                if((radioGroup.ActiveButton.Center.X < 250) ^ (outputs.ContainsKey(matchGroup.ActiveButton))) 
     79                { 
     80                    RadioPair pair = new RadioPair(radioGroup.ActiveButton, matchGroup.ActiveButton); 
     81                    if (!pairs.ContainsKey(pair)) 
     82                        pairs.Add(pair, LINE_TYPE.NONE); 
     83 
     84                    if(pairs[pair] == LINE_TYPE.NONE && validLines < totalLines) 
     85                    { 
     86                        pairs[pair] = LINE_TYPE.NEW; 
     87                        validLines++; 
     88                    } 
     89                    else if (pairs[pair] == LINE_TYPE.NEW) 
     90                    { 
     91                        pairs[pair] = LINE_TYPE.NONE; 
     92                        validLines--; 
     93                    } 
     94                } 
    5695                radioGroup.ClearActive(); 
    5796                matchGroup.ClearActive(); 
    5897            } 
    5998            base.Update(); 
     99        } 
     100        /// <summary> 
     101        /// Checks for correctness 
     102        /// </summary> 
     103        public override bool Correct 
     104        { 
     105            get 
     106            { 
     107                if(validLines != totalLines) 
     108                    return false; 
     109                Dictionary<RadioPair, LINE_TYPE> copy = new Dictionary<RadioPair, LINE_TYPE>(pairs); 
     110                foreach (KeyValuePair<RadioPair, LINE_TYPE> pair in pairs) 
     111                { 
     112                    if (pair.Value == LINE_TYPE.NEW) 
     113                    { 
     114                        if (inputs.ContainsKey(pair.Key.Second) && inputs[pair.Key.Second].From.Contains(pair.Key.First.Text) 
     115                            || outputs.ContainsKey(pair.Key.Second) && outputs[pair.Key.Second].To.Contains(pair.Key.First.Text)) 
     116                        { 
     117                            copy[pair.Key] = LINE_TYPE.CORRECT; 
     118                        } 
     119                        else 
     120                        { 
     121                            copy[pair.Key] = LINE_TYPE.WRONG; 
     122                            validLines--; 
     123                        } 
     124                    } 
     125                } 
     126                pairs = copy; 
     127                return validLines == totalLines; 
     128            } 
    60129        } 
    61130        /// <summary> 
     
    70139            if (matchGroup.ActiveButton != null) 
    71140                screen.DrawLine(matchGroup.ActiveButton.Center, gameState.MousePos, Color.Black); 
    72             foreach (KeyValuePair<Vector4, bool> pair in lines) 
    73                 if (pair.Value) 
    74                     screen.DrawLine(new Vector2(pair.Key.X, pair.Key.Y), new Vector2(pair.Key.Z, pair.Key.W), Color.White); 
     141            foreach (KeyValuePair<RadioPair, LINE_TYPE> pair in pairs) 
     142            { 
     143                Color lineColor; 
     144                switch(pair.Value) 
     145                { 
     146                    case LINE_TYPE.NEW: 
     147                        lineColor = Color.White; 
     148                        break; 
     149                    case LINE_TYPE.CORRECT: 
     150                        lineColor = Color.DarkGreen; 
     151                        break; 
     152                    case LINE_TYPE.WRONG: 
     153                        lineColor = Color.Red; 
     154                        break; 
     155                    default: 
     156                        continue; 
     157                } 
     158                screen.DrawLine(pair.Key.First.Center, pair.Key.Second.Center, lineColor); 
     159            } 
    75160            screen.DrawText("Match the images to the forms of energy that they convert", new Vector2(320, 10), TextHorizontal.CENTERED, TextVertical.TOP, Color.White); 
    76161            screen.DrawText("Starts as", new Vector2(220, 60), TextHorizontal.CENTERED, TextVertical.TOP, Color.White); 
    77162            screen.DrawText("and becomes", new Vector2(420, 60), TextHorizontal.CENTERED, TextVertical.TOP, Color.White); 
     163            screen.DrawText(String.Format("Currently matched {0}/{1} items", validLines, totalLines), new Vector2(800, 300), TextHorizontal.CENTERED, TextVertical.TOP, Color.White); 
    78164            base.Draw(screen, gameState); 
    79165        }