在GameView中新建方法动态改变卡片的宽高,适应所有屏幕。
@Override
protectedvoid onSizeChanged(int w, int h, int oldw, int oldh) {
//TODO Auto-generated method stub
super.onSizeChanged(w,h, oldw, oldh);
//因为游戏的界面是正方形,选取屏幕最小的长或宽作为正方形的边长
//空隙是10,除以4是每一个卡片
intcardWidth = (Math.min(w, h)-10)/4;
addCard(cardWidth,cardWidth);//添加卡片的方法,正方形宽高一样
startGame();//当卡片都构建完成之后开始游戏
}
并且在AndroidManifest.XML文件中添加方法使手机屏幕只能竖直放置不能水平放置。
在activity中添加如下代码:
android:screanOrientation=”portrait”
在GameView中新建添加卡片方法。
private Card[][] cardsmap = newCard[4][4];//初始化一个卡片数组,方便操作,记录方阵
private void addCard(int cardWidth,intcardHeight){
Cardc;
for(int y = 0; y <4; y++) {
for(int x = 0; x < 4; x++) {
c=newCard(getContext());
c.setNum(0);//初始化添加0
addView(c,cardHeight,cardWidth);
cardsmap[x][y]=c;//将遍历的数组赋值,存储
}
}
}
在GameView中新建开始游戏方法
public void startGame(){
MainActivity.getMainActivity().clearScore();//首先先清除所有的数据
for(int y = 0; y < 4; y++) {
for(int x = 0; x < 4; x++) {
cardsmap[x][y].setNum(0);//先将所有的卡片赋值为0,0表示的是空字符串
}
}
addRandomNum();//添加随机数,因为游戏初始化有两个卡片有值,所以调用两次
addRandomNum();
}
在GameView中新建随机数方法。
private List<Point> emptyPoints=newArrayList<Point>();//定义空点的集合
private void addRandomNum(){
emptyPoints.clear();//先将集合清空
//先对所有值进行遍历
for(int y = 0; y < 4; y++) {
for(int x = 0; x < 4; x++) {
//如果卡片的值是空值,才能赋值
if(cardsmap[x][y].getNum()<=0) {
emptyPoints.add(newPoint(x,y));
}
}
}
//选择一个点,随机移除点
Pointp=emptyPoints.remove((int)(Math.random()*emptyPoints.size()));
//符合的赋值为2否则为4,两者的概论为9:1
cardsmap[p.x][p.y].setNum(Math.random()>0?2:4);
}
数组和集合的区别:
http://www.cnblogs.com/summers/p/4094260.html
http://cping1982.blog.51cto.com/601635/130062/
在GameView中新建滑动方法,此处以向左滑动为例
private void swipeLeft(){
for(int y = 0; y < 4; y++) {
for(int x = 0; x < 4; x++) {
//从右向左遍历
for(int x1 = x+1; x1 < 4; x1++) {
//当遍历的卡片不为空时
if(cardsmap[x1][y].getNum()>0) {
//当左边的卡片为0时要向左边移动,然后将右边的值赋给左边,右边的值清零
if(cardsmap[x][y].getNum()<=0) {
cardsmap[x][y].setNum(cardsmap[x1][y].getNum());
cardsmap[x1][y].setNum(0);
x--;//遍历所有的情况,继续移动,使所有的能移动的都移动
morge=true;//有动作
}//如果两个卡片的值相等,则左边的值*2,然后右边的值赋零
elseif (cardsmap[x1][y].equals(cardsmap[x][y])) {
cardsmap[x][y].setNum(cardsmap[x][y].getNum()*2);
cardsmap[x1][y].setNum(0);
MainActivity.getMainActivity().addScore(cardsmap[x][y].getNum());//合并添加分数
morge=true;
}
break;//循环遍历之后要跳出
}
}
}
}
//如果有动作的话,则新增一个卡片
if(morge) {
addRandomNum();
chackComplete();//判断是否结束
}
}
向右滑动。
private void swipeLeft(){
for(int y = 0; y < 4; y++) {
for(int x = 0; x < 4; x++) {
//从右向左遍历
for(int x1 = x+1; x1 < 4; x1++) {
//当遍历的卡片不为空时
if(cardsmap[x1][y].getNum()>0) {
//当左边的卡片为0时要向左边移动,然后将右边的值赋给左边,右边的值清零
if(cardsmap[x][y].getNum()<=0) {
cardsmap[x][y].setNum(cardsmap[x1][y].getNum());
cardsmap[x1][y].setNum(0);
x--;//遍历所有的情况,继续移动,使所有的能移动的都移动
morge=true;//有动作
}//如果两个卡片的值相等,则左边的值*2,然后右边的值赋零
elseif (cardsmap[x1][y].equals(cardsmap[x][y])) {
cardsmap[x][y].setNum(cardsmap[x][y].getNum()*2);
cardsmap[x1][y].setNum(0);
MainActivity.getMainActivity().addScore(cardsmap[x][y].getNum());//合并添加分数
morge=true;
}
break;//循环遍历之后要跳出
}
}
}
}
//如果有动作的话,则新增一个卡片
if(morge) {
addRandomNum();
chackComplete();//判断是否结束
}
}
新建判断是否结束方法。
private boolean morge=false;//定义判断有动作,默认为false
private void chackComplete(){
booleancomplete=true;
All:
for(int y = 0; y < 4; y++) {
for(int x = 0; x < 4; x++) {
<span style="white-space:pre"> </span>//判断的标准就是1、有卡片的值是空,2、是上下左右相邻的卡片相同x>0往左判断 x<3往右判断 y>0往下判断 y<0往上判断
if(cardsmap[x][y].getNum()==0||
(x>0)&&(cardsmap[x][y].equals(cardsmap[x-1][y]))||
(x<3)&&(cardsmap[x][y].equals(cardsmap[x+1][y]))||
(y>0)&&(cardsmap[x][y].equals(cardsmap[x][y-1]))||
(y<3)&&(cardsmap[x][y].equals(cardsmap[x][y+1]))){
complete=false;
breakAll;
}
}
}
if(complete) {
newAlertDialog.Builder(getContext()).setTitle("您好").setMessage("游戏结束").
setPositiveButton("重新开始游戏",new DialogInterface.OnClickListener() {
@Override
publicvoid onClick(DialogInterface dialog, int which) {
startGame();
}
}).show();
}
}