android游戏_android游戏开发 - CSDN
精华内容
参与话题
  • Android ——游戏开发之文字冒险游戏

    千次阅读 热门讨论 2019-08-29 20:21:36
    Android 游戏开发之文字冒险游戏 文字冒险游戏—迷雾森林 文字冒险游戏以软件模拟情境,令玩家使用文字指令控制角色,以影响周边的情境。迷雾森林是使用Android Studio开发的按钮点击式游戏。通过按钮点击实现全部...

    Android 游戏开发之文字冒险游戏

    文字冒险游戏—迷雾森林

    文字冒险游戏以软件模拟情境,令玩家使用文字指令控制角色,以影响周边的情境。迷雾森林是使用Android Studio开发的按钮点击式游戏。通过按钮点击实现全部操作,只涉及Android基础知识。

    运行界面

    界面1界面2
    界面3界面4
    界面5界面6

    源代码

    (1)Java文件:MainActivity

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //"开始游戏"按钮监听
            Button button1=findViewById(R.id.button1);
            button1.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) { //点击“开始游戏”跳转到DengLu的Activity
            switch (v.getId()) {
                case R.id.button1: {
                    Intent intent=new Intent();
                    intent.setClass(MainActivity.this,DengLu.class);
                    startActivity(intent);
                }
            }
        }
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            String tag = intent.getStringExtra("EXIT_TAG");
            if (tag != null&& !TextUtils.isEmpty(tag)) {
                if ("SINGLETASK".equals(tag)) {//退出程序
                    finish();
                }
            }
        }
    }
    

    (2)布局文件:MainActivity.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <ImageView
            android:src="@drawable/z00"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="开始游戏"
                android:layout_marginLeft="150dp"
                android:layout_marginTop="490dp"
                />
        </RelativeLayout>
    
    </android.support.constraint.ConstraintLayout>
    

    (3)Java文件:DengLu

    public class DengLu extends AppCompatActivity implements View.OnClickListener {
        EditText editText;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.denglu);
            Button button1=findViewById(R.id.button1);
            button1.setOnClickListener(this);
            editText=findViewById(R.id.edittext);
        }
    
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button1: {
                    Intent intent = new Intent();
                    Bundle bundle=new Bundle();
                    //获取编辑框输入内容,赋值给Shuju类中z
                    Shuju.z=editText.getText().toString();
                    //点击跳转到Xingzou的Activity
                    intent.setClass(DengLu.this,Xingzou.class);
                    startActivity(intent);
                }
                break;
            }
        }
    }
    

    (4)Java文件:Shuju

    public class Shuju {
        //定义静态变量
        public static String z;
        public static int x=100;
        public static int y=100;
        public static int q=0;
    }
    

    (5)布局文件:denglu.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/tp"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="100dp"
                android:layout_marginTop="50dp"
                android:width="200dp"
                android:singleLine="false"
                android:text="年轻的冒险者,在进入森林之前,告诉我你的名字!"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <EditText
                android:id="@+id/edittext"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="120dp"
                android:layout_marginTop="300dp"
                android:inputType="text"
                android:hint="我的名字:"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="进入森林"
                android:layout_marginLeft="150dp"
                android:layout_marginTop="440dp"
                />
        </LinearLayout>
    </android.support.constraint.ConstraintLayout>
    

    (6)Java文件:Xingzou

    public class Xingzou extends AppCompatActivity implements View.OnClickListener {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.xingzou);
            Button button1=findViewById(R.id.button1);
            button1.setOnClickListener(this);
            Button button2=findViewById(R.id.button2);
            button2.setOnClickListener(this);
            Button button3=findViewById(R.id.button3);
            button3.setOnClickListener(this);
            //播放音乐
            final MediaPlayer player=MediaPlayer.create(this,R.raw.zhuti);
            player.start();
            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    player.start();
                }
            });
            TextView textView1 = findViewById(R.id.textView1);
            //显示关卡
            textView1.setText(Shuju.z);
            TextView textView2 = findViewById(R.id.textView5);
            TextView textView3 = findViewById(R.id.textView4);
            //显示生命和意志
            textView2.setText(Shuju.x+"");
            textView3.setText(Shuju.y+"");
        }
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button1: {
                    Intent intent=new Intent();
                    //产生随机数
                    double zz=Math.random()*10;
                    //判断随机数大小,产生跳转
                    if (zz>5) {
                        intent.setClass(Xingzou.this,Lang.class);
                    }else {
                        intent.setClass(Xingzou.this,Lei.class);
                    }
                    startActivity(intent);
                }
                break;
                case R.id.button2: {
                    Intent intent=new Intent();
                    intent.setClass(Xingzou.this,She.class);
                    startActivity(intent);
                }
                break;
                case R.id.button3:{
                    Intent intent = new Intent();
                    intent.setClass(Xingzou.this, Nuwu.class);
                    startActivity(intent);
                }
                break;
            }
        }
    }
    

    (7)布局文件xingzou.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/zzx"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:layout_marginTop="50dp"
                android:text="name"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="100dp"
                android:layout_marginTop="50dp"
                android:singleLine="false"
                android:text="生命:"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="200dp"
                android:layout_marginTop="50dp"
                android:singleLine="false"
                android:text="意志:"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="250dp"
                android:layout_marginTop="50dp"
                android:singleLine="false"
                android:text="100"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="150dp"
                android:layout_marginTop="50dp"
                android:singleLine="false"
                android:text="100"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="向左"
                android:layout_marginLeft="0dp"
                android:layout_marginTop="440dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="前进"
                android:layout_marginLeft="150dp"
                android:layout_marginTop="440dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="向右"
                android:layout_marginLeft="300dp"
                android:layout_marginTop="440dp"
                />
        </LinearLayout>
    </android.support.constraint.ConstraintLayout>
    

    (8)Java文件:Lang

    public class Lang extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.lang);
            //播放音乐
            MediaPlayer player=MediaPlayer.create(this,R.raw.lang);
            player.start();
            //关卡数加1
            Shuju.q=Shuju.q+1;
            //定时器3秒,自动跳转
            Timer timer = new Timer();
            timer.schedule(new MyTask(),3000);
        }
        class MyTask extends TimerTask {
            @Override
            public void run() {
                Intent intent;
                //判断关卡数是否达到20,达到跳转结束页面,否则跳转对应事件页面
                if (Shuju.q==20) {
                    intent = new Intent(Lang.this,Over.class);
                    startActivity(intent);
                }else {
                    intent = new Intent(Lang.this,Lang0.class);
                    startActivity(intent);
                }
            }
        }
    }
    

    (9)布局文件:lang.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/q1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
    </android.support.constraint.ConstraintLayout>
    

    (10)Java文件:Lang0

    public class Lang0 extends AppCompatActivity implements View.OnClickListener {
        int a=-10,b=-5;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.js);
            TextView textView = findViewById(R.id.textView);
            //显示文字内容
            textView.setText("你遭遇了恶狼");
            TextView textView1 = findViewById(R.id.textView3);
            textView1.setText(a+"");
            TextView textView2 = findViewById(R.id.textView4);
            textView2.setText(b+"");
            Button button=findViewById(R.id.button);
            button.setOnClickListener(this);
            //生命和意志改变
            Shuju.x=Shuju.x+a;
            Shuju.y=Shuju.y+b;
            if (Shuju.x<=0||Shuju.y<=0) {
                Intent intent = new Intent();
                intent.setClass(Lang0.this,Over.class);
                startActivity(intent);
            }
            //当生命和意志数值大于100变更为100
            if (Shuju.x>100) {
                Shuju.x=100;
            }
            if (Shuju.y>100) {
                Shuju.y=100;
            }
        }
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button: {
                    Intent intent = new Intent();
                    intent.setClass(Lang0.this,Xingzou.class);
                    //跳转后结束中间页面
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
                break;
            }
        }
    }
    
    

    (11)Java文件:Lei

    public class Lei extends AppCompatActivity {
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.lei);
            MediaPlayer player=MediaPlayer.create(this,R.raw.lei);
            player.start();
            Shuju.q=Shuju.q+1;
            Timer timer = new Timer();
            timer.schedule(new MyTask(),3000);
        }
        class MyTask extends TimerTask {
            @Override
            public void run() {
                Intent intent;
                if (Shuju.q==20) {
                    intent = new Intent(Lei.this,Over.class);
                    startActivity(intent);
                }else {
                    intent = new Intent(Lei.this,Lei0.class);
                    startActivity(intent);
                }
            }
        }
    }
    

    (12)布局文件:lei.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/q2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
    </android.support.constraint.ConstraintLayout>
    

    (13)Java文件:Lei0

    public class Lei0 extends AppCompatActivity implements View.OnClickListener {
        int a=0,b=-10;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.js);
            TextView textView = findViewById(R.id.textView);
            textView.setText("闪电突然来临,受到惊吓");
            TextView textView1 = findViewById(R.id.textView3);
            textView1.setText(a+"");
            TextView textView2 = findViewById(R.id.textView4);
            textView2.setText(b+"");
            Button button=findViewById(R.id.button);
            button.setOnClickListener(this);
            Shuju.x=Shuju.x+a;
            Shuju.y=Shuju.y+b;
            if (Shuju.x<=0||Shuju.y<=0) {
                Intent intent = new Intent();
                intent.setClass(Lei0.this,Over.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
            if (Shuju.x>100) {
                Shuju.x=100;
            }
            if (Shuju.y>100) {
                Shuju.y=100;
            }
        }
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button: {
                    Intent intent = new Intent();
                    intent.setClass(Lei0.this,Xingzou.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
                break;
            }
        }
    }
    

    (14)Java文件:She

    public class She extends AppCompatActivity {
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.she);
            MediaPlayer player=MediaPlayer.create(this,R.raw.she);
            player.start();
            Shuju.q=Shuju.q+1;
            Timer timer = new Timer();
            timer.schedule(new MyTask(),3000);
        }
        class MyTask extends TimerTask {
            @Override
            public void run() {
                Intent intent;
                if (Shuju.q==20) {
                    intent = new Intent(She.this,Over.class);
                    startActivity(intent);
                }else {
                    intent = new Intent(She.this,She0.class);
                    startActivity(intent);
                }
            }
        }
    }
    

    (15)布局文件:she.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/q3"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
    </android.support.constraint.ConstraintLayout>
    

    (16)Java文件:She0

    public class She0 extends AppCompatActivity implements View.OnClickListener {
        int a=10,b=-10;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.js);
            TextView textView = findViewById(R.id.textView);
            textView.setText("你遭遇了蛇");
            TextView textView1 = findViewById(R.id.textView3);
            textView1.setText(a+"");
            TextView textView2 = findViewById(R.id.textView4);
            textView2.setText(b+"");
            Button button=findViewById(R.id.button);
            button.setOnClickListener(this);
            Shuju.x=Shuju.x+a;
            Shuju.y=Shuju.y+b;
            if (Shuju.x<=0||Shuju.y<=0) {
                Intent intent = new Intent();
                intent.setClass(She0.this,Over.class);
                startActivity(intent);
            }
            if (Shuju.x>100) {
                Shuju.x=100;
            }
            if (Shuju.y>100) {
                Shuju.y=100;
            }
        }
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button: {
                    Intent intent = new Intent();
                    intent.setClass(She0.this,Xingzou.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
                break;
            }
        }
    }
    
    

    (17)Java文件:Nuwu

    public class Nuwu extends AppCompatActivity {
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.lei);
            MediaPlayer player=MediaPlayer.create(this,R.raw.nuwu);
            player.start();
            Shuju.q=Shuju.q+1;
            Timer timer = new Timer();
            timer.schedule(new MyTask(),3000);
        }
        class MyTask extends TimerTask {
            @Override
            public void run() {
                Intent intent;
                if (Shuju.q==20) {
                    intent = new Intent(Nuwu.this,Over.class);
                    startActivity(intent);
                }else {
                    intent = new Intent(Nuwu.this,Nuwu0.class);
                    startActivity(intent);
                }
            }
        }
    }
    
    

    (18)布局文件:nuwu.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/q5"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
    </android.support.constraint.ConstraintLayout>
    

    (19)Java文件:Nuwu0

    public class Nuwu0 extends AppCompatActivity implements View.OnClickListener {
        int a=10,b=-10;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.js);
            TextView textView = findViewById(R.id.textView);
            textView.setText("你遭遇了女巫");
            TextView textView1 = findViewById(R.id.textView3);
            textView1.setText(a+"");
            TextView textView2 = findViewById(R.id.textView4);
            textView2.setText(b+"");
            Button button=findViewById(R.id.button);
            button.setOnClickListener(this);
            Shuju.x=Shuju.x+a;
            Shuju.y=Shuju.y+b;
            if (Shuju.x<=0||Shuju.y<=0) {
                Intent intent = new Intent();
                intent.setClass(Nuwu0.this,Over.class);
                startActivity(intent);
            }
            if (Shuju.x>100) {
                Shuju.x=100;
            }
            if (Shuju.y>100) {
                Shuju.y=100;
            }
        }
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button: {
                    Intent intent = new Intent();
                    intent.setClass(Nuwu0.this,Xingzou.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
                break;
            }
        }
    
    }
    
    

    (20)布局文件:js.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/tp"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="fitXY"
            />
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="100dp"
                android:layout_marginTop="50dp"
                android:width="200dp"
                android:singleLine="false"
                android:text=" "
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:layout_marginTop="340dp"
                android:width="200dp"
                android:singleLine="false"
                android:text="生命"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="150dp"
                android:layout_marginTop="340dp"
                android:width="200dp"
                android:singleLine="false"
                android:text="意志"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="100dp"
                android:layout_marginTop="340dp"
                android:width="200dp"
                android:singleLine="false"
                android:text="sm"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="200dp"
                android:layout_marginTop="340dp"
                android:width="200dp"
                android:singleLine="false"
                android:text="yz"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="继续"
                android:layout_marginLeft="150dp"
                android:layout_marginTop="440dp"
                />
        </LinearLayout>
    </android.support.constraint.ConstraintLayout>
    

    (21)Java文件:Over

    public class Over extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.over);
            Button button=findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Over.this, MainActivity.class);
                    intent.putExtra("EXIT_TAG", "SINGLETASK");
                    startActivity(intent);
                }
            });
        }
    }
    
    

    (22)布局文件:over.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/tp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="450dp"
            android:gravity="center">
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="100dp"
                android:layout_marginTop="50dp"
                android:width="200dp"
                android:singleLine="false"
                android:text="游戏结束!"
                android:textSize="24dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center">
            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="over"/>
        </LinearLayout>
    </LinearLayout>
    

    (23)AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.a86155.zzx">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <activity android:name=".MainActivity"
                android:launchMode="singleTask">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".DengLu">
                <intent-filter android:priority="2">
                    <action android:name="android.intent.action.MY_ACTION" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity android:name=".Xingzou">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".Lang">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".Lang0">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".Lei">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".Lei0">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".She">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".She0">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".Nuwu">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".Nuwu0">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
            <activity android:name=".Over">
                <action android:name="android.intent.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </activity>
        </application>
    
    </manifest>
    

    以上是迷雾森林全部代码,是初学Android时运用基础知识写的小程序,按照步骤来做,应该能直接运行。

    欢迎大家指正。

    迷雾森林代码

    展开全文
  • 40个安卓小游戏源码

    2020-07-30 23:33:23
    40个安卓小游戏源码:小游戏提个Android开发者学习和开发
  • Android游戏编程之从零开始》笔记

    万次阅读 多人点赞 2017-12-21 11:32:22
    1.快速进入android游戏开发 自学、demo、问题、百度&Google 2.游戏简单概括 View Canvas Paint 刷新 3.游戏开发常用三种视图 View ——>SurfaceView 2D——> GLSurfaceView 3D 4.View游戏框架 a.绘图函数onDraw ...
    一、游戏开发基础
    1.快速进入android游戏开发
    自学、demo、问题、百度&Google
    2.游戏简单概括
        View   Canvas   Paint   刷新
    3.游戏开发常用三种视图
         View ——>SurfaceView   2D——>  GLSurfaceView    3D
    4.View游戏框架
        a.绘图函数onDraw
    绘制图形、图片等函数都在画布类中。
        b.设置全屏主要操作:隐去状态栏部分、隐去标题栏部分。
        c。按键监听  onKeyDown、onKeyUp
             触屏监听    onTouchEvent
             setFocusable(true)焦点生效
     	 重新绘制画布  invalidate()  和  postInvalidate()
             触屏监听动作:按下、抬起、移动、屏幕压力、多点触屏等。
       setFocusableInTouchMode(true)
    5.SurfaceView游戏框架
        a。implements    SurfaceHolder.Callback  控制SurfaceView的大小、格式等
        b。通过SurfaceViewHolder的lockCanvas()函数获取Canvas对象,加锁
        c。unlockCanvasAndPost函数用于解锁画布和提交
        d。刷新画布
       第一种   每次绘图之前,绘制一个等同于屏幕大小的图形覆盖画布上。
        canvas.drawRect(0,0,this.getWidth(),this.getHeigt(),paint);
        第二种   每次绘图之前,在画布上填充一种颜色
        canvas.drawColor(Color.BLACK);
        第三种    每次绘图之前,指定RGB来填充画布
        canvas.drawRGB(0,0,0);
         第四种   每次绘图之前,绘制一张等同于屏幕大小的图片覆盖在画布上。
                     6.SurfaceView视图添加线程
                         固定时间刷新画布比如倒计时、动态花草、流水、怪物、钱币等。
     设计一个线程不停去重绘画布,实时更新游戏元素状态。
    public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
    	private SurfaceHolder sfh;
    	private Paint paint;
    	private int textX =10,textY = 10;
    	private Thread thread;
    	private boolean flag;
    	private Canvas canvas;
    	private int screenW,screenH;
    	public MySurfaceView(Context context) {
    		super(context);
    		sfh = this.getHolder();
    		sfh.addCallback(this);
    		paint = new Paint();
    		paint.setColor(Color.WHITE);
    		setFocusable(true);
    	}
    
    	@Override
    	public void surfaceCreated(SurfaceHolder holder) {
    		// TODO 视图创建,响应此函数
    		screenW = this.getWidth();
    		screenH = this.getHeight();
    		flag = true;
    		thread = new Thread(this);
    		thread.start();
    	}
    	/**
    	 * 游戏绘图
    	 */
    	public void myDraw(){
    		try {
    			canvas = sfh.lockCanvas();
    			if (canvas!= null) {
    				//利用绘制矩形的方式刷屏
    //				canvas.drawRect(0,0,this.getWidth(),this.getHeight(), paint);
    				//利用RGB的方式刷屏
    				canvas.drawRGB(0, 0, 0);
    				canvas.drawText("Game", textX, textY, paint);
    			}
    		} catch (Exception e) {
    			// TODO: handle exception
    		}finally {
    			if (canvas!= null) {
    				sfh.unlockCanvasAndPost(canvas);
    			}
    		}
    		
    	}
    	/**
    	 * 游戏逻辑
    	 */
    	private void logic(){
    	}
    	@Override
    	public boolean onTouchEvent(android.view.MotionEvent event) {
    		textX = (int) event.getX();
    		textY = (int) event.getY();
    		return true;
    	}
    	@Override
    	public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {
    		return super.onKeyDown(keyCode, event);
    	}
    	@Override
    	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    		
    	}
    
    	@Override
    	public void surfaceDestroyed(SurfaceHolder holder) {
    		flag = false;
    	}
    
    	@Override
    	public void run() {
    		while(flag){
    			long start = System.currentTimeMillis();
    			myDraw();
    			logic();
    			long end = System.currentTimeMillis();
    			try {
    				if (end - start <50) {
    					Thread.sleep(50-(end-start));
    				}
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
     1).线程标识位       便于消亡线程,防止重复创建线程
     2).获取视图的宽和高  this.getWidth和this.getHeight
     3).绘图函数try一下
            4).提交画布必须放在finally中
             5).刷帧时间尽可能保持一致
         6.View与SurfaceView的区别
       a。SurfaceView不会出现因主UI线程阻塞影响按键触屏等问题。
       b。SurfaceView视图有双缓冲机制
       c。棋牌类游戏适合View,动态类游戏适合SurfaceView
          7.Bitmap位图的渲染与操作
        BitmapFactory.decodeResource()通过资源文件生成一张位图
        canvas.save()保存当前画布状态
        canvas.restore()回复上次保存的画布状态
    8.游戏开发中常用png图片,支持透明度。
    9.剪切区域    由画布进行设置
      第一种  矩形可视区域canvas.clipRect()
     path.addCircle(30,30.30,Direction.CCW);canvas.clipRect(path);利用path设置可视区域
       设置剪切区域前需要保存画布的状态。
      第二种  利用Regin对画布设置可视区域
           10. 动画
          角色的移动,爆炸的效果,过场的特效等。
    Animation的每种动画都是对画布操作
    Animation.AnimationListener
    第一种  系统动画特效
    AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation
    第二种   自定义动画
    a 在游戏逻辑处理中调整x和y轴坐标  
    b 利用帧动画
    c  剪切图动画   最常用
        动态物体的动作帧全部放在一张图片中,通过设置可视区域完成。
                    11.游戏适屏
                          利用视图和屏幕宽高获取x和y坐标
      当想要用按下人物一直动的效果时,View的onKeyDown和onKeyUp一起用
      设置private boolean isUP,isDown,isLeft,isRight
      分别在onKeyDown函数中设置isUP,isDown,isLeft,isRight为true
      和在onKeyUp函数中设置isUP,isDown,isLeft,isRight为false
        12。碰撞检测
             a、矩形碰撞,利用两个矩形之间的位置进行判断,如果一个矩形的像素在另外一个矩形之中,或者之上,就可以认为这两个矩形发生了碰撞。
             b。圆形碰撞,利用两圆的圆心距进行判定,当两圆的圆心距小于两圆半径之和时,判定发生了碰撞。
              c。像素碰撞,以上两种方式碰撞不精确。但不推荐使用。
    首先遍历算出一张位图所有的像素点坐标,然后与另外一张位图上的所有点坐标进行对比,一旦有一个像素点坐标相同,
       d。多矩形碰撞  多个矩形碰撞区域
       e。Region碰撞
            判断一个点是否在矩形区域内。使用Region类中的contains函数
        13.游戏音乐与音效
               播放游戏背景音乐MediaPlayer   游戏音效类 SoundPool
                            a。MediaPlayer
                                prepare()、start()、pause()、stop()
            setLooping()、seekTo()、getDuration()、getCurrentPosition()
       b。AudioManager音乐管理类,音量大小等
        setStreamVolume()、getStreamVolume()、getStreamMaxVolume()
              c。MediaPlayer.OnCompletionListerner  监听音乐是否播放完毕
    SoundPool类  只能播放小的文件
       MediaPlayer优缺点
       1)缺点:资源占用较高,延迟时间较长,不支持多个音频同时播放等。
    快速连续播放声音,会有明显的1-3s的延迟。可通过seetTo()解决。
       2)优点:支持大音乐文件播放,不需要加载准备时间。
             SoundPool优缺点
     1)缺点:短音频文件。最大1M空间。不要轻易使用pause和stop方法,容易造成程序莫名终止。音频格式最好用OGG格式。一般不在构造中调用播放函数进行播放,需要加载时间。
    2)优点:支持多个音乐文件同时播放。
      13.游戏数据存储
    FileInputStream/FileOutputStream  适合游戏的保存和使用,
    SharedPreference适合保存配置信息
    SQLite也适合保存游戏
    ContentProvider不适合保存游戏
    二、游戏开发实战演练
    1.准备项目资源文件
    2.划分游戏状态。
    三、游戏开发提高
    1.360°平滑游戏导航摇杆
        首先在屏幕上绘制两个大小不一的圆形,让小圆中心点围绕大圆做圆周运动。
        用户触点位置分为两种情况
        第一种:触点位置在大圆内或者大圆上,小圆的中心点直接跟随玩家触点即可。
        第二种:触点位置在大圆外,小圆中心在大圆的圆周上,但小圆所在大圆上的角度,应该等同于用户触点位置相对于大圆的角度。
       实际使用中,需要通过摇杆控制游戏主角的移动,首先将整个360°分成4或8等分
    2.多触点实现图片缩放
    3.触屏手势识别
        根据玩家接触屏幕时间的长短、在屏幕上滑动的距离、按下抬起的时间等包装,就是触屏事件监听
        GestureDetector.OnGestureListener监听手势
        6个主要抽象函数 
        onDown   onSingleTapUp   onFling  onScroll    onShowPress     onLongPress
        View.onTouchListener 触屏监听器接口
        绑定触屏监听器如下
         public boolean onTouch(View   view, MotionEvent  event){
          return  GestureDetector.onTouchEvent(event) ; }
     4.加速度传感器 又称重力传感器
        其他传感器:陀螺仪传感器、光传感器、恒定磁场传感器、方向传感器、压力传感器
       接近传感器、温度传感器等。
         SensorManager  传感器管理类
    SensorManager sm = (SensorManager)MainActivity;
    instance.getSystemService (Service.SENSOR_SERVICE);
    Sensor传感器类
    Sensor sensor = SensorManager.getDefaultSensor(int type);
    SensorEventListener 传感器监听接口,监听当前传感器的属性及状态。
    手机朝向x、y、z
    z>0手机屏幕朝上,z<0手机屏幕朝下
    当手机是纵向屏幕,
    x>0当前手机左翻,x<0当前手机右翻;y>0当前手机下翻y<0上番
    当手机是横向屏幕
    x>0当前手机下翻,x<0当前手机上翻;y>0当前手机右翻y<0左番
    5.9patch工具
     6.代码实现截屏功能
           原理:通过手动创建一张位图,通过此位图得到一个Canvas实例,利用得到的画布进行绘制, 绘制的图形都保存在最初创建的位图上。最后只要利用游戏主画布绘制这张位图即可。
      7.效率检视工具   TraceView
      8.游戏视图与系统组件共同显示
      9.蓝牙对战游戏
         BluetoothAdapter蓝牙适配器类,  对蓝牙是否可见是否可用进行监听
         BluetoothDevice  蓝牙设备类 ,   
         BluetoothSocket蓝牙连接类 ,用于发送和接收报文数据
    10.网络游戏开发基础
        角色扮演游戏(Role-playing game),简称为RPG
        ACT(Action Game):动作类游戏
        FPS是第一人称射击类游戏的简称(游戏专有名词)。FPS(First-Person Shooter Game)
        格斗游戏(Fight Technology Game,简称为FTG)
        模拟游戏(Simulation Game),简称为SIM或SLG
        RAC(Race Game):竞速类游戏
        冒险游戏(Adventure Game),简称为AVG
        SIM(模拟经营类):SIM (Simulation)
        SPT(体育类):Sports little game
        即时战略(RTS,Real-Time Strategy)
        模拟养成游戏(Education Simulation)
        CAG卡片类游戏
        PUZ儿童益智类游戏,需要通关的那种
        a。Socket协议
      Socket协议属于长连接,下次交互数据不需要再次连接,一直维持交互状态。适用于通信类游戏,如 ARPG、RPG类游戏。
    InputStream  is = Socket.getInputStream();
    OutputStream   os  =  Socket.getOutputStream();
        b、http协议
     http协议属于短连接,客户端正常连接到服务器后,数据交互完就断开。
    11.本地化与国际化
         values-en-rUS等
    
    四、Box2D物理引擎
          游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。
         Box2D用于2D游戏的物理引擎。Java平台的称为JBox2D。
         Android游戏中常见游戏引擎有Rokon、AndEngine、libgdx等。
         1.创建矩形物体
            Box2D中存在两种2D图形,圆形和多边形。创建物体都应该设质量、摩擦力、恢复力三个基本属性。Box2D属于工厂模式,创建物体都是由工厂World生成的,不是new出来的。
          分为三步创建:首先创建物体皮肤,其次创建物体刚体,最后创建物体。
    质量density:当物体质量设置为0时,物体视为静态物体,没有外力不会发生运动的物体。
    摩擦力friction:取值通常设置0~1之间,0没有摩擦,1最强摩擦。
    恢复力restitution:取值通常设置0~1之间,0物体没有恢复力,1物体有最大恢复力。
    弧度-角度:body.getAngle()/180*Math.PI;
    角度-弧度:body.getAngle()/Math.PI*180
    遍历body
    World.getBodyCount()                     world.getBodyList()
    2.设置Body坐标与给Body施加力
    setXForm(Vec2 position,float angle)
    applyForce(Vec2 force,Vec2 point)
    3.Body碰撞监听、筛选与Body传感器
          碰撞监听器接口 ContactListener
        add  发生碰撞,有新的接触点时响应的函数;
        persist    ,当已存在的接触点扔存在响应的函数。
        remove ,当存在的接触点被删除时响应的函数。
               result, 每次时间步监听,如仍有触点存在则被响应。
           Body碰撞筛选    FilterData类   ContactFilter监听器
               shouldColide   
            Body传感器
                  Body传感器就是Body皮肤的一个属性,属性名为isSensor,默认值false。
                   body.getShapeList().m_isSensor = true;
    作用:一个Body传感器属性为true,不会与其他Body产生碰撞效果,但可以监听到碰撞。
    4.关节  Joint
        关节主要作用是限制和约束Body之间的位置、距离、速度、运动轨迹等。
        1.距离关节  DistanceJoint   限制两个Body的质心距离永远保持不变
        2,旋转关节   RevoluteJoint   一个Body围绕另一个Body旋转。还需要一个力驱动Body
              RevoluteJointDef实例作为力驱动旋转
        3.齿轮关节   GearJoint    两个Body进行齿轮咬合运动。
        4.滑轮关节    PulleyJoint   两个Body绑定滑轮关节,沿着一个世界锚点进行滑轮运动。
        5。移动关节   PrismaticJoint起两个作用,一个是让物体沿着世界锚点进行移动,另一个是让绑定在移动关节上的两个Body进行相同的动作。
         6.鼠标关节   MouseJoint  利用鼠标提供力的作用,拖拽Body,Body朝向鼠标点击的位置进行移动,效果如同在Body与鼠标之间绑定了一个橡皮筋。
         
         
    
    
    
    
    
    
    
    
    
    

    展开全文
  • 20个Android游戏源码,…

    万次阅读 2017-12-18 14:15:10
    原文地址:分享20个Android游戏源码,希望大家喜欢哈!作者:我算哪根葱 分享20个Android游戏源码,希望大家喜欢哈! http://www.apkbus.com/android-21834-1-1.html Android 疯狂足球游戏源码 ...
    
    
    分享20个Android游戏源码,希望大家喜欢哈!
    http://www.apkbus.com/android-21834-1-1.html

    Android 疯狂足球游戏源码
    http://www.apkbus.com/android-20986-1-1.html

    android源码捏苍蝇游戏源码
    http://www.apkbus.com/android-20987-1-1.html

    Android游戏源码:水果连连看[经典] 
    http://www.apkbus.com/android-21045-1-1.html

    Android游戏源码分享之【21点游戏源码】
    http://www.apkbus.com/android-21046-1-1.html

    Android游戏源码分享之中国象棋
    http://www.apkbus.com/android-21047-1-1.html

    Android游戏源码分享一个测试反应速度的小游戏
    http://www.apkbus.com/android-21069-1-1.html

    Android 源码之OpenGL 人物走动源码
    http://www.apkbus.com/android-21070-1-1.html

    Android 海贼王连连看游戏源码
    http://www.apkbus.com/android-21071-1-1.html

    Android贪吃蛇源码分享
    http://www.apkbus.com/android-21072-1-1.html

    Android火焰效果程序(有图有源码)
    http://www.apkbus.com/android-21073-1-1.html

    Android下的推箱子游戏源码分享
    http://www.apkbus.com/android-21074-1-1.html

    Android游戏源码分享之俄罗斯方块源码
    http://www.apkbus.com/android-21075-1-1.html

    一个模拟模仿筛子的android游戏
    http://www.apkbus.com/android-21080-1-1.html

    Android游戏源码分享人机对战 五子棋代源码 绝对给力
    http://www.apkbus.com/android-21081-1-1.html

    Android游戏掩码分享之经典的坦克游戏
    http://www.apkbus.com/android-21082-1-1.html

    Android扫雷游戏源码
    http://www.apkbus.com/android-21084-1-1.html
    安卓【切水果】游戏原理研究试验 
    http://www.apkbus.com/android-20353-1-1.html

    是男人就挺一分钟,【切水果】原理写出来的第一个小游戏
    http://www.apkbus.com/android-20356-1-1.html
    展开全文
  • Android开发之游戏2048代码(一)

    千次阅读 2019-09-30 09:20:21
    这次是一个简单的2048游戏,设计比较粗糙,还可以往上面添加音乐、表情之类功能的代码, 一、 先来看看游戏的最终效果: 游戏图标的设计: 二、代码的主要设计: 三、关键代码部分 Card部分: 类Card继承...

    这次是一个简单的2048游戏,设计比较粗糙,还可以往上面添加音乐、表情之类功能的代码,
    此次主要是分析各部分代码,完整代码:https://blog.csdn.net/qq_43433255/article/details/90597331

    一、 先来看看游戏的最终效果:
    在这里插入图片描述
    游戏图标的设计:
    在这里插入图片描述

    二、代码的主要设计:
    在这里插入图片描述在这里插入图片描述

    三、关键代码部分

    Card部分:

    类Card继承了FrameLayout,目的是作为游戏中的卡片。卡片数字和样式的实现:

    
    
    public void
    setNum(int num) {
    
            this.num = num;
    
     
    
            if (num<=0) {
    
                label.setText("");
    
            }else{
    
                label.setText(num+"");
    
            }
    
     
    
            switch (num) {
    
            case 0:
    
               
    label.setBackgroundColor(0x00000000);//透明色
    
                break;
    
            case 2:
    
               
    label.setBackgroundColor(0xffeee4da);
    
                break;
    
            case 4:
    
               
    label.setBackgroundColor(0xffede0c8);
    
                break;
    
            case 8:
    
               
    label.setBackgroundColor(0xfff2b179);
    
                break;
    
            case 16:
    
               
    label.setBackgroundColor(0xfff59563);
    
                break;
    
                ……
    
                 default:
    
                label.setBackgroundColor(0xff3c3a32);
    
                break;
    
            }
    
    }
    
    
    

    num<=0表明是空白方格。当前位置上如果没有card,则使用num<=0的card进行替代。card
    0没有label,同时底色为透明。除了card 0之外,card 2之后的卡片都有对应的颜色和数字。

    AnimLayer部分:

    类AnimLayer继承了FramLayout,用于动画展示。在安卓2048最主要由两个动画:卡片移动和卡片出现。

    卡片出现:

    
    
    //目标卡片
    
    public void
    createScaleTo1(Card target){
    
        //缩放
    
         ScaleAnimation sa = new
    ScaleAnimation(0.1f, 1, 0.1f, 1, Animation.RELATIVE_TO_SELF, 0.5f,
    Animation.RELATIVE_TO_SELF, 0.5f);
    
        sa.setDuration(100);
    
        target.setAnimation(null);
    
        target.getLabel().startAnimation(sa);
    
       }
    
    
    

    卡片移动:

    使用ArrayList
    cards用于管理临时卡片的创建和回收(避免每次创建临时卡片时创建新的对象);创建一个临时卡片,从卡片from移动到卡片to,当完成动画之后将临时卡片设为不可见,并使用cards回收该卡片。

    创建卡片:

    private Card getCard(int num){
    
       Card c;
    
       if (cards.size()>0) {
    
          c = cards.remove(0);
    
       }else{
    
          c = new Card(getContext());
    
          addView(c);
    
       }
    
       c.setVisibility(View.VISIBLE);
    
       c.setNum(num);
    
       return c;
    
    }
    

    创建卡片时,如果cards不为空,则从cards队首取出一张临时卡片。(这里认为使用LinkedList更加适合临时卡片管理队列)

    回收卡片:

    private void recycleCard(Card c){
    
       c.setVisibility(View.INVISIBLE);
    
       c.setAnimation(null);
    
       cards.add(c);
    
    }
    

    回收卡片将当前卡片设为不可见,并加入到cards中。

    卡片移动:

    
    
    public
    void createMoveAnim(final Card from,final Card to,int fromX,int toX,int
    fromY,int toY){
    
        //临时卡片
    
        final Card c = getCard(from.getNum());
    
     
    
        //设置布局
    
        LayoutParams lp = new
    LayoutParams(Config.CARD_WIDTH, Config.CARD_WIDTH);
    
        lp.leftMargin = fromX*Config.CARD_WIDTH;
    
        lp.topMargin = fromY*Config.CARD_WIDTH;
    
        c.setLayoutParams(lp);
    
     
    
        if (to.getNum()<=0) {
    
           
    to.getLabel().setVisibility(View.INVISIBLE);
    
        }
    
        //从from卡片位置移动到to卡片
    
        TranslateAnimation ta = new
    TranslateAnimation(0, Config.CARD_WIDTH*(toX-fromX), 0,
    Config.CARD_WIDTH*(toY-fromY));
    
        ta.setDuration(25);
    
        ta.setAnimationListener(new
    Animation.AnimationListener() {
    
     
    
            @Override
    
            public void onAnimationStart(Animation
    animation) {}
    
     
    
            @Override
    
            public void onAnimationRepeat(Animation
    animation) {}
    
     
    
            //动画结束,将临时卡片回收
    
            @Override
    
            public void onAnimationEnd(Animation
    animation) {
    
               
    to.getLabel().setVisibility(View.VISIBLE);
    
                recycleCard(c);
    
            }
    
        });
    
        c.startAnimation(ta);
    
     
    
      }
    
    
    

    GameView部分:

    GameView继承了GridLayout,包含了界面和游戏逻辑两个部分。这里介绍界面。

    界面中比较重要的内容就是手势识别,用于操控格子的移动:

    
    
    private
    void initGameView(){
    
        setColumnCount(Config.LINES);
    
        setBackgroundColor(0xffbbada0);
    
        setOnTouchListener(new
    View.OnTouchListener() {
    
     
    
            private float startX,startY,offsetX,offsetY;
    
     
    
            @Override
    
            public boolean onTouch(View v,
    MotionEvent event) {
    
     
    
                switch (event.getAction()) {
    
                    case MotionEvent.ACTION_DOWN://按下坐标
    
                        startX = event.getX();
    
                        startY = event.getY();
    
                        break;
    
                    case MotionEvent.ACTION_UP:
    
                        offsetX =
    event.getX()-startX;
    
                        offsetY =
    event.getY()-startY;
    
                        if
    (Math.abs(offsetX)>Math.abs(offsetY)) {
    
                            if (offsetX<-5) {
    
                                swipeLeft();
    
                            }else if (offsetX>5)
    {
    
                                swipeRight();
    
                            }
    
                        }else{
    
                            if (offsetY<-5) {
    
                                swipeUp();
    
                            }else if (offsetY>5)
    {
    
                                swipeDown();
    
                            }
    
                        }
    
                        break;
    
                }
    
                return true;//listener已经处理了事件
    
            }
    
        });
    
         }
    
    
    

    使用了View.OnTouchListener来侦听触摸事件:计算按下和抬起来时offsetX和offsetY,预测手势的移动。

    游戏实现的原理部分:

    调用函数initGameView()完成游戏初始化:

    
    
    private void initGameView(){
    
       
    setColumnCount(Config.LINES);//设置行数量
    
        setBackgroundColor(0xffbbada0);
    
     
    
     
    
       
    setOnTouchListener(new View.OnTouchListener() {
    
            }
    
        });
    
    }
    
    
    

    设置控件的方格数量,随后设置了控件北京,最后注册了刚才分析过的触摸事件监听器。此时游戏已经准备好了,正式开始。

    开始游戏:

    函数startGame();正式开始游戏,首先向方格内随机写入两个方块:

    
    
    public void startGame(){
    
     
    
        MainActivity
    aty = MainActivity.getMainActivity();
    
       
    aty.clearScore();
    
       
    aty.showBestScore(aty.getBestScore());
    
     
    
        for (int y =
    0; y < Config.LINES; y++) {
    
            for (int x
    = 0; x < Config.LINES; x++) {
    
               
    cardsMap[x][y].setNum(0);
    
            }
    
        }
    
     
    
       
    addRandomNum();
    
       
    addRandomNum();
    
    }
    
    
    

    这个函数addRandomNum()向游戏面板内随机加入两个方块,开始游戏:

    
    
    private void addRandomNum(){
    
        //private
    List<Point> emptyPoints = new ArrayList<Point>(); 
    
       
    emptyPoints.clear();
    
     
    
        //将所有空格子搜集起来
    
        for (int y =
    0; y < Config.LINES; y++) {
    
            for (int x
    = 0; x < Config.LINES; x++) {
    
                if
    (cardsMap[x][y].getNum()<=0) {
    
                   
    emptyPoints.add(new Point(x, y));
    
                }
    
            }
    
        }
    
     
    
        if
    (emptyPoints.size()>0) {
    
            //随机位置生成一个card
    
            Point p =
    emptyPoints.remove((int)(Math.random()*emptyPoints.size()));
    
            int num =
    Math.random()>0.1?2:4;
    
           
    cardsMap[p.x][p.y].setNum(num);
    
           
    MainActivity.getMainActivity().getAnimLayer().createScaleTo1(cardsMap[p.x][p.y]);
    
        }
    
    }
    
    
    

    函数addRandomNum()向面板中空的格子中随机生成一个卡片。首先搜集面板中所有空的位置,搜集到一个List中,最后生成随机数,随机生成一个数字,并完成生成动画。

    2048游戏通过游戏中所有的方格朝某个方向移动,合并相同数字的方块。有四个函数负责移动,分别是上下左右,这里只分析一个方向。

    
    
    private void swipeLeft(){
    
     
    
        boolean merge
    = false;//是否合并卡片, 1空卡片和已有卡片合并 2两个数字相同的卡片合并
    
     
    
        for (int y =
    0; y < Config.LINES; y++) {//对所有列
    
            for (int x
    = 0; x < Config.LINES; x++) {
    
                //检查当前点的右侧是否有非空卡片(非空:num>=2)
    
                for
    (int x1 = x+1; x1 < Config.LINES; x1++) {
    
                    if
    (cardsMap[x1][y].getNum()>0) {//如果右边有非空卡片
    
     
    
                       
    if (cardsMap[x][y].getNum()<=0) {//当前坐标上没有格子(空卡片和已有卡片合并)
    
     
    
                           
    MainActivity.getMainActivity().getAnimLayer().createMoveAnim(cardsMap[x1][y],cardsMap[x][y],
    x1, x, y, y);
    
     
    
                           
    cardsMap[x][y].setNum(cardsMap[x1][y].getNum());
    
                           
    cardsMap[x1][y].setNum(0);
    
     
    
                           
    x--;//和空卡片合并,还需要从当前位置计算(否则:|0|2|2|2|左移之后变为|2|2|2|0|)
    
                           
    merge = true;
    
     
    
                       
    }else if (cardsMap[x][y].equals(cardsMap[x1][y])) {
    
                           
    MainActivity.getMainActivity().getAnimLayer().createMoveAnim(cardsMap[x1][y],
    cardsMap[x][y],x1, x, y, y);
    
                           
    cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);
    
                           
    cardsMap[x1][y].setNum(0);
    
     
    
                           
    MainActivity.getMainActivity().addScore(cardsMap[x][y].getNum());
    
                           
    merge = true;
    
                       
    }
    
     
    
                       
    break;
    
                    }
    
                }
    
            }
    
        }
    
     
    
        //只要有任意一行发生过卡片移动,则需要产生新的卡片
    
        if (merge) {
    
     
    
           
    addRandomNum();
    
           
    checkComplete();//判断当前游戏是否失败
    
        }
    
    }
    
    
    

    左移,针对面板中所有列,将每行的方块向左移动。在两种情况发生卡片合并:

    1 当前位置为空卡片,右侧为非空卡片,合并后当前位置卡片Num为右侧卡片,右侧卡片清零。

    2 当前位置为非空卡片,右侧卡片数值和它相等,合并后当前位置卡片数量翻倍,右侧卡片清零。

    从游戏角度来讲:1 对应卡片单纯的移动,2 对应两张相同卡片的合并。因此,只要发生卡片实质上的移动,就应该随机再生产一个卡片,调用addRandomNum()。

    游戏结束的判断:

    每次发生卡片移动,都要检查游戏还能否继续,是否已经结束。函数checkComplete()完成游戏失败(感觉叫做checkFailure()更好)的检查:

    
    
    private void checkComplete(){
    
     
    
        boolean
    complete = true;
    
     
    
    ALL:
    
        for (int y =
    0; y < Config.LINES; y++) {
    
            for (int x
    = 0; x < Config.LINES; x++) {
    
                //满足任意两个条件,游戏就可以继续:1 有空的格子,2 有可以合并的卡片
    
                if
    (cardsMap[x][y].getNum()==0||//1 有多余空间
    
                       
    (x>0&&cardsMap[x][y].equals(cardsMap[x-1][y]))||//2 和左面相等
    
                       
    (x<Config.LINES-1&&cardsMap[x][y].equals(cardsMap[x+1][y]))|//2
    和右面相等
    
                       
    (y>0&&cardsMap[x][y].equals(cardsMap[x][y-1]))||//2 和上面相等
    
                       
    (y<Config.LINES-1&&cardsMap[x][y].equals(cardsMap[x][y+1])))
    {//2 和下面相等
    
     
    
                   
    complete = false;
    
                   
    break ALL;
    
            }
    
        }
    
        if (complete)
    {
    
            new
    AlertDialog.Builder(getContext()).setTitle("你好").setMessage("游戏结束").setPositiveButton("重新开始",
    new DialogInterface.OnClickListener() {
    
     
    
               
    @Override
    
                public
    void onClick(DialogInterface dialog, int which) {
    
                   
    startGame();
    
                }
    
            }).show();
    
        }
    
     
    
    }
    
    

    游戏可以继续的两个条件:有空的格子,或者还有能够合并的卡片。

    四、部分界面设计的代码
    在这里插入图片描述

    <LinearLayout
    
       
    android:layout_width="fill_parent"
    
       
    android:layout_height="wrap_content"
    
        android:orientation="horizontal"
    >
    
        <TextView
    
           
    android:layout_width="wrap_content"
    
           
    android:layout_height="wrap_content"
    
           
    android:text="@string/score"
    
           
    android:textAppearance="?android:attr/textAppearanceLarge" />
    
        <TextView
    
           
    android:id="@+id/tvScore"
    
           
    android:layout_width="0dp"
    
           
    android:layout_height="wrap_content"
    
           
    android:layout_weight="1"
    
           
    android:textAppearance="?android:attr/textAppearanceLarge" />
    
        <TextView
    
            android:layout_width="wrap_content"
    
           
    android:layout_height="wrap_content"
    
           
    android:text="@string/bestscore"
    
           
    android:textAppearance="?android:attr/textAppearanceLarge" />
    
        <TextView
    
           
    android:id="@+id/tvBestScore"
    
            android:layout_width="0dp"
    
           
    android:layout_height="wrap_content"
    
           
    android:layout_weight="1"
    
           
    android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </LinearLayout>
    
    <Button
    
       
    android:id="@+id/btnNewGame"
    
       
    android:layout_width="fill_parent"
    
       
    android:layout_height="wrap_content"
    
        android:background="#0000"
    
       
    android:text="@string/newgame"
    
        android:textSize="20dp"
    
        android:textColor="#deb887"/>
    
    
    
    
    

    在这里插入图片描述

    关于这次2048游戏的一个简单心得体会:

    这次是一个简单的2048游戏,关于这个Android的APP程序,这个程序基本实现了2048的要求,在游戏界面,点击重新开始,能刷新界面,出现另外的两个卡片。对于手指的触碰,在卡片的代码中,设计判断滑动的方向,让卡片做出相应的改变。

    游戏过程中,只有卡片相邻的位置没有重合的时候才会结束,但点击重新开始也会刷新界面。当整个界面都没有重合的时候,弹出结束界面,可以点击重新开始。

    这个程序在设计的时候,遇到点击重新开始时,有些卡片的颜色,不会刷新到初始界面,而是停留到上一个界面。在寻找了相关的资料后,解决了这一个问题。游戏比较粗糙,还可以添加音乐,表情之类的功能。

    展开全文
  • Android游戏 打地鼠

    万次阅读 多人点赞 2019-12-20 10:32:49
    刚毕业时候写的一个小游戏,今天突然看到了,想起以前的工作,同事,好多事情还历历在目,愿大家都过得开心。 步入正题:因为当时很菜,所以写的很简单,很粗陋,但是勉强能用,先看下效果不会插动图,只能...
  • Android项目开发—2048小游戏

    万次阅读 热门讨论 2020-10-09 02:26:18
    自学android一段时间了,自我感觉android基础学的差不多了,现在感觉也遇上了一些瓶颈,所以找来一些小项目练练手,实践一下,才知道自己到底会什么,到底不会什么,这篇文章是挺久之前做的一个小游戏——2048的一个...
  • 分享20个Android游戏源码,…

    万次阅读 2018-05-13 21:14:44
    原文地址:分享20个Android游戏源码,希望大家喜欢哈!作者:我算哪根葱 分享20个Android游戏源码,希望大家喜欢哈! http://www.apkbus.com/android-21834-1-1.html Android 疯狂足球游戏源码 ...
  • Android 游戏开发入门 视频+源码

    万次阅读 2019-03-18 09:24:36
    说来惭愧,本人的志向是做一名Android游戏开发,奈何一直没有学习资料,只能做Android 应用开发。但是却没有多大兴趣,导致技术也是平平无奇,一直是我的心病,废话就不多说了。 下载地址...
  • 20个经典Android游戏源码下载地址(持续更新~)

    万次阅读 热门讨论 2013-10-17 20:05:28
    给大家推荐几个,我调试过的Android游戏源码吧!每个我都运行了效果不错哦!希望对喜爱Android开发的朋友们有所帮助。希望大家喜欢。 1.塔防类游戏源码《保卫萝卜》另类玩法 该游戏是一款国外游戏,和...
  • 用Unity3d开发Android游戏

    万次阅读 2011-08-17 22:35:16
    Unity3d是个强大的游戏引擎,可以很轻松的将游戏发布到Android平台上,今天我就来讲讲如何用Android来开发Android游戏。  首先我们要下载Android SDK,可以在http://developer.android.com/sdk/index.html这
  • Android 的一些比较好的开源代码项目

    万次阅读 2011-11-28 14:18:21
    Android PDF 阅读器 http://sourceforge.net/projects/andpdf/files/ 个人记账工具 OnMyMeans http://sourceforge.net/projects/onmymeans/develop Android电池监控 Android Battery Dog ...
  • 【Android】Android游戏开发

    千次阅读 2019-08-12 13:55:56
    本教材基于Google新推出的Android Studio开发环境,讲解在Android平台上进行游戏开发所需要用到的技术,希望给渴望加入Android游戏开发者行列的读者一些帮助。本教材需要读者有一些Java语言开发的基础。本教材分三个...
  • 1.《腾讯微博Android客户端开发课程》 2.《新浪微博Android客户端项目视频》 3.《Android开发从零开始视频教程》 4.《传智播客android系统开发全程实战课程》 5.《魔乐MLDN 李兴华教你Android开发实战》...
  • Android开发环境搭建流程 本文讲述如何搭建Android开发环境,包括安装Android SDK、安装Android Studio和安装Genymotion。
  • 今天看完了李刚老师的《疯狂Android讲义》一书中的第18章《疯狂连连看》,从而学会了如何编写一个简单的Android疯狂连连看游戏。  开发这个流行的小游戏,难度适中,而且能充分激发学习热情,适合Android初学者来...
  • 在此声明:这个工程是按照CSDN上面的一个博主的方法来做的,我只是实践一下。侵删。现在直接从如何做页面跳转开始,即添加一个新的activity来实现页面跳转。一、创建名为ActivitySecond的类,对应的创建名为activity...
  • 2011年9月22日(Himi的22岁生日当天),Himi的著作:《Android游戏编程之从零开始》一书正式发售;(大家可以到新华书店、淘宝、拍拍、当当、亚马逊等进行购买); 感谢一直以来关注Himi的童鞋们、尤其是Himi的...
  • 十大最佳外国Android游戏下载平台

    万次阅读 2012-10-25 20:14:15
    [Android 应用]十大最佳外国Android游戏下载平台 Android游戏的快速发展,让人感叹,后生可畏,不知道做为Android用户的您,是从哪里开始下载Android游戏的,甚至说你的手机第一张壁纸有事从哪儿下载的。不要认为...
  • 为什么iOS比Android更吸引开发者

    万次阅读 多人点赞 2012-11-04 13:54:12
    1、iOS开发比Android开更容易赚钱1.1 Appstore上的应用和游戏Android play store质量高 现在Android Market变更为Android play store,App Store大概已经超过60万应用了,Android play store大约30万,App store...
1 2 3 4 5 ... 20
收藏数 127,818
精华内容 51,127
关键字:

android游戏