初学安卓:安卓小游戏之2048

前一段时间开始学习安卓开发时,写了一个小游戏 2048

因为顺便学习了一下界面跳转,所以在主界面即游戏界面前还有一个界面作为欢迎界面。

主界面代码如下:

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {
	private ImageView im;
	private int width,height;
	private Button bu;
	private TextView scoreText;
	private int[][] arr = new int[4][4];
	private int score;
	private RelativeLayout LLayout;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		bu = (Button)this.findViewById(R.id.button1);
		
		im  = (ImageView)this.findViewById(R.id.im);
		
		scoreText = (TextView)this.findViewById(R.id.textView5);
		
		LLayout = (RelativeLayout)this.findViewById(R.id.inearLayout);
		
		

		//创建监听器类对象,且添加监听器
		Listener l = new Listener();
		im.setOnTouchListener(l);
		bu.setOnTouchListener(l);
		l.setImageView(im);
		l.setButton(bu);
		l.setArr(arr);
		l.setScoreText(scoreText);
		l.setMainActivity(this);
		l.setLinearLayout(LLayout);
		//不需要在此创建Arr对象 因为Arr是在Listener 类中使用
//		getIntent(){
//			
//		}
		Intent intent1 =  this.getIntent();
		Toast t = Toast.makeText(this, "欢迎"+intent1.getStringExtra("UserName"), Toast.LENGTH_SHORT);
		t.show();
		
		
		
	}
	public void setScore(int score){
		this.score = score;
	}
	
	
	public void onBackPressed(){
		//a2.setMainActivity(this);
		Intent intent1 = new Intent();
	//	this.setResult(resultCode, data);
		super.onBackPressed();
		Toast toast = Toast.makeText(this, "当前分数"+score, Toast.LENGTH_LONG);
		toast.show();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	

}

欢迎界面代码如下:

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.Button;

public class SecondActivity extends Activity {

	private Listener l;
	
	public void setListener(Listener l){
		this.l = l;
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		Button bu1 = (Button)this.findViewById(R.id.button2);
		Listener l2 = new Listener();
		bu1.setOnClickListener(l2);
		l2.setButton1(bu1);
		l2.setSecondActivity(this);
	}

	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.second, menu);
		return true;
	}

}

使用一个4*4的数组存储游戏的数据,即每个格子中的数字 数组代码如下:

import java.util.Random;

import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;


public class Arr {
	private TextView scoreText;
	private int score;
	private int[][] arr;
	private int x,y;
	private MainActivity MActivity;
	
	public void setMainActivity(MainActivity MActivity){
		this.MActivity = MActivity;
	}
	
	
	public void setScoreText(TextView scoreText){
		this.scoreText = scoreText;
	}
	
	public void setArr(int[][] arr){
		this.arr=arr;
	}
	public int[][] getArr(){
		return arr;
	}
	
	public void CreateRandom(int[][] arr){	
		boolean flag = false;
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr.length;j++){
				if(arr[i][j]==0){
					flag = true;
					break;
				}
			}
		}
		while(flag){
			Random random = new Random();
			x=random.nextInt(4);
			y=random.nextInt(4);
			if(arr[x][y]==0){
				arr[x][y]=2;
				break;
			}
		}
	}
	public int[][] InitArr(int[][] arr){
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				arr[i][j]=0;
			}
		}
		CreateRandom(arr);
	//	s.calculateScore(arr);
		return arr;
	}
	
	//移除上方空格
	public void RemoveUpBlank(int[][] arr){
		int i,j,k;  
	    for(j=0;j<arr.length;j++){  
	        for(i=1;i<arr.length;i++){  
	            k=i;  
	            while(k-1>=0&&arr[k-1][j]==0){//上面的那个为空   
	               //swap(arr[k][j],arr[k-1][j]);
	            	int temp = arr[k][j];
	            	arr[k][j]=arr[k-1][j];
	            	arr[k-1][j]=temp;
	                k--;    
	            }  
	        }  
	    }  
	}
	//移除下方空格
	public void RemoveDownBlank(int[][] arr){
		 int i,j,k;  
		    for(j=0;j<4;j++){  
		        for(i=2;i>=0;i--){  
		            k=i;  
		            while(k+1<=3&&arr[k+1][j]==0){//下面的那个为空   
		               // swap(a[k][j],a[k+1][j]);  
		            	int temp = arr[k+1][j];
		            	arr[k+1][j] = arr[k][j];
		            	arr[k][j] = temp;
		                k++;      
		            }  
		        }  
		    }  
	}
	
	//移除右边空格
	public void RemoveRightBlank(int[][] arr){
		int i,j,k;  
	    for(i=0;i<4;i++){
	        for(j=2;j>=0;j--){
	            k=j;  
	            while(k+1<=3&&arr[i][k+1]==0){//右面的那个为空   
	               // swap(a[k][j],a[k+1][j]);  
	            	int temp = arr[i][k+1];
	            	arr[i][k+1] = arr[i][k];
	            	arr[i][k] = temp;
	                k++;      
	            }  
	        }  
	    }  
	}
	//移除左边空格
	public void RemoveLeftBlank(int[][] arr){
		int i,j,k;  
	    for(i=0;i<4;i++){  
	        for(j=1;j<4;j++){  
	            k=j;  
	            while(k-1>=0&&arr[i][k-1]==0){//左面的那个为空   
	               // swap(a[i][k],a[i][k-1]);
	            	int temp = arr[i][k-1];
	            	arr[i][k-1]=arr[i][k];
	            	arr[i][k]=temp;
	                k--;  
	            }     
	        }  
	    }   
	}
	public int[][] ChangeArrRight(int[][] arr){
		for(int i=0;i<4;i++){
			for(int j=3;j>0;j--){
				if(arr[i][j]==arr[i][j-1]){
					arr[i][j]+=arr[i][j-1];
					arr[i][j-1]=0;
					RemoveRightBlank(arr);
				}
			}
		}
		CreateRandom(arr);
		CalculateScore(arr);
		judge(arr);
	//	s.calculateScore(arr);
		return arr;
	}
	public int[][] ChangeArrLeft(int[][] arr){
		for(int i=0;i<4;i++){
			for(int j=0;j<3;j++){
				if(arr[i][j]==arr[i][j+1]){
					arr[i][j]+=arr[i][j+1];
					arr[i][j+1]=0;
					RemoveLeftBlank(arr);
				}
			}
		}
		CreateRandom(arr);
		CalculateScore(arr);
		judge(arr);
//		s.calculateScore(arr);
		return arr;
	}
	public int[][] ChangeArrDown(int[][] arr){
		for(int j=0;j<4;j++){
			for(int i=3;i>0;i--){
				if(arr[i][j]==arr[i-1][j]){
					arr[i-1][j]+=arr[i][j];
					arr[i][j]=0;
					RemoveDownBlank(arr);
				}
			}
		}
		CreateRandom(arr);
		CalculateScore(arr);
		judge(arr);
	//	s.calculateScore(arr);
		return arr;
	}

	public int[][] ChangeArrUp(int[][] arr){
		for(int j=0;j<4;j++){
			for(int i=0;i<3;i++){
				if(arr[i][j]==arr[i+1][j]){
					arr[i][j]+=arr[i+1][j];
					arr[i+1][j]=0;
					RemoveUpBlank(arr);
				}
			}
		}
		CreateRandom(arr);
		CalculateScore(arr);
		judge(arr);
	//	s.calculateScore(arr);
		return arr;
	}
	public void CalculateScore(int[][] arr){
		
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr.length;j++){
				score = score + arr[i][j];
			}
		}
		
		MActivity.setScore(score);
		String sc = Integer.toString(score); 
		scoreText.setText(sc);
		score=0;
	//	return score;
	}
	public void judge(int[][] arr){
		boolean flag=false;
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr.length;j++){
				if(arr[i][j] == 0){
					flag = true;
					break;
				}
			}
		}
		for(int i=1;i<arr.length;i++){
			for(int j=0;j<arr.length;j++){
				if(arr[i][j] == arr[i-1][j]){
					flag = true;
					break;
				}
			}
		}
		for(int i=0;i<arr.length;i++){
			for(int j=1;j<arr.length;j++){
				if(arr[i][j] == arr[i][j-1]){
					flag = true;
					break;
				}
			}
		}
		if(flag == false){
			Log.i("judge", "over");
			Toast t2 = Toast.makeText(MActivity, "游戏结束!", Toast.LENGTH_SHORT);
			t2.show();
		}
	}
}

游戏的界面需要用画出来,画界面的代码如下:

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class Draw {
	private ImageView im;
	private int[][] arr;
	private Bitmap bitmap;
	private Canvas canvas;
	private Paint p;
	private int width,height,score;
	float c=(float) 50.0;
	private TextView scoreText;

	public void setScoreText(TextView scoreText){
		this.scoreText = scoreText;
	}
	
	public void setImageView(ImageView im){
		this.im = im;
	}
	public void setArr(int[][] arr){
		this.arr = arr;
	}
	
	public void setBitmap(Bitmap bitmap) {
		this.bitmap = bitmap;
	}
	public void setCanvas(Canvas canvas) {
		this.canvas = canvas;
	}
	public void setP(Paint p) {
		this.p = p;
	}
	
	
	public void paintF(int[][] arr){
		if(bitmap==null){
			bitmap = Bitmap.createBitmap(im.getWidth(), im.getHeight(), Config.ARGB_8888);
			canvas = new Canvas(bitmap);
			p = new Paint();
			width=bitmap.getWidth();
			height=bitmap.getHeight();
			im.setImageBitmap(bitmap);
		}
		//im.setImageBitmap(bitmap);
		
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				switch(arr[i][j]){
					case 0:
						//p.setColor(Color.GRAY);
						p.setColor(Color.argb(100, 0, 0, 0));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("0",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("0",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						
						break;
					case 2:
						//p.setColor(Color.BLUE);
						p.setColor(Color.argb(100, 0, 0, 255));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("2",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("2",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 4:
						//p.setColor(Color.GREEN);
						p.setColor(Color.argb(100, 0, 255, 0));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("4",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("4",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 8:
						//p.setColor(Color.RED);
						p.setColor(Color.argb(100, 255, 0, 0));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("8",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("8",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 16:
						//p.setColor(Color.YELLOW);
						p.setColor(Color.argb(100, 255, 255, 0));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("16",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("16",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 32:
						p.setColor(Color.argb(100,150, 50, 50));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("32",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("32",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 64:
						p.setColor(Color.argb(100,100,100 , 0));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("64",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("64",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 128:
						p.setColor(Color.argb(100,150, 150, 0));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("128",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("128",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 256:
						p.setColor(Color.argb(100,50, 150, 50));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("256",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("256",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 512:
						p.setColor(Color.argb(100,50, 200, 10));
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("512",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("512",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
					case 1024:
						p.setColor(Color.WHITE);
						canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
						p.setColor(Color.BLACK);
						p.setTextSize(50);
						if(i==0){
							canvas.drawText("1024",(float)(j*width/3.5), (float)(100), p);
						}else{
							canvas.drawText("1024",(float)(j*width/3.5), (float)(i*height/3), p);
						}
						break;
				}
				score = score+arr[i][j];
				
			//	scoreText.setText("12");
//				p.setColor(Color.rgb(100, 100, 0));
//				canvas.drawRect(j*width/4+1, i*height/4+1, (j+1)*width/4-1, (i+1)*height/4-1, p);
			}
		}
		//scoreText.setText(score);
	}

}

监听器代码如下:

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class Listener implements OnTouchListener,OnClickListener{
	
	private ImageView im;
	private Button bu;
	private Button bu1;
	private TextView scoreText;
	private int[][] arr;
	private int[][] arr2;
	private Bitmap bitmap;
	private Canvas canvas;
	private Paint p;
	private Activity SActivity;
	private int width,height;
	private MainActivity MActivity;
	private float x1,y1,x2,y2;
	private RelativeLayout LLayout;
	
	public void setLinearLayout(RelativeLayout LLayout){
		this.LLayout = LLayout;
	}
	
	public void setMainActivity(MainActivity MActivity){
		this.MActivity = MActivity;
	}
	public void setImageView(ImageView im){
		this.im = im;
	}
	public void setButton(Button bu){
		this.bu = bu;
	}
	public void setButton1(Button bu1){
		this.bu1 = bu1;
	}
	public void setArr(int[][] arr){
		this.arr = arr;
	}
	public void setScoreText(TextView scoreText){
		this.scoreText = scoreText;
	}
	public void setSecondActivity(Activity SActivity){
		this.SActivity = SActivity;
	}
	
	//创建Arr类对象 并传值   有必要吗?
	Arr ar = new Arr();
	//		ar.setArr(arr);
	
	
	@Override
	public boolean onTouch(View v, MotionEvent e) {
		// TODO Auto-generated method stub
		
		//创建Arr类对象 并传值   有必要吗?
//		Arr ar = new Arr();
		ar.setArr(arr);
		ar.setScoreText(scoreText);
		ar.setMainActivity(MActivity);
		//创建Draw类对象,并传值
		Draw dr = new Draw();
		dr.setBitmap(bitmap);
		dr.setCanvas(canvas);
		dr.setImageView(im);
		dr.setP(p);
		
//		if(v==bu1){
//			Intent intent = new Intent();
//			intent.setClass(SActivity, MainActivity.class);
//			intent.putExtra("UserName", "aaaaa");
//			SActivity.startActivityForResult(intent, 11);
//			Log.i("on2048", "started");
			Toast t = Toast.makeText(SActivity, "欢迎", Toast.LENGTH_SHORT);
			t.show();
//		}
		if(v==bu){
			arr=ar.InitArr(arr);
			dr.setArr(arr);
			dr.paintF(arr);
		}
		if(e.getAction()==MotionEvent.ACTION_DOWN){
			x1=e.getX();
			y1=e.getY();
		}
		if(e.getAction()==MotionEvent.ACTION_UP){
			x2=e.getX();
			y2=e.getY();
			//像右滑
			if(x2-x1>200){
				arr2=ar.ChangeArrRight(arr);
				dr.paintF(arr2);
				LLayout.setBackgroundResource(R.drawable.dfbj2);
			}
			//向左滑
			if(x2-x1<-200){
				arr2=ar.ChangeArrLeft(arr);
				dr.paintF(arr2);
				LLayout.setBackgroundResource(R.drawable.dfbj3);
			}
			//向下滑
			if(y2-y1>200){
				arr2=ar.ChangeArrDown(arr);
				dr.paintF(arr2);
				LLayout.setBackgroundResource(R.drawable.dfbj4);
			}
			//向上滑
			if(y2-y1<-200){
				arr2=ar.ChangeArrUp(arr);
				dr.paintF(arr2);
				LLayout.setBackgroundResource(R.drawable.dfbj5);
			}
		}
		
		
		
		return true;
	}
	@Override
	public void onClick(View v) {
		//LinearLayout l;
		
		// TODO Auto-generated method stub
		if(v.getId()==R.id.button2){
			Intent intent = new Intent();
			intent.setClass(SActivity, MainActivity.class);
			intent.putExtra("UserName", "aaaaa");
			SActivity.startActivityForResult(intent, 11);
			Log.i("on2048", "started");
//			Toast t = Toast.makeText(SActivity, "欢迎", Toast.LENGTH_SHORT);
//			t.show();
		}
	}

}

注意OnTouchListener在手触摸时算一下,在离开时也算了一下,所以 刚开始时会界面跳转两次,后来改为OnClickListener 。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值