使用Android 编写2048小游戏(二)

来源:互联网 发布:淘宝怎么找优惠券 编辑:程序博客网 时间:2024/05/20 00:15

上一篇是游戏的算法现在是界面,我使用GridView+Adapter实现了页面,界面滑动的效果有点难我就用Button代替了
下面是代码

activity_main.xml

<LinearLayout 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"    android:orientation="vertical"    tools:context="com.rindiaco.a2084.MainActivity">    <GridView        android:id="@+id/tablegridveiw"        android:layout_width="match_parent"        android:layout_height="420dp"        android:numColumns="4"        android:layout_margin="5dp"        android:layout_gravity="center_horizontal">    </GridView>    <RelativeLayout        android:layout_width="200dp"        android:layout_height="200dp"        android:layout_gravity="center"        >        <Button            android:id="@+id/leftButton"            android:layout_width="80dp"            android:layout_height="80dp"            android:layout_alignParentLeft="true"            android:layout_centerVertical="true"            android:textSize="18dp"            android:text="left" />        <Button            android:id="@+id/rightButton"            android:layout_width="80dp"            android:layout_height="80dp"            android:text="right"            android:textSize="18dp"            android:layout_alignParentRight="true"            android:layout_centerVertical="true"/>        <Button            android:id="@+id/upButton"            android:layout_width="80dp"            android:layout_height="80dp"            android:layout_alignParentTop="true"            android:layout_centerHorizontal="true"            android:textSize="18dp"            android:text="up" />        <Button            android:id="@+id/downButton"            android:layout_width="82dp"            android:layout_height="80dp"            android:text="down"            android:textSize="18dp"            android:layout_alignParentBottom="true"            android:layout_centerHorizontal="true"/>    </RelativeLayout>    <Button        android:id="@+id/restartbutton"        android:layout_width="100dp"        android:layout_height="60dp"        android:layout_gravity="right"        android:background="@color/color512"        android:text="restart"/></LinearLayout>

GridView的item项
imgs.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent"    android:padding="2.5dp"><ImageView    android:id="@+id/img"    android:layout_width="95dp"    android:layout_height="95dp" />    <TextView        android:id="@+id/numbertext"        android:layout_width="95dp"        android:layout_height="95dp"        android:layout_gravity="bottom"        android:layout_marginTop="-95dp"        android:gravity="center"        android:textColor="#fff"        android:textSize="40dp"/></LinearLayout>

MainActivity

public class MainActivity extends Activity implements View.OnClickListener {    LinkedList<Integer> mnumberlist = new LinkedList<>();    int[][] tablet = new int[4][4];    GridView tablegridView;    Button leftButton;    Button rightButton;    Button upButton;    Button downButton;    Button restartButton;    Scoll scoll;//这个就是算法代码    TableGridviewAdatper adatper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        scoll  = new Scoll(tablet);        scoll.start();        leftButton =(Button) findViewById(R.id.leftButton);        rightButton = (Button)findViewById(R.id.rightButton);        upButton = (Button)findViewById(R.id.upButton);        downButton = (Button) findViewById(R.id.downButton);        restartButton = (Button) findViewById(R.id.restartbutton);        restartButton.setOnClickListener(this);        leftButton.setOnClickListener(this);        rightButton.setOnClickListener(this);        upButton.setOnClickListener(this);        downButton.setOnClickListener(this);        tablegridView = (GridView) findViewById(R.id.tablegridveiw);        tablegridView.setScrollContainer(false);        adatper = new TableGridviewAdatper(this,tablet);        tablegridView.setAdapter(adatper);    }    @Override    public void onClick(View v) {   //保存一份数据        int[][] table2 = new int[4][4];        for (int i = 0; i< 4; i++){            for (int j = 0; j < 4; j++){                table2[i][j] = tablet[i][j];            }        }        switch (v.getId()){            case R.id.leftButton: scoll.leftSroll();break;            case R.id.rightButton: scoll.rightSroll();break;            case R.id.upButton:scoll.upSroll();break;            case R.id.downButton:scoll.downSroll();break;            case R.id.restartbutton:scoll.start();break;        }//判断滑动时有没有格子可以动,我是将数据在操作前保存了一份再与计算之后做比较,如果一样就不用添加数字了        int k = 0;        for (int i = 0; i< 4; i++){            for (int j = 0; j < 4; j++){               if(table2[i][j] != tablet[i][j]&&k==0){                   scoll.insertNumber();                   adatper.notifyDataSetChanged();//通知adapter刷新页面                   k++;               }                if (tablet[i][j] == 2048)                    Toast.makeText(this,"恭喜成功",Toast.LENGTH_SHORT).show();            }        }//判断是否游戏结束    if (scoll.isGameOver()){        Toast.makeText(this,"没有格子可以移动了,请重新开始",Toast.LENGTH_SHORT).show();    }    }}

TableGridViewAdapter

public class TableGridviewAdatper extends BaseAdapter {    Context context;    int[][] table;    TableGridviewAdatper(Context context , int[][] table){        this.context = context;        this.table =table;    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public Object getItem(int position) {        return null;    }    @Override    public int getCount() {        return 16;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHodler viewHodler;        if (convertView == null){            viewHodler   = new ViewHodler();            convertView = View.inflate(context,R.layout.imgs,null);            viewHodler.imageView = (ImageView) convertView.findViewById(R.id.img);            viewHodler.textView = (TextView) convertView.findViewById(R.id.numbertext);            convertView.setTag(viewHodler);        }else{            viewHodler =(ViewHodler) convertView.getTag();        }        //给不同的数字添加不同的颜色,颜色随便啦!颜色放在Color.xml里        //根据position判断table的行与列因为position的位置是从116的        switch(table[((int)position/4)][position%4]){            case 0: viewHodler.imageView.setBackgroundResource(R.color.color0);                viewHodler.textView.setText("");break;            case 2: viewHodler.imageView.setBackgroundResource(R.color.color2);                     viewHodler.textView.setText("2");break;            case 4: viewHodler.imageView.setBackgroundResource(R.color.color4);                    viewHodler.textView.setText("4");break;            case 8: viewHodler.imageView.setBackgroundResource(R.color.color8);                viewHodler.textView.setText("8");break;            case 16: viewHodler.imageView.setBackgroundResource(R.color.color16);                viewHodler.textView.setText("16");break;            case 32: viewHodler.imageView.setBackgroundResource(R.color.color32);                viewHodler.textView.setText("32");break;            case 64: viewHodler.imageView.setBackgroundResource(R.color.color64);                viewHodler.textView.setText("64");break;            case 128: viewHodler.imageView.setBackgroundResource(R.color.color128);                viewHodler.textView.setText("128");;break;            case 256: viewHodler.imageView.setBackgroundResource(R.color.color256);                viewHodler.textView.setText("256");break;            case 512: viewHodler.imageView.setBackgroundResource(R.color.color512);                viewHodler.textView.setText("512");break;            case 1024: viewHodler.imageView.setBackgroundResource(R.color.color1024);                viewHodler.textView.setText("1024");break;            case 2048: viewHodler.imageView.setBackgroundResource(R.color.color2048);                viewHodler.textView.setText("2048");break;        }        return  convertView;    }}class  ViewHodler{    ImageView imageView;    TextView textView;}

PS:GridView在填入item,如果一行的宽度不够就会填入下一行而导致数据与显示不匹配所以注意item的宽度

总结:这个游戏虽然简单,但是稍微不注意数据和计算就会出大bug,所以逻辑要梳理清楚。

原创粉丝点击