View difference between Paste ID: 9rdMHH4V and UkMY62N7
SHOW: | | - or go back to the newest paste.
1
/*
2
 * we all know the classic "guessing game" with higher or lower prompts. 
3
 * lets do a role reversal; you create a program that
4
 * will guess numbers between 1-100, and respond appropriately 
5
 * based on whether users say that the number is too high or too low.
6
 * Try to make a program that can guess your number based on user input and great code!
7
 */
8
9
using System;
10
using System.Collections.Generic;
11
using System.Linq;
12
using System.Text;
13
using System.Globalization;
14
15
namespace First_Hard
16
{
17
    class Program
18
    {
19
        static void Main(string[] args)
20
        {
21
            string[] enumValues = Enum.GetNames(typeof(Opoments));
22
            Console.WriteLine("Choose the opponent for guessing:");
23
            for (int i = 0; i < enumValues.Length; i++)
24
            {
25
                Console.WriteLine("[{0}] -> {1} Opoment", i + 1, enumValues[i]);
26
            }
27
28
            int userInput = 0;
29
            string line;
30
            do
31
            {
32
                line = Console.ReadLine();
33
            } while (!int.TryParse(line, out userInput) || userInput > enumValues.Length || userInput <= 0);
34
35
            userInput--;
36
            IGuesser guesser;
37
            string opponentClass = enumValues[userInput];
38
            opponentClass = new CultureInfo("en-GB").TextInfo.ToTitleCase(opponentClass);
39
            opponentClass += "Guesser";
40
            opponentClass = "First_Hard." + opponentClass;
41
            Type opponentType = Type.GetType(opponentClass, true, true);
42
            guesser = opponentType.GetConstructor(new Type[0]).Invoke(new object[0]) as IGuesser;
43
44
            if (guesser == null) return;
45
            Console.WriteLine("Game is starting.");
46
            Console.WriteLine("First Guess is {0}", guesser.FirstGuess());
47
            GuessResult result;
48
            while ((result = AskUser()) != GuessResult.exact)
49
            {
50
                if (result == GuessResult.higher)
51
                {
52
                    Console.WriteLine("Is it {0}?", guesser.GuessHigher());
53
                }
54
                else
55
                {
56
                    Console.WriteLine("How about {0}?", guesser.GuessLower());
57
                }
58
            }
59
            Console.WriteLine("Thank you for playing");
60
            Console.ReadKey();
61
        }
62
63
        static GuessResult AskUser()
64
        {
65
            string answer;
66
            do
67
            {
68
                Console.WriteLine("[H]igher, [L]ower or [E]xact");
69
                answer = Console.ReadLine();
70
                answer.ToLower();
71
            } while (answer != "h" && answer != "l" && answer != "e");
72
            switch (answer)
73
            {
74
                case "h":
75
                    return GuessResult.higher;
76
                case "l":
77
                    return GuessResult.lower;
78
                case "e":
79
                    return GuessResult.exact;
80
            }
81
            throw new InvalidOperationException("I should never be thrown");
82
83
        }
84
    }
85
86
    interface IGuesser
87
    {
88
        int FirstGuess();
89
        int GuessLower();
90
        int GuessHigher();
91
    }
92
93
    enum Opoments
94
    {
95
        dumb, smart, random
96
    }
97
98
    enum GuessResult
99
    {
100
        higher, lower, exact
101
    }
102
103
    class DumbGuesser : IGuesser
104
    {
105
        private int top;
106
        private int bottom;
107
        private int last;
108
        private Random rand;
109
110
        public DumbGuesser()
111
        {
112
            top = 100;
113
            bottom = 1;
114
            last = -1;
115
            rand = new Random();
116
        }
117
118
        public int FirstGuess()
119
        {
120
            if (last != -1) throw new InvalidOperationException("I alredy guessed first time");
121
            last = rand.Next(100);
122
            return last;
123
        }
124
125
        public int GuessLower()
126
        {
127
            Check();
128
            top = last;
129
            last = rand.Next(bottom, top);
130
            return last;
131
        }
132
133
        public int GuessHigher()
134
        {
135
            Check();
136
            bottom = last;
137
            last = rand.Next(bottom, top);
138
            return last;
139
        }
140
141
        private void Check()
142
        {
143
            if (last == -1)
144
                throw new InvalidOperationException("I did not have first guess");
145
            if (bottom >= top)
146
            {
147
                Console.WriteLine("CHEATER!!!!!!");
148
                Console.ReadKey();
149
                Environment.Exit(0);
150
            }
151
        }
152
    }
153
154
    class SmartGuesser : IGuesser
155
    {
156
        private int top;
157
        private int bottom;
158
        private int last;
159
160
        public SmartGuesser()
161
        {
162
            top = 100;
163
            bottom = 1;
164
            last = -1;
165
        }
166
167
        public int FirstGuess()
168
        {
169
            last = 50;
170
            return 50;
171
        }
172
173
        public int GuessLower()
174
        {
175
            top = last;
176
            return Guess();
177
        }
178
179
        public int GuessHigher()
180
        {
181
            bottom = last;
182
            return Guess();
183
        }
184
185
        private int Guess()
186
        {
187
            Check();
188
            int retVal = (top - bottom + 1) / 2;
189
            retVal += bottom;
190
            last = retVal;
191
            return retVal;
192
        }
193
194
        private void Check()
195
        {
196
            if (last == -1)
197
                throw new InvalidOperationException("I did not have first guess");
198
            if (bottom >= top)
199
            {
200
                Console.WriteLine("CHEATER!!!!!!");
201
                Console.ReadKey();
202
                Environment.Exit(0);
203
            }
204
        }
205
    }
206
207
    public class RandomGuesser : IGuesser
208
    {
209
        private IGuesser innerGuesser;
210
        public RandomGuesser()
211
        {
212
            if ((new Random().Next() % 2) == 0)
213
            {
214
                innerGuesser = new SmartGuesser();
215
            }
216
            else
217
            {
218
                innerGuesser = new DumbGuesser();
219
            }
220
        }
221
222
        public int FirstGuess()
223
        {
224
            return innerGuesser.FirstGuess();
225
        }
226
227
        public int GuessLower()
228
        {
229
            return innerGuesser.GuessLower();
230
        }
231
232
        public int GuessHigher()
233
        {
234
            return innerGuesser.GuessHigher();
235
        }
236
    }
237
}