“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
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();
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
constructor(){
this.snake = new Snake();
this.food = new Food();
this.scorePanel = new ScorePanel();
this.init();
this.run();
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-brKjiXUe-1714959322900)]
[外链图片转存中…(img-k3mdgE3R-1714959322901)]
[外链图片转存中…(img-yhR0vwcR-1714959322901)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!