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

安卓小游戏之2048相关推荐

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

    前一段时间开始学习安卓开发时,写了一个小游戏 2048 因为顺便学习了一下界面跳转,所以在主界面即游戏界面前还有一个界面作为欢迎界面. 主界面代码如下: import android.app.Acti ...

  2. gamebuino制作的小游戏之2048代码分析 loop部分

    if(gb.update()) {DrawBoard();for( int x = 0; x < 16; x++ ) {Board2048Old[x] = Board2048[x];} gb.u ...

  3. python编程小游戏代码-Python小游戏之300行代码实现俄罗斯方块

    前言 本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很 ...

  4. python小游戏源码-Python小游戏之300行代码实现俄罗斯方块

    Python小游戏之300行代码实现俄罗斯方块 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: Python小游戏之300行代码实现俄罗斯方块.txt ] (友情提示:右键点上 ...

  5. Android五子棋小游戏之UI篇

    最近一直在学习Android自定义View方面的知识,正好看到一个讲解制作五子棋小游戏的案例,遂学习一番,记录下学习过程,帮助那些有需要的人. 首先放上效果图: 下面我将带领大家一步步完成这个五子棋小 ...

  6. python编写小游戏代码_Python小游戏之300行代码实现俄罗斯方块

    Python小游戏之300行代码实现俄罗斯方块 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: Python小游戏之300行代码实现俄罗斯方块.txt ] (友情提示:右键点上 ...

  7. python制作小游戏之二2048最终章

    上一部分已经实现了2048游戏的核心规则内容,但是在我们移动了数字后,游戏界面并没有增加新的数字,所以我们需要在每次移动后,增加新的数字.同时如果按下按键,在按键方向上并没有可以移动的数字,那么此时不 ...

  8. python小游戏之二

    20行python代码的入门级小游戏 20行python代码的入门级小游戏_linmo8256的博客-CSDN博客_py游戏代码 猜数字小游戏python实现(可用来撩妹撩汉) 猜数字小游戏pytho ...

  9. python小游戏代码大全-Python小游戏之300行代码实现俄罗斯方块

    前言 本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很 ...

最新文章

  1. SharePoint 2007 系列(4) -Site Settings
  2. LeetCode每日一题:N叉树的层序遍历(No.429)
  3. 在git中出现中文乱码的解决方案
  4. 《Windows Phone 8 Development Internals》读书笔记-1-1-连载
  5. 碎片化学前端,融入到积极上进的环境,我推荐~
  6. linux lvm 磁盘管理
  7. oracle 远程tns配置
  8. 【matlab】ode45求解二阶微分方程,绘制曲线图 | 使用函数句柄的方法
  9. 【CCCC】L3-004 肿瘤诊断 (30分),三维BFS
  10. 用计算机画频率分布直方图,频率分布直方图
  11. 华为AC6605二层组网,配置无线漫游
  12. 百度翻译API接口的使用
  13. 计算机网络协议,以太网帧格式
  14. 【Java】我的世界Java版外挂制作 [4] - 移动类模块合集
  15. 人工智能专业就业方向盘点
  16. Android 4.0模拟器弹出---“谷歌拼音输入法”已停止运行的解决方法
  17. Ambari添加快速链接Quick Links
  18. 用手机制作pdf电子书
  19. 【H5】H5与APP对接跳转
  20. HDFS符号链接和硬链接

热门文章

  1. python算24点穷举法_24点游戏7节课–第1节-游戏介绍与基本算法 | 学步园
  2. 学习java可以做什么?
  3. 腾讯QQ体验版 for Macv8.4.10.73官方
  4. 自从会了爬虫妈妈再也不担心我不会植物分类啦
  5. 手机上怎么照证件照照片?教你两招轻松拍出证件照
  6. 大学计算机作业互评评语简短,同学作业互评评语
  7. 【办公必备软件】万彩办公大师教程丨PDF转HTML工具
  8. 微笑识别(HOG+SVM+opencv+python)
  9. zimbra 证书过期--zimbra使用
  10. python中assert是什么意思_你常常看到 Python 代码中的 assert 是个啥?