安卓小游戏之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 。
安卓小游戏之2048相关推荐
- 初学安卓:安卓小游戏之2048
前一段时间开始学习安卓开发时,写了一个小游戏 2048 因为顺便学习了一下界面跳转,所以在主界面即游戏界面前还有一个界面作为欢迎界面. 主界面代码如下: import android.app.Acti ...
- gamebuino制作的小游戏之2048代码分析 loop部分
if(gb.update()) {DrawBoard();for( int x = 0; x < 16; x++ ) {Board2048Old[x] = Board2048[x];} gb.u ...
- python编程小游戏代码-Python小游戏之300行代码实现俄罗斯方块
前言 本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很 ...
- python小游戏源码-Python小游戏之300行代码实现俄罗斯方块
Python小游戏之300行代码实现俄罗斯方块 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: Python小游戏之300行代码实现俄罗斯方块.txt ] (友情提示:右键点上 ...
- Android五子棋小游戏之UI篇
最近一直在学习Android自定义View方面的知识,正好看到一个讲解制作五子棋小游戏的案例,遂学习一番,记录下学习过程,帮助那些有需要的人. 首先放上效果图: 下面我将带领大家一步步完成这个五子棋小 ...
- python编写小游戏代码_Python小游戏之300行代码实现俄罗斯方块
Python小游戏之300行代码实现俄罗斯方块 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: Python小游戏之300行代码实现俄罗斯方块.txt ] (友情提示:右键点上 ...
- python制作小游戏之二2048最终章
上一部分已经实现了2048游戏的核心规则内容,但是在我们移动了数字后,游戏界面并没有增加新的数字,所以我们需要在每次移动后,增加新的数字.同时如果按下按键,在按键方向上并没有可以移动的数字,那么此时不 ...
- python小游戏之二
20行python代码的入门级小游戏 20行python代码的入门级小游戏_linmo8256的博客-CSDN博客_py游戏代码 猜数字小游戏python实现(可用来撩妹撩汉) 猜数字小游戏pytho ...
- python小游戏代码大全-Python小游戏之300行代码实现俄罗斯方块
前言 本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很 ...
最新文章
- SharePoint 2007 系列(4) -Site Settings
- LeetCode每日一题:N叉树的层序遍历(No.429)
- 在git中出现中文乱码的解决方案
- 《Windows Phone 8 Development Internals》读书笔记-1-1-连载
- 碎片化学前端,融入到积极上进的环境,我推荐~
- linux lvm 磁盘管理
- oracle 远程tns配置
- 【matlab】ode45求解二阶微分方程,绘制曲线图 | 使用函数句柄的方法
- 【CCCC】L3-004 肿瘤诊断 (30分),三维BFS
- 用计算机画频率分布直方图,频率分布直方图
- 华为AC6605二层组网,配置无线漫游
- 百度翻译API接口的使用
- 计算机网络协议,以太网帧格式
- 【Java】我的世界Java版外挂制作 [4] - 移动类模块合集
- 人工智能专业就业方向盘点
- Android 4.0模拟器弹出---“谷歌拼音输入法”已停止运行的解决方法
- Ambari添加快速链接Quick Links
- 用手机制作pdf电子书
- 【H5】H5与APP对接跳转
- HDFS符号链接和硬链接
热门文章
- python算24点穷举法_24点游戏7节课–第1节-游戏介绍与基本算法 | 学步园
- 学习java可以做什么?
- 腾讯QQ体验版 for Macv8.4.10.73官方
- 自从会了爬虫妈妈再也不担心我不会植物分类啦
- 手机上怎么照证件照照片?教你两招轻松拍出证件照
- 大学计算机作业互评评语简短,同学作业互评评语
- 【办公必备软件】万彩办公大师教程丨PDF转HTML工具
- 微笑识别(HOG+SVM+opencv+python)
- zimbra 证书过期--zimbra使用
- python中assert是什么意思_你常常看到 Python 代码中的 assert 是个啥?