package com.caojing.harmonyfrist.view;
import com.caojing.harmonyfrist.entity.MPoint;
import com.caojing.harmonyfrist.slice.MainAbilitySlice;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.AttrSet;
import ohos.agp.components.Component;
import ohos.agp.components.TableLayout;
import ohos.agp.components.element.ShapeElement;
import ohos.app.Context;
import ohos.data.DatabaseHelper;
import ohos.data.preferences.Preferences;
import ohos.media.audio.SoundPlayer;
import ohos.multimodalinput.event.MmiPoint;
import ohos.multimodalinput.event.TouchEvent;
import java.util.ArrayList;
import java.util.List;
public class GameView extends TableLayout {
MainAbilitySlice mainAbilitySlice;
//标示是否可以悔棋,默认不能悔棋,滑动一次后才能悔棋
boolean isCanRetract = false;
//记录卡片view的二维数组
private CardView[][] cardMap = new CardView[4][4];
//记录上一步卡片位置的二维数组
private int[][] retractMap = new int[4][4];
//记录所有空点的集合,随机数只能添加在空点内
private List<MPoint> emptyPoints = new ArrayList<>();
private int score = 0;
float volume = 1.0f; //音频音量
public GameView(Context context) {
super(context);
initGameView();
}
public GameView(Context context, AttrSet attrSet) {
super(context, attrSet);
initGameView();
}
public GameView(Context context, AttrSet attrSet, String styleName) {
super(context, attrSet, styleName);
initGameView();
}
// 音频播放实例化对象
SoundPlayer soundPlayer = new SoundPlayer("com.caojing.harmonyfrist");
/**
* 播放声音
*/
public void playSound() {
// 播放键盘敲击音,音量为1.0
soundPlayer.playSound(SoundPlayer.SoundType.KEY_CLICK, volume);
}
void initGameView() {
mainAbilitySlice = ((MainAbilitySlice) getContext());
setColumnCount(4);
ShapeElement element = new ShapeElement();
element.setRgbColor(new RgbColor(185, 176, 160));
element.setCornerRadius(10);
setBackground(element);
setPadding(0, 0, 10, 10);
addCards();
startGame();
//设置触摸监听事件
setTouchEventListener(new TouchEventListener() {
private float starX, starY, offsetX, offsetY;
@Override
public boolean onTouchEvent(Component component, TouchEvent touchEvent) {
MmiPoint point = touchEvent.getPointerScreenPosition(0);
switch (touchEvent.getAction()) {
case TouchEvent.PRIMARY_POINT_DOWN:
starX = point.getX(); //记录手指按下的x点坐标
starY = point.getY(); //记录手指按下的y点坐标
break;
case TouchEvent.PRIMARY_POINT_UP:
offsetX = point.getX() - starX;//横向滑动距离
offsetY = point.getY() - starY;//纵向滑动距离
if (Math.abs(offsetX) > Math.abs(offsetY)) {
if (offsetX < -5) {
//左滑监听
System.out.println("左边");
swipeLeft();
} else if (offsetX > 5) {
//右滑监听
System.out.println("右边");
swipeRight();
}
} else {
if (offsetY < -5) {
//上滑监听
System.out.println("上边");
swipeUp();
} else if (offsetY > 5) {
//下滑监听
System.out.println("下边");
swipeDown();
}
}
break;
}
return true;
}
});
}
/**
* 添加数字卡片
*/
private void addCards() {
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
CardView cardView = new CardView(getContext());
cardView.setNum(0);
cardView.setPadding(10, 10, 0, 0);
addComponent(cardView, 200, 200);
cardMap[x][y] = cardView;
}
}
}
/**
* 开始游戏
*/
public void startGame() {
mainAbilitySlice.clearScore();
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
cardMap[x][y].setNum(0);
}
}
//添加两个随机数卡片
addRoundNum();
addRoundNum();
isCanRetract = false;
}
/**
* 添加随机数
*/
private void addRoundNum() {
emptyPoints.clear();
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
if (cardMap[x][y].getNum() <= 0) {
//将空点添加到空点集合中
emptyPoints.add(new MPoint(x, y));
}
}
}
if (emptyPoints.size() > 0) {
MPoint point = emptyPoints.remove((int) (Math.random() * emptyPoints.size()));
cardMap[point.getX()][point.getY()].setNum(Math.random() > 0.1 ? 2 : 4);
// mainAbilitySlice.getAnimLayer().createScaleTo1(cardMap[point.getX()][point.getY()]);
}
gameOver();
}
private void swipeLeft() {
retractMap();
boolean isMerge = false;
//向左边滑动
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
for (int x1 = x + 1; x1 < 4; x1++) {
//如果同一行的右边的点数字大于0
if (cardMap[x1][y].getNum() > 0) {
//如果最左边没有数字时,则将右边数字移动到左边
if (cardMap[x][y].getNum() <= 0) {
//添加移动动画,目前还有问题
// mainAbilitySlice.getAnimLayer().createMoveAnim(cardMap[x1][y], cardMap[x][y], x1, x, y, y);
cardMap[x][y].setNum(cardMap[x1][y].getNum());
cardMap[x1][y].setNum(0);
x--;
isMerge = true;
} else if (cardMap[x][y].equals(cardMap[x1][y])) {
//如果有右边的数字和左边的数字相等,则进行合并
// mainAbilitySlice.getAnimLayer().createMoveAnim(cardMap[x1][y], cardMap[x][y], x1, x, y, y);
cardMap[x][y].setNum(cardMap[x][y].getNum() * 2);
cardMap[x1][y].setNum(0);
isMerge = true;
mainAbilitySlice.addScore(cardMap[x][y].getNum());
}
break;
}
}
}
}
//如果存在合并或者移动,则添加一个随机棋子
if (isMerge) addRoundNum();
}
private void swipeRight() {
retractMap();
//向右滑动
//是否存在合并或者移动
boolean isMerge = false;
for (int y = 0; y < 4; y++) {
for (int x = 3; x >= 0; x--) {
for (int x1 = x - 1; x1 >= 0; x1--) {
//如果同一行的右边的点数字大于0
if (cardMap[x1][y].getNum() > 0) {
//如果最左边没有数字时,则将右边数字移动到左边
if (cardMap[x][y].getNum() <= 0) {
//
没有合适的资源?快使用搜索试试~ 我知道了~
鸿蒙2048小游戏.zip
共26个文件
java:7个
xml:5个
png:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 181 浏览量
2024-02-07
11:55:57
上传
评论
收藏 89KB ZIP 举报
温馨提示
华为 鸿蒙系统 开发
资源推荐
资源详情
资源评论
收起资源包目录
鸿蒙2048小游戏.zip (26个子文件)
DevEcoStudioProjects-master
gradle.properties 549B
gradle
wrapper
gradle-wrapper.jar 53KB
gradle-wrapper.properties 200B
gradlew.bat 2KB
entry
src
test
java
com
caojing
harmonyfrist
MainAbilityTest.java 136B
main
resources
base
media
jiantou.png 8KB
shuaxingengxin.png 5KB
icon.png 7KB
element
string.json 174B
graphic
button_element.xml 218B
layout
main_layout.xml 1KB
java
com
caojing
harmonyfrist
view
AnimLayer.java 3KB
CardView.java 4KB
GameView.java 15KB
MainAbility.java 360B
slice
MainAbilitySlice.java 9KB
entity
MPoint.java 437B
config.json 1KB
build.gradle 244B
.gitignore 7B
build.gradle 764B
.idea
vcs.xml 167B
misc.xml 268B
gradle.xml 582B
settings.gradle 17B
gradlew 5KB
共 26 条
- 1
资源评论
博士僧小星
- 粉丝: 1935
- 资源: 5894
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- DS-00437-GD25Q32E-Rev1.0
- 口袋方舟 v1.0.4
- FloEFD 2021版案例教程-01 球阀设计
- 一款极好用的 Office/WPS/Word/Excel/PPT/PDF工具箱软件 OfficeUtils 3.2
- vue项目开发综合实践笔记
- FloEFD 2021版案例教程-03 多孔介质
- 一款极好用的 Office/WPS/Word/Excel/PPT/PDF工具箱软件 OfficeUtils 3.1
- FloEFD 2021版案例教程-02 共轭传热
- java毕业设计+扫雷(程序)
- 一款极好用的 Office/WPS/Word/Excel/PPT/PDF工具箱软件 OfficeUtils 2.8
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功