source: 2011/23/hniemi/Pallospeli/Pallospeli/Pallospeli/Playfield.cs @ 1861

Revision 1861, 7.5 KB checked in by hniemi, 8 years ago (diff)

No minäpä kerron tarinan.
Olipa kerran pieni nörtti, joka taisteli lohikäärmeitä vastaan. Sen pituinen se, hieman tulinen. Matti.

Line 
1
2using System;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Jypeli.Effects;
8using Jypeli.Widgets;
9using AdvanceMath;
10
11namespace Pallospeli
12{
13    /// <summary>
14    /// Playfield manages gamelogic
15    ///
16    /// </summary>
17    /// <example>
18    /// Playfield logic = new Playfield(10,10);
19    /// logic.Balls = null;
20    ///
21    /// logic.Destroy(new location(4,5));
22    /// </example>
23    public class Playfield
24    {
25        private int width;
26        private int height;
27
28        private Color[] colorset;
29        /// <summary>
30        /// Colors used in game
31        /// </summary>
32        public Color[] Colorset { get { return colorset; } }
33
34        private Location[][] directions = new Location[2][];
35        private Location[] directionseteven = {
36                                    new Location(-1 , 0),
37                                    new Location( 1 , 0),
38                                    new Location( -1 , -1),
39                                    new Location( -1 , 1),
40                                    new Location( 0 , 1),
41                                    new Location( 0 , -1)};
42        private Location[] directionsetuneven = {
43                                    new Location(-1 , 0),
44                                    new Location( 1 , 0),
45                                    new Location( 0 , -1),
46                                    new Location( 0 , 1),
47                                    new Location( 1 , 1),
48                                    new Location( 1 , -1)};
49
50        /// <summary>
51        /// Balls.Length is height, Balls[0].Length is width.
52        /// </summary>
53        private Ball[][] balls;
54        /// <summary>
55        /// Balls used in game.
56        ///
57        /// Is value is null, RandomBalls is used.
58        /// </summary>
59        public Ball[][] Balls
60        {
61            get { return balls; }
62            set 
63            {
64                if (value == null)
65                { RandomBalls(); }
66                else balls = value;
67            }
68        }
69
70        /// <summary>
71        /// Creates playfield from given width and height
72        ///
73        /// Doesn't fill playfield with balls.
74        /// </summary>
75        /// <param name="width"></param>
76        /// <param name="height"></param>
77        public Playfield(int width, int height)
78        {
79            this.width = width;
80            this.height = height;
81
82            directions[0] = directionseteven;
83            directions[1] = directionsetuneven;
84        }
85
86        /// <summary>
87        /// Creates playfield from given balls
88        /// </summary>
89        /// <param name="balls"></param>
90        public Playfield(Ball[][] balls)
91        {
92            Balls = balls;
93            width = balls[0].Length;
94            height = balls.Length;
95            directions[0] = directionseteven;
96            directions[1] = directionsetuneven;
97        }
98
99        /// <summary>
100        /// Fills playfield with balls
101        /// </summary>
102        public void RandomBalls()
103        {
104            balls = new Ball[height][];
105            for (int i = 0; i < balls.Length; i++)
106            {
107                balls[i] = new Ball[width - (i % 2)];
108                for (int j = 0; j < balls[i].Length; j++)
109                {
110                    balls[i][j] = new Ball(i, j, colorset[RandomGen.NextInt(colorset.Length)]);
111                }
112            }
113        }
114
115        /// <summary>
116        /// Destroys ball at location and neighbouring balls of same color.
117        ///
118        /// If location is invalid, nothing happens.
119        /// </summary>
120        /// <param name="location">Location to be destroyed</param>
121        public void Destroy(Location location)
122        {
123            Ball ball = Get(location);
124            if (ball == null) return;
125            ball.Presentation.Destroy();
126
127            balls[location.Y][location.X] = null;
128
129            List<Ball> near = GetNear(location);
130            foreach (Ball item in near)
131            {
132                if (item.Color == ball.Color) Destroy(item.Location);
133            }
134        }
135
136        /// <summary>
137        /// Checks if balls are stabile. Destroys unstabile.
138        /// </summary>
139        public void StabilityCheck()
140        {
141           
142            for (int i = 0; i < balls.Length; i++)
143            {
144                for (int j = 0; j < balls[i].Length; j++)
145                {
146                    if (balls[i][j] != null && !IsStabile(balls[i][j].Location))
147                    {
148                        Destroy(balls[i][j].Location);
149                    }
150                }
151            }
152        }
153
154        /// <summary>
155        /// Checks if ball in location is stabile.
156        /// </summary>
157        /// <param name="location">Location to of ball</param>
158        /// <returns>True, is stabile</returns>
159        public bool IsStabile(Location location)
160        {
161            if (location.Y < 0) return true;
162            if (Get(location) == null) return false;
163            return IsStabile(location + new Location(0, -1)) || IsStabile(location + new Location((location.Y%2 == 0 ? -1: 1), -1));
164        }
165
166        /// <summary>
167        /// Returns list of balls near location.
168        ///
169        /// If location has no neighbours, empty list is returned.
170        /// </summary>
171        /// <param name="location">Location</param>
172        /// <returns>List of balls near location</returns>
173        public List<Ball> GetNear(Location location)
174        {
175            List<Ball> list = new List<Ball>();
176            for (int i = 0; i < directions[0].Length; i++)
177            {
178                Ball ball = Get(location + directions[location.Y%2][i] );
179                if (ball != null) list.Add(ball);
180            }
181            return list;
182        }
183
184        /// <summary>
185        /// Returns ball from coordinates
186        ///
187        /// If coordinates has no balls, null is returned.
188        /// </summary>
189        /// <param name="x">X-coordinate of ball</param>
190        /// <param name="y">Y-coordinate of ball</param>
191        /// <returns></returns>
192        public Ball Get(int x, int y)
193        {
194            if (x < 0 || y < 0 || y >= height || x >= width - (y % 2)) return null;
195            if (balls[y][x] == null) return null;
196            return balls[y][x];
197        }
198
199        /// <summary>
200        /// Returns ball from given location
201        ///
202        /// If location has no balls, null is returned.
203        /// </summary>
204        /// <param name="location">Location</param>
205        /// <returns>Ball at location</returns>
206        public Ball Get(Location location)
207        { 
208            return Get(location.X, location.Y);
209        }
210
211        public void FillColorset(int colors)
212        {
213            colorset = new Color[colors];
214            for (int i = 0; i < colorset.Length; i++)
215            {
216                colorset[i] = RandomGen.NextColor();
217            }
218        }
219
220        /// <summary>
221        /// Repairs Balls[x][x].Locations
222        /// </summary>
223        public void RepairBallLocations()
224        {
225            for (int i = 0; i < balls.Length; i++)
226            {
227                for (int j = 0; j < balls[i].Length; j++)
228                {
229                    if (balls[i][j] != null)
230                    {
231                        balls[i][j].Location.X = j;
232                        balls[i][j].Location.Y = i;
233                    }
234                }
235            }
236        }
237    }
238}
Note: See TracBrowser for help on using the repository browser.