手機(jī)中的小游戲是一種在日常生活中應(yīng)用廣泛的休閑軟件,無(wú)論是在超市商店,還是在辦公室,或是家庭都有著它的身影。隨著移動(dòng)互聯(lián)網(wǎng)和智能手機(jī)的不斷發(fā)展和進(jìn)步,當(dāng)今市場(chǎng)上已經(jīng)出現(xiàn)了多種簡(jiǎn)單輕松的小游戲,幾乎每一位智能手機(jī)的使用者都會(huì)在種類繁多的App網(wǎng)站上下載一些小游戲,這些數(shù)字小游戲可以使人們?cè)诰o張的工作節(jié)奏中很好地放松身心。
系統(tǒng)目標(biāo)
根據(jù)用戶對(duì)Android數(shù)字小游戲的使用要求:
通過(guò)鼠標(biāo)滑動(dòng)模擬上下左右。
操作簡(jiǎn)單,易于掌握,界面簡(jiǎn)潔清爽。
方便進(jìn)行游戲的觸摸操作。
要包含計(jì)分和游戲終止功能。
系統(tǒng)運(yùn)行穩(wěn)定,不能和手機(jī)固有軟件沖突,安全可靠。
結(jié)構(gòu)圖如下:
流程圖如下:
運(yùn)行環(huán)境
操作系統(tǒng):win10
開(kāi)發(fā)工具:Android Studio 2021.3.1
語(yǔ)言:java,xml
虛擬機(jī)設(shè)備設(shè)置:3.4 WQVGA API 30
項(xiàng)目的創(chuàng)建
項(xiàng)目名稱為:MiniGame。
添加模板選擇:empty Activity。
其余操作不變,選擇不帶中文的地址。點(diǎn)擊Finish,完成創(chuàng)建。
項(xiàng)目的實(shí)現(xiàn)
在我們編寫代碼之前,首先要制定好項(xiàng)目的系統(tǒng)文件夾的組織結(jié)構(gòu)目錄,分門別類地管理我們的項(xiàng)目資源,包括不同的界面、類、數(shù)據(jù)模型、圖片資源等,這樣不但可以保證系統(tǒng)開(kāi)發(fā)過(guò)程的規(guī)范性和程序員的可替代性,還有利于保證團(tuán)隊(duì)開(kāi)發(fā)的一致性。創(chuàng)建好系統(tǒng)的文件夾后,在開(kāi)發(fā)的過(guò)程中,只需要將我們新創(chuàng)建的類文件或者資源文件、腳本文件等保存到相應(yīng)的文件夾中即可。Android數(shù)字小游戲項(xiàng)目所使用的文件夾組織結(jié)構(gòu)如圖所示:
游戲主界面的實(shí)現(xiàn)
設(shè)計(jì)界面布局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:"/>
<!-- 動(dòng)態(tài)顯示分?jǐn)?shù)文本框 -->
<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>
邏輯的實(shí)現(xiàn)
由于小游戲涉及圖像的更新和分?jǐn)?shù)統(tǒng)計(jì),又要兼顧總體運(yùn)行。為了方便調(diào)試和修改,也為了更好地分工,采用三個(gè)java類文件實(shí)現(xiàn)對(duì)所有功能的編制。建立工程后,除默認(rèn)的主程序文件,即Android Studio工程界面中的java文件夾內(nèi)的"com.example.minigame"包中的"MainActivity.java"文件外,再創(chuàng)建兩個(gè)"Java Class",分別為“Card.java"和"GameView.java"。下面將三個(gè)文件分模塊解析。
實(shí)現(xiàn)主程序MainActivity
包含數(shù)字小游戲的初始化。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-773526.html
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;
}
});
//設(shè)計(jì)計(jì)時(shí)器timer并使用timer定時(shí)傳遞包含分?jǐn)?shù)信息的message,以便界面定時(shí)刷新分?jǐn)?shù)
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+"");
}
}
卡片文件Card.java的實(shí)現(xiàn)
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);
}
}
實(shí)現(xiàn)游戲交互文件GameView.java
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();
}
//游戲初始化函數(shù)。主要功能為游戲的輸入監(jiān)聽(tīng),并定義如何判斷用戶的游戲的輸入,關(guān)聯(lián)到相印的處理函數(shù)。
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;
}
});
}
//游戲觸摸響應(yīng)函數(shù)
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--) {
//當(dāng)同一行為空時(shí),不需處理
if (cards[x1][y].getNumber() > 0) {
if (cards[x][y].getNumber() < 2) {
//將前一張卡片的值移動(dòng)到當(dāng)前卡片
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++){
//當(dāng)同一行為空時(shí),不需處理
if(cards[x1][y].getNumber()> 0) {
if (cards[x][y].getNumber() < 2) {
//將前一張卡片的值移動(dòng)到當(dāng)前卡片
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--){
//當(dāng)同一行為空時(shí),不需處理
if(cards[x][y1].getNumber()>0){
if (cards[x][y].getNumber()< 2) {
//將前一張卡片的值移動(dòng)到當(dāng)前卡片
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();
}
}
//游戲結(jié)束判定以及判定處理
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();
}
}
//其他函數(shù)
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();
}
}
選擇合適的虛擬設(shè)備:
運(yùn)行程序:
得到每一步的步驟。
游戲結(jié)束時(shí),彈出提示框。
點(diǎn)擊yes或newgame重新游戲。
希望這些代碼對(duì)您有用。
感謝您的收看。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-773526.html
到了這里,關(guān)于【Android Studio】圖形化數(shù)字游戲,小游戲2048。的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!