赞
踩
手机中的小游戏是一种在日常生活中应用广泛的休闲软件,无论是在超市商店,还是在办公室,或是家庭都有着它的身影。随着移动互联网和智能手机的不断发展和进步,当今市场上已经出现了多种简单轻松的小游戏,几乎每一位智能手机的使用者都会在种类繁多的App网站上下载一些小游戏,这些数字小游戏可以使人们在紧张的工作节奏中很好地放松身心。
根据用户对Android数字小游戏的使用要求:
通过鼠标滑动模拟上下左右。
操作简单,易于掌握,界面简洁清爽。
方便进行游戏的触摸操作。
要包含计分和游戏终止功能。
系统运行稳定,不能和手机固有软件冲突,安全可靠。
结构图如下:
流程图如下:
操作系统:win10
开发工具:Android Studio 2021.3.1
语言:java,xml
虚拟机设备设置:3.4 WQVGA API 30
项目名称为:MiniGame。
添加模板选择:empty Activity。
其余操作不变,选择不带中文的地址。点击Finish,完成创建。
在我们编写代码之前,首先要制定好项目的系统文件夹的组织结构目录,分门别类地管理我们的项目资源,包括不同的界面、类、数据模型、图片资源等,这样不但可以保证系统开发过程的规范性和程序员的可替代性,还有利于保证团队开发的一致性。创建好系统的文件夹后,在开发的过程中,只需要将我们新创建的类文件或者资源文件、脚本文件等保存到相应的文件夹中即可。Android数字小游戏项目所使用的文件夹组织结构如图所示:
设计界面布局xml文件
<?xml version="1.0" encoding ="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context='.MainActivity'> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <!-- 提示文本框 --> <TextView android:id="@+id/tv_score_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:textColor="#000000" android:padding="8dp" android:text="You Score Is:"/> <!-- 动态显示分数文本框 --> <TextView android:id="@+id/tv_score_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:textColor="#000000" android:padding="10dp" android:text="0"/> <!-- 作为newgame按钮的文本框--> <TextView android:id="@+id/tv_newgame" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:textColor="#000000" android:paddingTop="8dp" android:paddingLeft="20dp" android:text="NEW Game"/> </LinearLayout> <com.example.minigame.GameView android:id="@+id/gv_show" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> </com.example.minigame.GameView> </LinearLayout>
由于小游戏涉及图像的更新和分数统计,又要兼顾总体运行。为了方便调试和修改,也为了更好地分工,采用三个java类文件实现对所有功能的编制。建立工程后,除默认的主程序文件,即Android Studio工程界面中的java文件夹内的"com.example.minigame"包中的"MainActivity.java"文件外,再创建两个"Java Class",分别为“Card.java"和"GameView.java"。下面将三个文件分模块解析。
包含数字小游戏的初始化。
package com.example.minigame; import android.app.Activity; import android.os.Bundle; import java.util.Timer; import java.util.TimerTask; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class MainActivity extends Activity { TextView score_show; GameView gv; TextView new_game; Handler handler=new Handler(){ @Override public void handleMessage(Message msg){ //TODO Auto-generated method stub super.handleMessage(msg); int num=msg.arg1; score_show.setText(num+""); } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); score_show=(TextView) findViewById(R.id.tv_score_show); gv=(GameView) findViewById(R.id.gv_show); new_game=(TextView)findViewById(R.id.tv_newgame); new_game.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { gv.GameStart(); gv.score=0; } }); //设计计时器timer并使用timer定时传递包含分数信息的message,以便界面定时刷新分数 Timer timer=new Timer(); timer.schedule(new TimerTask(){ @Override public void run(){ Message msg = new Message(); msg.arg1 = gv.score; handler.sendMessage(msg); } }, 80 , 150); score_show.setText(100+""); } }
package com.example.minigame; import android.content.Context; import android.view.Gravity; import android.widget.FrameLayout; import android.widget.TextView; public class Card extends FrameLayout{ private TextView text; private int number=0; public int getNumber(){ return number; } public void setNumber(int number){ this.number=number; if(number<2){ text.setText(""); }else{ if(number>=64){ text.setTextColor(0xffffff00); }else{ text.setTextColor(0xff000000); } text.setText(number+""); } } public Card(Context context){ super(context); //TODO Auto-generated constructor stub text=new TextView(context); text.setTextSize(28); text.setBackgroundColor(0x9966cccc); text.setGravity(Gravity.CENTER); LayoutParams params=new LayoutParams(-1,-1); params.setMargins(10,10,0,0); addView(text,params); } }
package com.example.minigame; import java.util.ArrayList; import java.util.List; import java.util.Random; import android.app.AlertDialog; import android.content.Context; import android.graphics.Point; import android.content.DialogInterface; import android.graphics.Point; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.GridLayout; //初始化单元 public class GameView extends GridLayout{ private Card cards[][]=new Card[4][4]; private List<Point>emptyCards=new ArrayList<>(); Random rd=new Random(); int score=0; public GameView(Context context){ super(context); //TODO Auto-generated constructor stub initGame(); } public GameView(Context context,AttributeSet attrs){ super(context,attrs); //TODO Auto-generated constructor stub initGame(); } public GameView(Context context,AttributeSet attrs,int defStyle){ super(context,attrs,defStyle); //TODO Auto-generated constructor stub initGame(); } //游戏初始化函数。主要功能为游戏的输入监听,并定义如何判断用户的游戏的输入,关联到相印的处理函数。 private void initGame(){ setColumnCount(4); setBackgroundColor(0xffffcccc); setOnTouchListener(new OnTouchListener() { private float startX,startY; private float offsetX,offsetY; @Override public boolean onTouch(View v,MotionEvent event) { //TODO Auto-generated method stub switch (event.getAction()){ case MotionEvent.ACTION_DOWN: startX=event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_UP: Gameover() ; offsetX = event.getX()-startX; offsetY = event.getY()-startY; if (Math.abs (offsetX) > Math.abs (offsetY)) { if (offsetX < -3) { moveLeft() ; System.out.println("----左"); } else if (offsetX > 3) { moveRight(); System.out.println("----右"); } } else { if (offsetY < -3) { moveUp(); System.out.println("----上"); } else if (offsetY > 3){ moveDown(); System.out.println("----下"); } } break; default: break; } return true; } }); } //游戏触摸响应函数 private void moveRight() { boolean flage = false; for (int y = 0; y < 4; y++) { for (int x = 3; x >= 0;x--) { for (int x1 = x - 1; x1 >= 0; x1--) { //当同一行为空时,不需处理 if (cards[x1][y].getNumber() > 0) { if (cards[x][y].getNumber() < 2) { //将前一张卡片的值移动到当前卡片 cards[x][y].setNumber(cards[x1][y].getNumber()); cards[x1][y].setNumber(0); x++; flage = true; score += 2; } else if (cards[x][y].getNumber() == cards[x1][y].getNumber()) { cards[x][y].setNumber(cards[x][y].getNumber() * 2); score += cards[x][y].getNumber(); cards[x1][y].setNumber(0); flage = true; } break; } } } } if (flage) { creatRandomCard(); } } private void moveLeft(){ boolean flage = false; for(int y =0;y<4;y++){ for(int x=0;x<4;x++){ for(int x1=x+1;x1<4;x1++){ //当同一行为空时,不需处理 if(cards[x1][y].getNumber()> 0) { if (cards[x][y].getNumber() < 2) { //将前一张卡片的值移动到当前卡片 cards[x][y].setNumber(cards[x1][y].getNumber()); cards[x1][y].setNumber(0); x--; flage = true; score += 2; } else if (cards[x][y].getNumber() == cards[x1][y].getNumber()) { cards[x][y].setNumber(cards[x][y].getNumber() * 2); score += cards[x][y].getNumber(); cards[x1][y].setNumber(0); flage = true; } break; } } } } if(flage) { creatRandomCard(); } } private void moveDown(){ boolean flage = false; for(int x=0;x<4;x++){ for (int y =3;y>=0;y--){ for (int y1=y-1;y1>= 0;y1--){ //当同一行为空时,不需处理 if(cards[x][y1].getNumber()>0){ if (cards[x][y].getNumber()< 2) { //将前一张卡片的值移动到当前卡片 cards[x][y].setNumber(cards[x][y1].getNumber()); cards[x][y1].setNumber(0); y++; flage = true; score += 2; } else if(cards[x][y].getNumber()== cards[x][y1].getNumber()){ cards[x][y].setNumber(cards[x][y].getNumber()* 2); score +=cards[x][y].getNumber(); cards[x][y1].setNumber(0); flage = true; } break; } } } } if(flage){ creatRandomCard(); } } private void moveUp(){ boolean flage = false; for(int x=0;x<4;x++){ for(int y=0;y<4;y++){ for(int y1=y+1;y1<4;y1++){ if(cards[x][y1].getNumber()> 0){ if(cards[x][y].getNumber()<2){ cards[x][y].setNumber(cards[x][y1].getNumber()); cards[x][y1].setNumber(0); y--; flage = true; score+=2; } else if(cards[x][y].getNumber()== cards[x][y1].getNumber()) { cards[x][y].setNumber(cards[x][y].getNumber() * 2); score += cards[x][y].getNumber(); cards[x][y1].setNumber(0); flage = true; } break;} } } } if(flage) { creatRandomCard(); } } //游戏结束判定以及判定处理 private void Gameover(){ boolean OverGame=true; for (int y=0;y<4;y++) { for (int x = 0; x < 4; x++) { if (cards[x][y].getNumber() <= 0 || (x > 0 && cards[x][y].getNumber() == cards[x - 1][y].getNumber()) || (x < 3 && cards[x][y].getNumber() == cards[x + 1][y].getNumber()) || (y > 0 && cards[x][y].getNumber() == cards[x][y - 1].getNumber()) || (y < 3 && cards[x][y].getNumber() == cards[x][y + 1].getNumber())) { OverGame = false; } } } if(OverGame){ new AlertDialog.Builder(getContext()).setTitle("hi").setMessage("again"). setPositiveButton("yes",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which){ //TODO Auto-generated method stub GameStart(); score = 0; } }).setNegativeButton("No", null).show(); } } //其他函数 private void AddCard(int width, int height) { Card c; for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { c = new Card(getContext()); cards[x][y] = c; c.setNumber(0); addView(c, width, height); } } } @Override protected void onSizeChanged(int w,int h,int oldw,int oldh) { //TODO Auto-generated method stub super.onSizeChanged(w, h, oldw, oldh); int width = (w - 10) / 4; AddCard(width, width); GameStart(); } private void creatRandomCard() { emptyCards.clear(); for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if (cards[x][y].getNumber() < 2) { Point point = new Point(x, y); emptyCards.add(point); } } } int selat = rd.nextInt(emptyCards.size()); Point p = emptyCards.get(selat); emptyCards.remove(selat); int number = 0; if (rd.nextInt(10) > 4) { number = 4; } else number = 2; cards[p.x][p.y].setNumber(number); } public void GameStart() { for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { cards[x][y].setNumber(0); } } creatRandomCard(); creatRandomCard(); } }
选择合适的虚拟设备:
运行程序:
得到每一步的步骤。
游戏结束时,弹出提示框。
点击yes或newgame重新游戏。
希望这些代码对您有用。
感谢您的收看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。