//проверка возможности смещения вниз public override bool CheckDown(Field field) { if (field.TetrisField[field.CurY + 2, field.CurX] == true || field.TetrisField[field.CurY + 2, field.CurX + 1] == true || (field.CurY + 2) == field.Height - 1) return false; return false; }
//проверка возможности смещения вправо public override bool CheckRight(Field field) { if (_position == 1) { if (field.TetrisField[field.CurY, field.CurX + 2] == true || field.TetrisField[field.CurY + 1, field.CurX + 2] == true || field.TetrisField[field.CurY + 2, field.CurX + 1] == true || field.CurX == field.Width - 3) return false; else return true; } else { if (_position == 2) { if (field.TetrisField[field.CurY + 1, field.CurX + 2] == true || field.TetrisField[field.CurY + 2, field.CurX + 3] == true || field.CurX == field.Width - 4) return false; else return true; } if (_position == 3) { if (field.TetrisField[field.CurY, field.CurX + 3] == true || field.TetrisField[field.CurY + 1, field.CurX + 3] == true || field.TetrisField[field.CurY + 2, field.CurX + 2] == true || field.CurX == field.Width - 4) return false; else return true; } if (_position == 4) { if (field.TetrisField[field.CurY, field.CurX + 2] == true || field.TetrisField[field.CurY + 1, field.CurX + 3] == true || field.CurX == field.Width - 4) return false; else return true; } } return false; }
//проверка возможности смещения влево public override bool CheckLeft(Field field) { if (_position == 1) { if (field.TetrisField[field.CurY, field.CurX - 1] == true || field.TetrisField[field.CurY + 1, field.CurX + 1] == true || field.CurX == 1) return false; else return true; } else { if (_position == 2) { for (int i = 0; i < 3; i++) { if (field.TetrisField[field.CurY + i, field.CurX - 1] == true || field.CurX == 1) return false; } return true; } if (_position == 3) { if (field.TetrisField[field.CurY + 1, field.CurX - 1] == true || field.TetrisField[field.CurY + 2, field.CurX - 1] == true || field.CurX == 1) return false; else return true; } if (_position == 4) { if (field.TetrisField[field.CurY + 2, field.CurX] == true || field.TetrisField[field.CurY + 1, field.CurX + 1] == true || field.TetrisField[field.CurY, field.CurX + 1] == true || field.CurX == 0) return false; else return true; } } return false; }
//проверка возможности смещения влево public override bool CheckLeft(Field field) { if (field.TetrisField[field.CurY + 1, field.CurX - 1] || field.TetrisField[field.CurY + 1, field.CurX - 1] || field.CurX == 1) return false; return true; }
//проверка возможности смещения вправо public override bool CheckRight(Field field) { if (field.TetrisField[field.CurY, field.CurX + 2] == true || field.TetrisField[field.CurY + 1, field.CurX + 2] == true || field.CurX == field.Width - 3) return false; else return true; return false; }
//проверка возможности смещения вправо public override bool CheckRight(Field field) { if (_position == 1 || _position == 3) { if (field.TetrisField[field.CurY, field.CurX + 4] || field.CurX == field.Width - 5) return false; else return true; } else { if (_position == 2 || _position == 4) { for (int i = 0; i < 4; i++) { if (field.TetrisField[field.CurY + i, field.CurX + 2] || field.CurX == field.Width - 3) return false; } return true; } } return false; }
//проверка возможности смещения влево public override bool CheckLeft(Field field) { if (_position == 1) { if (field.TetrisField[field.CurY, field.CurX] || field.TetrisField[field.CurY + 1, field.CurX - 1] || field.TetrisField[field.CurY + 2, field.CurX - 1] || field.CurX == 1) return false; return true; } else { if (_position == 2) { if (field.TetrisField[field.CurY + 1, field.CurX - 1] || field.TetrisField[field.CurY + 2, field.CurX] || field.CurX == 1) return false; else return true; } if (_position == 3) { if (field.TetrisField[field.CurY, field.CurX + 1] || field.TetrisField[field.CurY + 1, field.CurX] || field.TetrisField[field.CurY + 2, field.CurX] || field.CurX == 0) return false; else return true; } if (_position == 4) { if (field.TetrisField[field.CurY, field.CurX - 1] || field.TetrisField[field.CurY + 1, field.CurX] || field.CurX == 1) return false; else return true; } } return false; }
//проверка возможности смещения вниз public override bool CheckDown(Field field) { if (_position == 1 || _position == 3) { for (int i = 0; i < 4; i++) { if (field.TetrisField[field.CurY + 1, field.CurX + i] || (field.CurY + 1) == field.Height - 1) return false; } return true; } else { if (_position == 2 || _position == 4) { if (field.TetrisField[field.CurY + 4, field.CurX + 1] || (field.CurY + 4) == field.Height - 1) return false; } return true; } return false; }
//проверка возможности смещения вниз public override bool CheckDown(Field field) { if (_position == 1) { for (int i = 0; i < 3; i++) { if (field.TetrisField[field.CurY + 2, field.CurX + i] || (field.CurY + 2) == field.Height - 1) return false; } return true; } else { if (_position == 2) { if (field.TetrisField[field.CurY + 2, field.CurX] || field.TetrisField[field.CurY + 3, field.CurX + 1] || (field.CurY + 3) == field.Height - 1) return false; return true; } if (_position == 3) { if (field.TetrisField[field.CurY + 2, field.CurX] || field.TetrisField[field.CurY + 3, field.CurX + 1] || field.TetrisField[field.CurY + 2, field.CurX + 2] || (field.CurY + 3) == field.Height - 1) return false; return true; } if (_position == 4) { if (field.TetrisField[field.CurY + 3, field.CurX + 1] || field.TetrisField[field.CurY + 2, field.CurX + 2] || (field.CurY + 3) == field.Height - 1) return false; return true; } } return false; }
private static void Main(string[] args) { Console.BackgroundColor = ConsoleColor.White; for (int i = 0; i < 20; i++) { Console.CursorLeft = 0; Console.CursorTop = i; Console.WriteLine("0"); } for (int i = 1; i < 12; i++) { Console.CursorLeft = i; Console.CursorTop = 19; Console.WriteLine("0"); } for (int i = 0; i < 20; i++) { Console.CursorLeft = 11; Console.CursorTop = i; Console.WriteLine("0"); } Console.BackgroundColor = ConsoleColor.Black; Field f = new Field(12, 20); f.NewFig(); f.DrawField(); //создание объектов событий нажатия клавиш EventUp up = new EventUp(); //вверх EventDown down = new EventDown(); //вниз EventLeft left = new EventLeft(); // влево EventRight right = new EventRight(); //вправо up.UpEvent += f.UpFig; down.DownEvent += f.DownFig; left.LeftEvent += f.LeftFig; right.RightEvent += f.RightFig; ConsoleKeyInfo cki; //Скорее всего это можно поднять наверх, логика не идеально while (true) { if (f.Fig.CheckDown(f)) { f.Move(); } else { while (true) { bool flag = f.CheckLine(); if (flag == false) break; } f.NewFig(); if (f.Fig.IsAtBottom(f) == true) break; } for (int i = 0; i < 10 - f.Level; i++) //количество итераций цикла имитирует скорость { System.Threading.Thread.Sleep(50); if (Console.KeyAvailable) { cki = Console.ReadKey(); switch (cki.Key) { case ConsoleKey.UpArrow: //стрелка вверх { if (!f.Fig.IsCanRotate(f)) break; up.UpUserEvent(); //обработчик события f.DrawField(); //перерисовка поля break; } case ConsoleKey.DownArrow: { down.DownUserEvent(); break; } case ConsoleKey.LeftArrow: { left.LeftUserEvent(); f.DrawField(); //перерисовка поля break; } case ConsoleKey.RightArrow: { right.RightUserEvent(); f.DrawField(); break; } default: { break; } } } } } Console.Clear(); Console.WriteLine("\n\n\n GAME OVER"); Console.WriteLine("\n TOTAL SCORES " + (f.Level*1000 + f.Scores) + "\n\n\n\n\n\n\n\n\n"); Console.ReadLine(); }
//проверка достижения "потолка" public override bool IsAtBottom(Field field) { for (int i = 0; i < 4; i++) { if (field.TetrisField[1, field.CurX + i] ) return true; } return false; }
public override bool IsCanRotate(Field field) { return true; }
public abstract bool IsAtBottom(Field field);
public abstract bool IsCanRotate(Field field);
public abstract bool CheckDown(Field field);
public abstract bool CheckRight(Field field);
public abstract bool CheckLeft(Field field);
//проверка возможности смещения вниз public override bool CheckDown(Field field) { if (_position == 1) { if (field.TetrisField[field.CurY + 3, field.CurX] || field.TetrisField[field.CurY + 2, field.CurX + 1] || field.CurY + 3 == field.Height - 1) return false; else return true; } else { if (_position == 2) { if (field.TetrisField[field.CurY + 2, field.CurX] || field.TetrisField[field.CurY + 3, field.CurX + 1] || field.TetrisField[field.CurY + 3, field.CurX + 2] || field.CurY + 3 == field.Height - 1) return false; else return true; } if (_position == 3) { if (field.TetrisField[field.CurY + 3, field.CurX + 1] == true || field.TetrisField[field.CurY + 2, field.CurX + 2] == true || field.CurY + 3 == field.Height - 1) return false; else return true; } if (_position == 4) { if (field.TetrisField[field.CurY + 1, field.CurX] || field.TetrisField[field.CurY + 2, field.CurX + 1] || field.TetrisField[field.CurY + 2, field.CurX + 2] || field.CurY + 2 == field.Height - 1) return false; else return true; } } return false; }
//проверка достижения "потолка" public override bool IsAtBottom(Field field) { if (field.TetrisField[3, field.CurX] == true || field.TetrisField[2, field.CurX + 1] ) return true; return false; }