public static Block GetFood( ArrayList allBlocks) { Block food = null; Random r = new Random(); bool redo = false; while (true) { redo = false; int x = r.Next(PropertiesBlock.width); int y = r.Next(PropertiesBlock.height); foreach (Block block in allBlocks) { if (block.Point.X == x && block.Point.Y == y) { redo = true; } } if (redo == false) { food = new Block(Color.Black, PropertiesBlock.size, new Point(x, y)); break; } } return food; }
// ��ʼ��Ϸ public void Start() { this._food = GetFood();// ����һ��ʳ�� // ��ʼ����ʱ�� timerBlock = new System.Timers.Timer(_speed[this._level]); timerBlock.Elapsed += new System.Timers.ElapsedEventHandler(OnBlockTimedEvent); timerBlock.AutoReset = true; timerBlock.Start(); }
// ǰ��һ�� private void Move() { Point p; // ��һ������λ�� Block head = (Block)(this._blocks[0]); if (this._direction == Direction.Up) p = new Point(head.Point.X, head.Point.Y - 1); else if (this._direction == Direction.Down) p = new Point(head.Point.X, head.Point.Y + 1); else if (this._direction == Direction.Left) p = new Point(head.Point.X - 1, head.Point.Y); else p = new Point(head.Point.X + 1, head.Point.Y); // ���������꣬������Ϊ��ͷ Block b = new Block(Color.Red, this._size, p); if (this._food.Point != p) this._blocks.RemoveAt(this._blocks.Count - 1);// �����һ�����겻�ǵ�ǰʳ�����꣬��ô���߿���Ϣ�б���ɾ�����һ���߿� else this._food = this.GetFood();//�����һ�������ʳ�������غϣ���ô������һ����ʳ�� this._blocks.Insert(0, b);// ����һ��������뵽�߿���Ϣ�б�ĵ�һ����ʹ���Ϊ��ͷ this.PaintPalette(this._gpPalette); // ���»��� this._directAble = true; // ��ʾ�ɽ�����һ������ }
// ������һ��ʳ�Ҳ������һ���߿� private Block GetFood() { Block food = null; Random r = new Random(); bool redo = false; while (true) { redo =false; int x = r.Next(this._width); int y = r.Next(this._height); for(int i=0;i<this._blocks.Count;i++)// ���ʳ�����������Ƿ��̰���߳�ͻ { Block b = (Block)(this._blocks[i]); if (b.Point.X == x && b.Point.Y == y)// �г�ͻʱ���������һ������ { redo = true; } } if (redo == false) { food = new Block(Color.Black, this._size, new Point(x, y)); break; } } return food; }
private bool CheckDead(Block head) { if (head.Point.X < 0 || head.Point.Y < 0 || head.Point.X >= width || head.Point.Y >= height) return true; foreach (Block block in allBlocks) { if (head.Point.X == block.Point.X && head.Point.Y == block.Point.Y) { return true; } } return false; }
/// <summary> /// Добавить блок в начало змейки (в голову) /// </summary> /// <param name="head">Ссылка на блок, что станет головой змейки</param> private void AddHead(Block head) { if (head == null) { throw new Exception("Ссылка на объект указывает на null"); } snake.Insert(0, head); }
/// <summary> /// Получение блока, который будет новой головой змейки при перемещении в указанном направлении /// </summary> /// <param name="direction">Направление движения змейки</param> /// <returns>Ссылку на объект Block, который должна занять голова змейки после перемещения</returns> public Block GetNextHead(DIRECTION direction) { Block head = this.GetHead(); Block newHead = new Block(); switch (direction) { case DIRECTION.NORTH: newHead.Left = head.Left; newHead.Top = head.Top - 1; break; case DIRECTION.EAST: newHead.Left = head.Left + 1; newHead.Top = head.Top; break; case DIRECTION.SOUTH: newHead.Left = head.Left; newHead.Top = head.Top + 1; break; case DIRECTION.WEST: newHead.Left = head.Left - 1; newHead.Top = head.Top; break; default: break; } return newHead; }
/// <summary> /// Генерация еды на игровом поле /// </summary> private void GenerateFood() { //Генерируем еду, если начало игры, если пришло время, или вся еда съедена if (tactCount % this.foodLifeTime != 0 && this.generatedFirstFood && foods.Count != 0) { return; } //Если количество еды, что может находится на карте, превышает максиальное - чистим коллекцию еды и консоль if (foods.Count >= this.foodAmount) { this.ClearFood(); foods.Clear(); } //Генерируем еду в случайном месте игрового поля, если попали в змейку - повторим string[] foodSymbols = { "@", "#", "☺", "☻", "♦", "☼" }; Block food = null; int topFood, leftFood; bool overlap = true; while (overlap) { //Генерация координат topFood = rand.Next(GameAreaOffsetY + 1, GameAreaOffsetY + GameAreaHeight - 1); leftFood = rand.Next(GameAreaOffsetX + 1, GameAreaOffsetX + GameAreaLength - 1); //Символа (в конструкторе) food = new Block(topFood, leftFood, foodSymbols[rand.Next(0, foodSymbols.Length)]); //Цвета food.Color = (ConsoleColor)rand.Next(9, 16); //Проверка не попали ли в змею при генерации foreach (Block snakeBlock in snake) { if (food.Equals(snakeBlock)) { overlap = true; break; } else { overlap = false; } } } this.generatedFirstFood = true; this.foods.Add(food); this.DrawFood(); }
public void Move() { if (!IsGameOver) { Point p = NextPositionMove(); Block b = new Block(colorSnake, this._size, p); Block foodEat = null; foreach (Block food in Foods.Food) { if (food.Point == p) foodEat = food; } if (foodEat == null) this._blocks.RemoveAt(this._blocks.Count - 1); //������� ���� ���� ��� �� ���� ��� else Foods.Food.Remove(foodEat); this._blocks.Insert(0, b); this._directAble = true; } }