This commit is contained in:
进进啊
2021-12-24 09:56:57 +08:00
parent 8be0b462f0
commit 6cbd7bbe42
12 changed files with 67 additions and 152 deletions

View File

@@ -3,7 +3,7 @@
"version": "0.0.0", "version": "0.0.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve --open", "start": "ng serve --open --host 0.0.0.0",
"build": "ng build", "build": "ng build",
"watch": "ng build --watch --configuration development", "watch": "ng build --watch --configuration development",
"test": "ng test" "test": "ng test"

View File

@@ -1,35 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
}).compileComponents();
});
it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app).toBeTruthy();
});
it(`should have as title 'snake-game-ng'`, () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app.title).toEqual('snake-game-ng');
});
it('should render title', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
expect(compiled.querySelector('.content span')?.textContent).toContain('snake-game-ng app is running!');
});
});

View File

@@ -1,16 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { FoodService } from './food.service';
describe('FoodService', () => {
let service: FoodService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(FoodService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View File

@@ -1,16 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { GameControlService } from './game-control.service';
describe('GameControlService', () => {
let service: GameControlService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(GameControlService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View File

@@ -4,7 +4,7 @@
* @Author: Ruin 🍭 * @Author: Ruin 🍭
* @Date: 2021-12-09 15:25:45 * @Date: 2021-12-09 15:25:45
* @LastEditors: 刘引 * @LastEditors: 刘引
* @LastEditTime: 2021-12-16 09:26:41 * @LastEditTime: 2021-12-17 16:38:58
*/ */
import { Injectable } from "@angular/core"; import { Injectable } from "@angular/core";
import { FoodService } from "./food.service"; import { FoodService } from "./food.service";
@@ -38,7 +38,7 @@ export class GameControlService {
document.addEventListener("keydown", this.keyDownHandle.bind(this)); document.addEventListener("keydown", this.keyDownHandle.bind(this));
// 调用run方法 // 调用run方法
this.run(); this.run();
console.log("触发init"); // console.log("触发init");
} }
keyDownHandle(event: KeyboardEvent) { keyDownHandle(event: KeyboardEvent) {
@@ -87,6 +87,7 @@ export class GameControlService {
} catch (e: any) { } catch (e: any) {
// 进入到catch说明出现了异常 // 进入到catch说明出现了异常
alert(e.message + "GAME OVER"); alert(e.message + "GAME OVER");
return;
// this.init(); // this.init();
// this.isLive = false; // this.isLive = false;
} }
@@ -97,7 +98,7 @@ export class GameControlService {
// 开启定时器调用 // 开启定时器调用
setTimeout(() => { setTimeout(() => {
this.run(); this.run();
}, 500 - this.scorePanel.levelNum * 30); }, 300 - this.scorePanel.levelNum * 30);
} }
// 定义一个方法检查蛇是否吃到食物 // 定义一个方法检查蛇是否吃到食物
checkEat(X: number, Y: number) { checkEat(X: number, Y: number) {
@@ -105,12 +106,12 @@ export class GameControlService {
this.food.getFoodDom(); this.food.getFoodDom();
if (X === this.food.X && Y === this.food.Y) { if (X === this.food.X && Y === this.food.Y) {
// 蛇要增加一节
this.snake.addBody();
//食物的位置要进行重置 //食物的位置要进行重置
this.food.change(); this.food.change();
// 分数增加 // 分数增加
this.scorePanel.addScore(); this.scorePanel.addScore();
// 蛇要增加一节
this.snake.addBody();
} }
} }
} }

View File

@@ -1,16 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { MainSnakeService } from './main-snake.service';
describe('MainSnakeService', () => {
let service: MainSnakeService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(MainSnakeService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View File

@@ -4,7 +4,7 @@
* @Author: Ruin 🍭 * @Author: Ruin 🍭
* @Date: 2021-12-09 14:52:26 * @Date: 2021-12-09 14:52:26
* @LastEditors: 刘引 * @LastEditors: 刘引
* @LastEditTime: 2021-12-17 13:21:37 * @LastEditTime: 2021-12-17 16:44:48
*/ */
import { Injectable } from "@angular/core"; import { Injectable } from "@angular/core";
@@ -19,11 +19,12 @@ export class MainSnakeService {
bodies!: HTMLCollection; bodies!: HTMLCollection;
// 获取蛇的容器 // 获取蛇的容器
element!: HTMLElement; element!: HTMLElement;
snakeBodies: any = [1, 2, 3, 4];
constructor() {} constructor() {}
getSnakeDom() { getSnakeDom() {
this.element = document.getElementById("snake") as HTMLElement; this.element = document.getElementById("snake") as HTMLElement;
this.head = document.querySelector("#snake>div") as HTMLElement; this.head = document.querySelector("#snake>div") as HTMLElement;
this.bodies = this.element.getElementsByTagName("snake") as HTMLCollection; this.bodies = this.element.getElementsByTagName("div") as HTMLCollection;
} }
// 获取蛇的X坐标(蛇头坐标) // 获取蛇的X坐标(蛇头坐标)
get X() { get X() {
@@ -46,7 +47,23 @@ export class MainSnakeService {
// 进入判断说明蛇撞墙了 // 进入判断说明蛇撞墙了
throw new Error("蛇撞墙了"); throw new Error("蛇撞墙了");
} }
// 修改x时是在修改水平坐标蛇在左右移动蛇在向左移动时不能向右掉头反之亦然
if ((this.bodies[3] as HTMLElement).offsetLeft + 10 === value) {
// console.log((this.bodies[3] as HTMLElement).offsetLeft + 10, value);
if (value < this.X) {
value = this.X - 10;
console.log("value", value, "x", this.X);
console.log("向左掉头");
} else if (value > this.X) {
value = this.X + 10;
console.log("value", value, "x", this.X);
console.log("向右掉头");
}
}
this.moveBody();
this.head.style.left = value + "px"; this.head.style.left = value + "px";
this.checkHeadBody();
} }
set Y(value: number) { set Y(value: number) {
@@ -58,19 +75,44 @@ export class MainSnakeService {
// 进入判断说明蛇撞墙了,抛出一个异常 // 进入判断说明蛇撞墙了,抛出一个异常
throw new Error("蛇撞墙了"); throw new Error("蛇撞墙了");
} }
// 修改x时是在修改垂直坐标蛇在左右移动蛇在向左移动时不能向右掉头反之亦然
if ((this.bodies[3] as HTMLElement).offsetTop + 10 === value) {
// console.log((this.bodies[3] as HTMLElement).offsetLeft + 10, value);
if (value < this.Y) {
value = this.Y - 10;
} else if (value > this.Y) {
value = this.Y + 10;
}
}
this.moveBody();
this.head.style.top = value + "px"; this.head.style.top = value + "px";
this.checkHeadBody();
} }
// 蛇增加身体的方法 // 蛇增加身体的方法
addBody() { addBody() {
// 向element中添加一个div this.snakeBodies.push(this.bodies.length);
this.element.insertAdjacentHTML("beforeend", "<div></div>");
} }
//遍历获取所有的身体 //遍历获取所有的身体
// for (let index = 0; index < this.bodies.length; index++) { moveBody() {
// const element = array[index]; for (let i = this.bodies.length - 1; i > 0; i--) {
// 获取前边身体的位置
// } let X = (this.bodies[i - 1] as HTMLElement).offsetLeft;
// 遍历一个数 let Y = (this.bodies[i - 1] as HTMLElement).offsetTop;
// 将值设置到当前身体上
(this.bodies[i] as HTMLElement).style.left = X + "px";
(this.bodies[i] as HTMLElement).style.top = Y + "px";
}
}
// 用来检查蛇头是否撞到身体的方法
checkHeadBody() {
for (let i = 1; i < this.bodies.length; i++) {
let bd = this.bodies[i] as HTMLElement;
if (this.X === bd.offsetLeft && this.Y === bd.offsetTop) {
// 进入判断说明蛇头撞到了身体
throw new Error("蛇撞到自己了");
}
}
}
} }

View File

@@ -1,24 +0,0 @@
/*
* @Description: {{ByRuin}}
* @Version: 2.0
* @Author: Ruin 🍭
* @Date: 2021-12-09 13:24:13
* @LastEditors: 刘引
* @LastEditTime: 2021-12-17 11:47:49
*/
import { TestBed } from "@angular/core/testing";
import { ScorePanelService } from "./score-panel.service";
describe("ScorePanelService", () => {
let service: ScorePanelService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ScorePanelService);
});
it("should be created", () => {
expect(service).toBeTruthy();
});
});

View File

@@ -4,7 +4,7 @@
* @Author: Ruin 🍭 * @Author: Ruin 🍭
* @Date: 2021-12-09 10:12:01 * @Date: 2021-12-09 10:12:01
* @LastEditors: 刘引 * @LastEditors: 刘引
* @LastEditTime: 2021-12-17 13:13:21 * @LastEditTime: 2021-12-17 14:40:49
--> -->
<!-- 创建游戏主容器 --> <!-- 创建游戏主容器 -->
<div class="root"> <div class="root">
@@ -14,7 +14,7 @@
<!-- 设置蛇 --> <!-- 设置蛇 -->
<div class="snake" id="snake"> <div class="snake" id="snake">
<!-- snake内部的div表示蛇的各部分 --> <!-- snake内部的div表示蛇的各部分 -->
<div></div> <div *ngFor="let item of snake.snakeBodies"></div>
</div> </div>
<!-- 设置食物 --> <!-- 设置食物 -->
<div class="food" id="food"> <div class="food" id="food">

View File

@@ -24,6 +24,8 @@
height: 10px; height: 10px;
background-color: black; background-color: black;
border: 1px solid $bg-color; border: 1px solid $bg-color;
top: 0px;
left: 0px;
} }
} }
.food { .food {

View File

@@ -1,24 +0,0 @@
import { ComponentFixture, TestBed } from "@angular/core/testing";
import { SnakeComponent } from "./snake.component";
describe("SnakeComponent", () => {
let component: SnakeComponent;
let fixture: ComponentFixture<SnakeComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [SnakeComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(SnakeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it("should create", () => {
expect(component).toBeTruthy();
});
});

View File

@@ -4,7 +4,7 @@
* @Author: Ruin 🍭 * @Author: Ruin 🍭
* @Date: 2021-12-09 10:12:01 * @Date: 2021-12-09 10:12:01
* @LastEditors: 刘引 * @LastEditors: 刘引
* @LastEditTime: 2021-12-17 10:46:49 * @LastEditTime: 2021-12-17 14:39:17
*/ */
import { Component, OnInit } from "@angular/core"; import { Component, OnInit } from "@angular/core";
import { FoodService } from "src/app/services/snake/food.service"; import { FoodService } from "src/app/services/snake/food.service";
@@ -37,8 +37,11 @@ export class SnakeComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
// this.keyDownHandle(); // this.keyDownHandle();
// this.snake.getSnakeDom(); // this.snake.getSnakeDom();
// this.snakeBodies = [1, 2, 3, 4];
} }
ngAfterViewInit(): void { ngAfterViewInit(): void {
this.game.init();
//Called after ngAfterContentInit when the component's view has been initialized. Applies to components only. //Called after ngAfterContentInit when the component's view has been initialized. Applies to components only.
//Add 'implements AfterViewInit' to the class. //Add 'implements AfterViewInit' to the class.
// 测试代码 // 测试代码
@@ -47,7 +50,5 @@ export class SnakeComponent implements OnInit {
// this.food.Y; // this.food.Y;
// this.food.change(); // this.food.change();
// this.snake.X = 100; // this.snake.X = 100;
this.game.init();
this.snake.addBody();
} }
} }