// 引入其他类import Snake from "./Snake";import Food from "./Food";import ScorePanel from "./ScorePanel";// 游戏控制器,控制其他所有类class GameControl { // 定义三个属性 // 蛇 snake: Snake; // 食物 food: Food; // 记分牌 scorePanel: ScorePanel; // 创建一个属性来存储蛇的移动方向(也就是按键的方向) direction: string = 'Right'; // 创建一个属性用来记录游戏是否结束 isLive = true; constructor() { this.snake = new Snake(); this.food = new Food(); this.scorePanel = new ScorePanel(); this.init(); } // 游戏的初始化方法,调用后游戏即开始 init() { // 绑定键盘按键按下的事件 document.addEventListener('keydown', this.keydownHandler.bind(this)); // 调用run方法,使蛇移动 this.run(); } // 创建一个键盘按下的响应函数 keydownHandler(event: KeyboardEvent) { // 需要检查event.key的值是否合法(用户是否按了正确的按键) // 修改direction属性 this.direction = event.key; } // 创建一个控制蛇移动的方法 run() { // 根据方向(this.direction)来使蛇的位置改变 // 获取蛇的坐标 let X = this.snake.X; let Y = this.snake.Y; switch (this.direction) { case "ArrowUp": case "Up": // 向上移动top减少 Y -= 10; break; case "ArrowDown": case "Down": // 向上移动top增加 Y += 10; break; case "ArrowLeft": case "Left": // 向左移动left减少 X -= 10; break; case "ArrowRight": case "Right": // 向右移动left增加 X += 10; break; } // 检查蛇是否吃到了食物 this.checkEat(X, Y); // 修改蛇的X和Y值 try { this.snake.X = X; this.snake.Y = Y; } catch (e) { // 进入到catch说明出现了异常,游戏结束,弹出一个提示信息 alert('GAME OVER'); this.isLive = false; } // 开启一个定时调用 this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30); } // 检查蛇是否吃到了食物的方法 checkEat(X: number, Y: number) { if (X === this.food.X && Y === this.food.Y) { // 食物的位置要进行重置 this.food.change(); // 分数增加 this.scorePanel.addScore(); // 蛇增加一节 this.snake.addBody(); } }}export default GameControl;