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.ts
和 index.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为什么让数据传输更安全?实现事件的防抖和节流?实现图片懒加载?
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。