前一段时间开始学习安卓开发时,写了一个小游戏 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 。