Android实现九宫格拼图游戏
程序员文章站
2022-11-22 21:53:13
经常有同学问到,使用android能不能开发游戏呢?能开发那些游戏呢?由于操作系统和开发语言局限,一般开发安卓手机游戏,我们很少使用其自带语言开发。而是使用指定编译器和语言...
经常有同学问到,使用android能不能开发游戏呢?能开发那些游戏呢?由于操作系统和开发语言局限,一般开发安卓手机游戏,我们很少使用其自带语言开发。而是使用指定编译器和语言完成,能够使界面更流畅,用户体验感更好。但是对于一些常见小游戏,使用java语言开发运行,还是不在话下的,那在本篇博客中,我将给大家简单介绍一下,九宫格拼图游戏的开发过程,基本逻辑和思路我将在代码的注释中体现。
九宫格拼图游戏,相信大家小时候都玩过。大概逻辑是,将1张图采用3*3的方式,分成9部分,将第3行3列的小图取出,打乱剩余的8个部分的位置,然后开始游戏,将打乱的8个位置的图片通过左右挪动的方式复位,成功后,将第9张图归位,即游戏结束。
编程时同样采取了这个逻辑,将切割后的小图片存放入容器中,然后随机拜访,给每一张小图设置点击事件,点击后可根据所缺空隙进行挪动,直到全部正确归位为止,我引入了计时功能,可以记录完成游戏时间。
那么,接下来我们进入正题,开始编写代码:
首先编写拼图界面布局:
<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"> <textview android:id="@+id/text_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textsize="28sp" android:textstyle="bold" android:textcolor="#c00" android:text="耗时:0秒" /> <linearlayout android:id="@+id/liner_first" android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal" android:layout_gravity="center"> <imagebutton android:id="@+id/btn_00x00" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_00x00" android:padding="0dp" /> <imagebutton android:id="@+id/btn_00x01" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_00x01" android:padding="0dp" /> <imagebutton android:id="@+id/btn_00x02" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_00x02" android:padding="0dp" /> </linearlayout> <linearlayout android:id="@+id/liner_second" android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal" android:layout_gravity="center"> <imagebutton android:id="@+id/btn_01x00" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_01x00" android:padding="0dp" /> <imagebutton android:id="@+id/btn_01x01" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_01x01" android:padding="0dp" /> <imagebutton android:id="@+id/btn_01x02" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_01x02" android:padding="0dp" /> </linearlayout> <linearlayout android:id="@+id/liner_third" android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal" android:layout_gravity="center"> <imagebutton android:id="@+id/btn_02x00" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_02x00" android:padding="0dp" /> <imagebutton android:id="@+id/btn_02x01" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_02x01" android:padding="0dp" /> <imagebutton android:id="@+id/btn_02x02" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="onclick" android:src="@mipmap/img_xiaoxiong_02x02" android:padding="0dp" android:visibility="invisible" /> </linearlayout> <button android:id="@+id/btn_restart" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="restart" android:layout_gravity="center" android:text="重新开始" /> <imageview android:id="@+id/iv_yuantu" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/yangtu" /> </linearlayout>
效果图如下:
接下来,我们编写拼图activity的逻辑代码:
import android.app.activity; import android.app.alertdialog; import android.os.bundle; import android.os.handler; import android.os.message; import android.view.view; import android.widget.button; import android.widget.imagebutton; import android.widget.textview; public class mainactivity extends activity{ private imagebutton button00,button01,button02,button10,button11,button12,button20,button21,button22; private button buttonrestart; private textview textview; private int imagex = 3; private int imagey = 3; private int imgcount = imagex * imagey; private int length = imgcount; private int blankswap = length - 1; private int blankimgid = r.id.btn_02x02;// 初始化时候空白区域的按钮id private int time; private boolean timeswitch = true; // 声明一个图片数组的下标数组,随机排列这个数组 private int[] imageindex = new int[length]; private int[] image = { r.mipmap.img_xiaoxiong_00x00, r.mipmap.img_xiaoxiong_00x01, r.mipmap.img_xiaoxiong_00x02, r.mipmap.img_xiaoxiong_01x00, r.mipmap.img_xiaoxiong_01x01, r.mipmap.img_xiaoxiong_01x02, r.mipmap.img_xiaoxiong_02x00, r.mipmap.img_xiaoxiong_02x01, r.mipmap.img_xiaoxiong_02x02, }; handler handler = new handler() { // 为了更新时间用handler更新,其实就是textview.settext(时间) public void handlemessage(message msg){ if (msg.what == 1) { textview.settext("时间:" + time); if (timeswitch){ time++; handler.sendemptymessagedelayed(1,1000); } } }; }; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // 初始化这些控件 button00 = (imagebutton) findviewbyid(r.id.btn_00x00); button01 = (imagebutton) findviewbyid(r.id.btn_00x01); button02 = (imagebutton) findviewbyid(r.id.btn_00x02); button10 = (imagebutton) findviewbyid(r.id.btn_01x00); button11 = (imagebutton) findviewbyid(r.id.btn_01x01); button12 = (imagebutton) findviewbyid(r.id.btn_01x02); button20 = (imagebutton) findviewbyid(r.id.btn_02x00); button21 = (imagebutton) findviewbyid(r.id.btn_02x01); button22 = (imagebutton) findviewbyid(r.id.btn_02x02); textview = (textview) findviewbyid(r.id.text_time); buttonrestart = (button) findviewbyid(r.id.btn_restart); handler.sendemptymessagedelayed(1,1000); random(); } // 监听方法 private void random() { timeswitch = true; for (int i = 0; i < imageindex.length; i++) { // 利用循环讲数组存入值为012345678 imageindex[i] = i; } int rand1, rand2; for (int j = 0; j < 20; j++) { // math.random 0-1的随机数,乘以8就是0-8的随机数 rand1 = (int) (math.random() * (length - 1)); do { rand2 = (int) (math.random() * (length - 1)); if (rand1 != rand2) { break; } } while (true); swap(rand1, rand2); } // 随机排列 button00.setimagedrawable(getresources().getdrawable(image[imageindex[0]])); button01.setimagedrawable(getresources().getdrawable(image[imageindex[1]])); button02.setimagedrawable(getresources().getdrawable(image[imageindex[2]])); button10.setimagedrawable(getresources().getdrawable(image[imageindex[3]])); button11.setimagedrawable(getresources().getdrawable(image[imageindex[4]])); button12.setimagedrawable(getresources().getdrawable(image[imageindex[5]])); button20.setimagedrawable(getresources().getdrawable(image[imageindex[6]])); button21.setimagedrawable(getresources().getdrawable(image[imageindex[7]])); button22.setimagedrawable(getresources().getdrawable(image[imageindex[8]])); } public void swap(int rand1, int rand2){ int temp = imageindex[rand1]; imageindex[rand1] = imageindex[rand2]; imageindex[rand2] = temp; } public void onclick(view view) { // id就是点击按钮的时候传过来的button的id int id = view.getid(); // 通过id进行条件语句的执行 switch (id) { case r.id.btn_00x00: move(r.id.btn_00x00, 0); break; case r.id.btn_00x01: move(r.id.btn_00x01, 1); break; case r.id.btn_00x02: move(r.id.btn_00x02, 2); break; case r.id.btn_01x00: move(r.id.btn_01x00, 3); break; case r.id.btn_01x01: move(r.id.btn_01x01, 4); break; case r.id.btn_01x02: move(r.id.btn_01x02, 5); break; case r.id.btn_02x00: move(r.id.btn_02x00, 6); break; case r.id.btn_02x01: move(r.id.btn_02x01, 7); break; case r.id.btn_02x02: move(r.id.btn_02x02, 8); break; } } // 点击的图片与空白区域的交换的方法 public void move(int imagbtnid, int site) { int sitex = site / imagex;// site 为第几张图片 int sitey = site % imagey; // 初始化空白处的坐标 int blankx = blankswap / imagex; int blanky = blankswap % imagey; // 取绝对值 int x = math.abs(sitex - blankx); int y = math.abs(sitey - blanky); // 两种情况要不是在同一行的不同列,要不就是在同一列的不同行 if ( (x == 0 && y == 1) || (x == 1 && y == 0)) { // 定义新的imagebutton 等于我们传过来的图片buttonid imagebutton clickbutton = (imagebutton) findviewbyid(imagbtnid); clickbutton.setvisibility(view.invisible); // 定义一个新的图片按钮,然后findviewbyid空白控件的id imagebutton blankbutton = (imagebutton) findviewbyid(blankimgid); // 然后将图片按钮重新设置图片为我们传过来的第二个参数 blankbutton.setimagedrawable(getresources().getdrawable(image[imageindex[site]])); // 但是,这个控件还是不可见的,设置为可见 blankbutton.setvisibility(view.visible); swap(site, blankswap); // 将新的空白区域位置更新等于传过来的点击的按钮的位置 blankswap = site; // 将新的空白区域的id更新为传过来的点击的按钮的id blankimgid = imagbtnid; } gameover(); } // 如果重新开始,我们要还原被点击的图片按钮变成初始化的模样 public void restore() { handler.removemessages(1); // 定义新的imagebutton 等于我们新的空白图片按钮id,并且设置可见, imagebutton clickbutton = (imagebutton) findviewbyid(blankimgid); clickbutton.setvisibility(view.visible); // 定义一个新的图片按钮,然后findviewbyid空白控件的id这个id就是我们初始化的时候设置隐藏的第九章图片 imagebutton blankbutton = (imagebutton) findviewbyid(r.id.btn_02x02); // 但是,这个控件还是不可见的,设置为不可见可见 blankbutton.setvisibility(view.invisible); blankimgid = r.id.btn_02x02;// 初始化时候空白区域的按钮id blankswap = length - 1; } // 判断拼图是否成功 public void gameover() { boolean loop = true; for (int i = 0; i < imageindex.length; i++) { if (imageindex[i] != i) { loop = false; } } if (loop) { // 成功后,时间停止 timeswitch = false; // 玩家拼图成功,禁止图像按钮移动 button00.setclickable(false); button01.setclickable(false); button02.setclickable(false); button10.setclickable(false); button11.setclickable(false); button12.setclickable(false); button20.setclickable(false); button21.setclickable(false); button22.setclickable(false); button22.setimagedrawable(getresources().getdrawable(image[8])); button22.setvisibility(view.visible); handler.removemessages(1); alertdialog.builder builder = new alertdialog.builder(mainactivity.this); builder.setmessage("恭喜,拼图成功!您用的时间为" + time + "秒").setpositivebutton("确认", null); alertdialog dialog = builder.create(); dialog.show(); } } public void restart(view view) { time = 0; restore(); textview.settext("时间:" + time); timeswitch = true; handler.sendemptymessagedelayed(1,1000); button00.setclickable(true); button01.setclickable(true); button02.setclickable(true); button10.setclickable(true); button11.setclickable(true); button12.setclickable(true); button20.setclickable(true); button21.setclickable(true); button22.setclickable(true); random(); } }
最后运行项目,就能够进行拼图游戏了!效果图如下:
好了,这就是拼图游戏了,在我的项目中,我将神仙姐姐的图片也进行了切隔操作,大家可以试试使用神仙姐姐图片进行编程,感谢您的阅读!
点击下载相关项目代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 刚到眉毛