1.需求分析
本项目一共需要2个页面,即首页和游戏页面,其中首页用于呈现关卡菜单,点击对应难度的关卡后进入游戏界面
1.1首页功能需求
首页需要包含标题和关卡列表
关卡列表包含两种游戏模式,即简单模式和困难模式,主要区别在于贪吃蛇移动速度的快慢。
点击关卡图片可以打开对应的游戏界面
1.2游戏页功能需求
游戏页面需要显示当前得分,游戏画面,方向键和“重新开始”按钮
点击方向键可以使贪吃蛇上,下,左,右转方向前进和吃食物
游戏画面由16x16格的小方格组成,主要用于显示贪吃蛇和事物
点击“重新开始”按钮可以重置全部游戏数据并重新开始游戏
2.项目创建
本项目还需创建一个images文件夹,用于存放图片
导航栏设计
app.json
{
"pages":[
"pages/index/index"
],
"window":{
"navigationBarBackgroundColor": "#B00550",
"navigationBarTitleText": "贪吃蛇小游戏"
}
}
页面设计
ustify-content: space-evenly可以使每个元素之间和元素距离边距的距离都相等,但是兼容性比较差(iphone的SE上不支持,会失效,相当于没有设置), space-evenly将剩余空间平均分割,例如有5个元素,这样就有6个相同宽度的间隔空间,间隔空间的数量等于元素的数量加一。
app.wxss
/**app.wxss**/
/* 页面容器样式 */
.container{
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-evenly;
}
index.wxml
<!--index.wxml-->
<!-- 包含两个关卡选项 -->
<view class="container">
<image src='/images/snake01.png'></image>
<image src="/images/snake02.png"></image>
</view>
index.wxss
/**index.wxss**/
/* 关卡图片 */
image{
width: 400rpx;
height: 400rpx;
}
游戏页面设计
游戏页面包括当前分数,游戏区域,方向键和“重新开始”按钮
由于暂时没有做点击跳转的逻辑设计,所以在开发工具顶端选择“普通编译”下的“添加编译模式”,并携带临时测试参数time=500,表示游戏刷新频率为每隔500ms刷新一次
game.wxml
<!--pages/game/game.wxml-->
<view class="container">
<!-- 关卡提示 -->
<view>当前分数:0</view>
<!-- 游戏画布 -->
<canvas canvas-id="myCanvas"></canvas>
<!-- 方向键 -->
<view class="btnBox">
<button>↑</button>
<view>
<button>←</button>
<button>↓</button>
<button>→</button>
</view>
</view>
<!-- "重新开始"按钮 -->
<button>重新开始</button>
</view>
game.wxss
/* pages/game/game.wxss */
/* 游戏画布 */
canvas{
border: 1rpx solid #e66660;
width: 320px;
height: 320px;
}
/* 方向键按钮整体区域 */
.btnBox{
display: flex;
flex-direction: column;
align-items: center;
}
/* 方向键按钮第二行 */
.btnBox view{
display: flex;
flex-direction: row;
}
/* 所有方向键按钮 */
.btnBox button{
width: 90rpx;
height: 90rpx;
}
/* 所有按钮样式 */
button{
margin: 10rpx;
background-color: blueviolet;
color: white;
}
数据模型设计
本项目将游戏画布分割为16行,16列的网格,每个网格的长,宽均为20像素。画布上的贪吃蛇是由一系列连续的网格填充颜色组成的,食物是由单个网格填充颜色而成
贪吃蛇模型设计
本项目设置贪吃蛇的初始身长为3格,以贪吃蛇的蛇头出现在最左侧第二行并且向右移动为例
目前规定为向右移动,所以随着每次游戏内容刷新都追加填充右侧一个空白网格作为蛇身,直至完整蛇身在网格中全部显现。
使用一个数组snakeMap记录组成蛇身的每一个网格坐标,并依次在画布的指定位置填充颜色,即可形成贪吃蛇从出现到移动直至展现完整身体的过程。
例如向右移动的贪吃蛇初始状态的坐标为
snakeMap=[{'x':0,'y':10}];
随着蛇头向右前