ts项目 --- 贪吃蛇,web小程序开发工具

2401_87298459 2024-10-08 15:33:01 阅读 89

// test指定的是规则生效的文件

test: /.ts$/,

// 要使用的loader

use: [

// 配置babel

{ -- -->

// 指定加载器

loader:“babel-loader”,

// 设置babel

options: {

// 设置预定义的环境

presets:[

[

// 指定环境的插件

“@babel/preset-env”,

// 配置信息

{

// 要兼容的目标浏览器

targets:{

“chrome”:“58”,

“ie”:“11”

},

// 指定corejs的版本

“corejs”:“3”,

// 使用corejs的方式 “usage” 表示按需加载

“useBuiltIns”:“usage”

}

]

]

}

},

‘ts-loader’

],

// 要排除的文件

exclude: /node-modules/

},

// 设置less文件的处理

{

test: /.less$/,

use:[

“style-loader”,

“css-loader”,

// 引入postcss

{

loader: “postcss-loader”,

options: {

postcssOptions:{

plugins:[

[

“postcss-preset-env”,

{

browsers: ‘last 2 versions’

}

]

]

}

}

},

“less-loader”

]

}

]

},

// 配置Webpack插件

plugins: [

new CleanWebpackPlugin(),

new HTMLWebpackPlugin({

// title: “这是一个自定义的title”

template: “./src/index.html”

}),

],

// 用来设置引用模块

resolve: {

extensions: [‘.ts’, ‘.js’]

},

mode:‘development’

};

新建src文件夹,创建index.tsindex.html

src文件夹内,新增modules文件夹和style文件夹

2.编写结构和样式

在这里插入图片描述

src/index.html

贪吃蛇

SCORE:

0

LEVEL:

1

src/style/index.less

//设置颜色变量

@bg-color:#b7d4a8;

{ -- -->

margin: 0;

padding: 0;

box-sizing: border-box;

}

#main {

display: flex;

flex-flow: column;

align-items: center;

justify-content: space-around;

margin: 0 auto;

width: 360px;

height: 420px;

border: 10px solid #000;

background-color: @bg-color;

border-radius: 30px;

#stage{

position: relative;

width: 304px;

height: 304px;

border: 2px solid #000;

#snake{

&>div{

position: absolute;

width: 10px;

height: 10px;

background-color: #000;

border: 1px solid @bg-color;

}

}

&>#food{

display: flex;

flex-flow: row wrap;

justify-content: space-between;

align-content: space-between;

position: absolute;

top: 10px;

left: 10px;

width: 10px;

height: 10px;

&>div{

width: 4px;

height: 4px;

background: #000;

transform: rotate(45deg);

}

}

}

#score-panel{

width: 300px;

display: flex;

align-items: center;

justify-content: space-between;

}

}

body {

font:bold 20px “Courier”;

}

3.模块化

src/modules/Food.ts

class Food{

element:HTMLElement;

constructor(){

//this.element=document.getElementById(‘food’) as HTMLElement

this.element=document.getElementById(‘food’)!;

}

get X() {

return this.element.offsetLeft

}

get Y() {

return this.element.offsetTop

}

change() {

this.element.style.left=Math.ceil(Math.random()*29)*10+‘px’;

this.element.style.top=Math.ceil(Math.random()*29)*10+‘px’;

}

}

export default Food;

src/modules/ScorePanel.ts

class ScorePanel{

score:number=0;

level:number=1;

scoreEle:HTMLElement;

levelEle:HTMLElement;

maxLevel:number;

upScore:number;

constructor(maxLevel:number=10,upScore:number=10){

this.scoreEle= document.getElementById(‘score’)!;

this.levelEle= document.getElementById(‘level’)!;

this.maxLevel=maxLevel;

this.upScore = upScore;

}

addScore(){

this.score++;

this.scoreEle.innerHTML = this.score + ‘’;

if(this.score % this.upScore === 0){

this.levelUp();

}

}

levelUp(){

if(this.level<this.maxLevel){

this.levelEle.innerHTML = ++this.level + ‘’;

}

}

}

export default ScorePanel;

src/modules/Snake.ts

class Snake{

head:HTMLElement;

bodies:HTMLCollection;

element:HTMLElement;

constructor(){

this.element = document.getElementById(‘snake’)!;

this.head = document.querySelector(‘#snake>div’)!;

this.bodies=this.element.getElementsByTagName(‘div’)!;

}

public get X(){

return this.head.offsetLeft;

}

public get Y(){

return this.head.offsetTop;

}

set X(value:number){

if(this.X === value){

return;

}

if(value<0 || value>290){

throw new Error(‘蛇撞墙了!!’)

}

//是否掉头

if(this.bodies[1]&&(this.bodies[1] as HTMLElement).offsetLeft === value){

if(value>this.X){

//左走向右调头

value -= 20

}else{

value += 20

}

}

//移动身体

this.moveBody();

//移动蛇头

this.head.style.left = value + ‘px’;

this.checkHeadBody();

}

set Y(value:number){

if(this.Y === value){

return

}

if(value<0 || value>290){

throw new Error(‘蛇撞墙了!!’)

}

//是否掉头

if(this.bodies[1]&&(this.bodies[1] as HTMLElement).offsetTop === value){

if(value>this.Y){

//左走向右调头

value -= 20

}else{

value += 20

}

}

this.moveBody();

this.head.style.top = value + ‘px’;

this.checkHeadBody();

}

addBody(){

this.element.insertAdjacentElement(‘beforeend’,document.createElement(‘div’))

}

moveBody(){

//将后面身体的位置改为前面身体的位置,先改后面的位置,

//后面的位置依附前面的位置

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++) {

if(this.X === (this.bodies[i] as HTMLElement).offsetLeft &&this.Y === (this.bodies[i] as HTMLElement).offsetTop){

throw new Error(‘撞到自己了!’)

}

}

}

}

export default Snake

src/modules/GameControl.ts

import Food from “./Food”;

import ScorePanel from “./ScorePanel”;

import Snake from “./Snake”;

class GameControl{

snake:Snake;

food:Food;

scorePanel:ScorePanel;

//蛇的运动方向

direction:string=’ ';

//游戏是否结束

isLive = true;

constructor(){

this.snake = new Snake();

this.food = new Food();

this.scorePanel = new ScorePanel();

this.init();

this.run();

}

init(){

//绑定键盘事件

document.addEventListener(‘keydown’,this.keydownHandler.bind(this))

}

//键盘响应函数

//key:ArrowUp ArrowDown ArrowLeft ArrowRight

// IE: Up Down Left Right

TCP协议

TCP 和 UDP 的区别?TCP 三次握手的过程?为什么是三次而不是两次、四次?三次握手过程中可以携带数据么?说说 TCP 四次挥手的过程为什么是四次挥手而不是三次?半连接队列和 SYN Flood 攻击的关系如何应对 SYN Flood 攻击?介绍一下 TCP 报文头部的字段TCP 快速打开的原理(TFO)说说TCP报文中时间戳的作用?TCP 的超时重传时间是如何计算的?TCP 的流量控制TCP 的拥塞控制说说 Nagle 算法和延迟确认?如何理解 TCP 的 keep-alive?

浏览器篇

浏览器缓存?说一说浏览器的本地存储?各自优劣如何?说一说从输入URL到页面呈现发生了什么?谈谈你对重绘和回流的理解XSS攻击CSRF攻击HTTPS为什么让数据传输更安全?实现事件的防抖和节流?实现图片懒加载?

s.snake = new Snake();

this.food = new Food();

this.scorePanel = new ScorePanel();

this.init();

this.run();

}

init(){ -- -->

//绑定键盘事件

document.addEventListener(‘keydown’,this.keydownHandler.bind(this))

}

//键盘响应函数

//key:ArrowUp ArrowDown ArrowLeft ArrowRight

// IE: Up Down Left Right

TCP协议

TCP 和 UDP 的区别?TCP 三次握手的过程?为什么是三次而不是两次、四次?三次握手过程中可以携带数据么?说说 TCP 四次挥手的过程为什么是四次挥手而不是三次?半连接队列和 SYN Flood 攻击的关系如何应对 SYN Flood 攻击?介绍一下 TCP 报文头部的字段TCP 快速打开的原理(TFO)说说TCP报文中时间戳的作用?TCP 的超时重传时间是如何计算的?TCP 的流量控制TCP 的拥塞控制说说 Nagle 算法和延迟确认?如何理解 TCP 的 keep-alive?

[外链图片转存中…(img-UW27ZN8W-1727202410370)]

浏览器篇

浏览器缓存?说一说浏览器的本地存储?各自优劣如何?说一说从输入URL到页面呈现发生了什么?谈谈你对重绘和回流的理解XSS攻击CSRF攻击HTTPS为什么让数据传输更安全?实现事件的防抖和节流?实现图片懒加载?



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。