WeChat "점프" 게임이 최근 인기를 끌었습니다. 이 사이트에는 공유할 기사도 있습니다. PHP는 WeChat "점프" 게임을 구현합니다 이 기사에서는 주로 2048을 구현하기 위한 알고리즘과 주의할 점을 공유합니다. 함께! (소스 코드 주소는 기사 끝 부분을 참조하십시오.)
알고리즘
4*4 체커보드 보기 생성
2개 또는 4개를 무작위로 생성하여 두 개의 셀을 채움
사용자가 터치할 때 시작 위치와 끝 위치를 기록하여 슬라이딩 방향 결정
슬라이딩 방향에 따라 셀 이동 , 그리고 같은 값을 병합합니다
사용자가 한 번의 스와이프를 완료한 후 2단계를 반복합니다
게임이 끝났는지 판단하고 게임 결과에 따라 다른 프롬프트를 생성합니다
난이도
슬라이딩 방향을 결정합니다
The 사용자가 스와이프하면 동일한 그리드가 병합되고 슬라이딩 방향의 측면으로 이동됩니다
implementation
view 구현
1. wxml+wxss를 사용하여 체커보드 보기를 생성합니다
2. wx:for를 사용하여 렌더링합니다. 데이터를 각 셀에
로직 구현
1. 페이지가 로드된 후 두 셀에 숫자 2 또는 4를 무작위로 채웁니다
2. 사용자의 슬라이딩 방향을 결정합니다
touchStart 이벤트 함수를 사용하여 시작 위치 touchStartX를 얻습니다. touchStartY
touchMove 이벤트 함수를 사용하여 종료 위치 touchEndX, touchEndY
var disX = this.touchStartX - this.touchEndX; var absdisX = Math.abs(disX); var disY = this.touchStartY - this.touchEndY; var absdisY = Math.abs(disY); // 确定移动方向 // 0:上, 1:右, 2:下, 3:左 var direction = absdisX > absdisY ? (disX < 0 ? 1 : 3) : (disY < 0 ? 2 : 0);
3를 획득합니다. 슬라이딩 방향에 따라 테이블을 이동하고(오른쪽으로 슬라이딩한다고 가정) 동일한 항목을 병합합니다
4*4 2-를 생성합니다. 2048 체스판의 차원 배열 목록이며 빈 공간은 0
// 比如棋盘数据如下 var grid = [ [2, 2, 0, 0], [0, 0, 0, 0], [0, 8, 4, 0], [0, 0, 0, 0] ];
슬라이딩 방향에 따라 4개 생성 *4 2차원 배열
var list = [ [0, 0, 2, 2], // 注意是0022不是2200,因为像右滑动所以从右边push入数组 [0, 0, 0, 0], [0, 4, 8, 0], [0, 0, 0, 0] ];
해당 코드(코드 중 this.board.grid는 위의 초기 그리드임) ):
formList(dir) { // 根据传入的滑动方向生成list的四个数组 var list = [[], [], [], []]; for(var i = 0; i < this.size; i++) for(var j = 0; j < this.size; j++) { switch(dir) { case 0: list[i].push(this.board.grid[j][i]); break; case 1: list[i].push(this.board.grid[i][this.size-1-j]); break; case 2: list[i].push(this.board.grid[this.size-1-j][i]); break; case 3: list[i].push(this.board.grid[i][j]); break; } } return list; }
목록의 각 작은 배열에 숫자를 앞에 두고, 끝에 0을 넣습니다
list2 = [ [2, 2, 0, 0], [0, 0, 0, 0], [4, 8, 0, 0], [0, 0, 0, 0] ];
해당 코드:
changeItem(item) { // 将 [0, 2, 0, 2] 改为 [2, 2, 0, 0] var cnt = 0; for(var i = 0; i < item.length; i++) if(item[i] != 0) item[cnt++] = item[i]; for(var j = cnt; j < item.length; j++) item[j] = 0; return item; }
같은 값을 가진 셀을 추가하고 다음 셀의 값을 0으로 변경합니다.
list2 = [ [4, 0, 0, 0], [0, 0, 0, 0], [4, 8, 0, 0], [0, 0, 0, 0] ];
해당 코드:
combine(list) { // 滑动时相同的合并 for(var i = 0; i < list.length; i++) // 数字靠边 list[i] = this.changeItem(list[i]); for(var i = 0; i < this.size; i++) { for(var j = 1; j < this.size; j++) { if(list[i][j-1] == list[i][j] && list[i][j]!=0) { list[i][j-1] += list[i][j]; list[i][j] = 0; } } } for (var i = 0; i < list.length; i++) // 再次数字靠边,避免0220变成0400的情况发生 list[i] = this.changeItem(list[i]); return list; }
list2를 반환하여 데이터를 나열하고 체커보드 보기에 렌더링합니다
list = [
[0, 0, 0, 4],
[0, 0, 0, 0],
[ 0, 0, 8, 4],
[0, 0, 0, 0]
];
해당 코드 :
move(dir) { // 0:上, 1:右, 2:下, 3:左 var curList = this.formList(dir); var list = this.combine(curList); var result = [[],[],[],[]]; for(var i = 0; i < this.size; i++) for(var j = 0; j < this.size; j++) { switch (dir) { case 0: result[i][j] = list[j][i]; break; case 1: result[i][j] = list[i][this.size-1-j]; break; case 2: result[i][j] = list[j][this.size-1-i]; break; case 3: result[i][j] = list[i][j]; break; } } this.board.grid = result; this.setDataRandom(); // 移动一次之后随机用2或4填充两个单元格 return result; }
4. 1
5단계를 반복하여 게임 오버
판정 기준을 정합니다. : 4*4 셀이 채워져 있으며 어떤 셀의 위, 아래, 왼쪽, 오른쪽에도 동일한 값을 가진 셀이 없습니다
isOver() { // 游戏是否结束,结束条件:可用格子为空且所有格子上下左右值不等 for (var i = 0; i < this.size; i++) // 左右不等 for (var j = 1; j < this.size; j++) { if (this.board.grid[i][j] == this.board.grid[i][j - 1]) return false; } for (var j = 0; j < this.size; j++) // 上下不等 for (var i = 1; i < this.size; i++) { if (this.board.grid[i][j] == this.board.grid[i - 1][j]) return false; } return true; }
6. 게임 결과에 따라 해당 프롬프트가 제공됩니다
po 소스 코드. 주소: windlany/wechat-weapp-2048 관심이 있으신 분은 시도해 보시기 바랍니다. 모두에게 도움이 되기를 바랍니다.
관련 권장 사항:
위 내용은 WeChat 미니 프로그램 버전 2048 미니 게임의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!