在还是黑白屏幕的时候手机游戏就有了,相信许多人都曾经有过利用手机里的小游戏来消磨时间吧!现在这个范例就简单的利用Android的ImageView对象来实现一个手机小游戏!
有看过别人赌扑克牌吗?一张小桌子,放上三张牌,红桃A、黑桃2与梅花3,庄家先把三张牌都亮出来,让玩家看清楚红桃A在哪里,之后庄家将牌翻面,并随意变换牌的顺序后,玩家开始下注,猜测红桃A是哪一张?如果猜中了,玩家就赢得两倍的下注金;如果猜错了,下注金就被庄家赢走了!
本范例将制作一个猜牌游戏的简化版,游戏一开始并不直接亮出三张牌,而是翻面洗牌之后直接请玩家来猜猜看红桃A是哪一张,游戏过程绝对公平透明,绝对不会有诈赌的情形发生。
范例中使用TextView、Button及三个ImageView对象,一开始三个ImageView都默认显示扑克牌背面,当用户选择了其中一张牌时,三个ImageView同时翻面,程序并依照选择的对错,在TextView中显示结果,并可通过“再玩一次”的Button来重新开始游戏。
实现本范例前需先准备四张图片:红桃A、黑桃2、梅花3及扑克牌背面,并将这四张图片文件存入/res/drawable/文件夹中。以本范例而言,四张图片文件的路径如下:
/res/drawable/p01.png:红桃A
/res/drawable/p02.png:黑桃2
/res/drawable/p03.png:梅花3
/res/drawable/p04.png:扑克牌背面
当游戏一开始,User便从三张扑克牌当中单击一张,然后程序会一次翻开所有牌面,并将User未选择的牌面以灰暗效果处理,在这个范例练习里,将学习ImageView的onClickListener()事件与设置透明度的技巧。
首先将三张图片文件的id存入数组s1中,randon()这个方法会将s1中的id顺序作随机的调换,以制造洗牌的效果,三个ImageView默认加载图片都为扑克牌背面。
当用户单击其中一张图片时,会触发该ImageView的onClick事件,程序将判断此张牌是否为红心A,再依猜对与否决定TextView的显示内容。
“再玩一次”Button中的onClick事件,会将三个ImageView显示的图片文件都重新设置为扑克牌背面,并做一次重新洗牌的动作(自定义的randon()方法)。
/* import程序略 */
public class EX04_16 extends Activity
{
/*声明对象变量*/
private ImageView mImageView01;
private ImageView mImageView02;
private ImageView mImageView03;
private Button mButton;
private TextView mText;
/*声明长度为3的int数组,并将三张牌的id放入
R.drawable.p01:红桃A
R.drawable.p02:黑桃2
R.drawable.p03:梅花3
R.drawable.p04:扑克牌背面*/
private static int[] s1=
new int[]{R.drawable.p01,R.drawable.p02,R.drawable.p03};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/*加载main.xml Layout */
setContentView(R.layout.main);
/* 取得相关对象 */
mText=(TextView)findViewById(R.id.mText);
mImageView01=(ImageView)findViewById(R.id.mImage01);
mImageView02=(ImageView)findViewById(R.id.mImage02);
mImageView03=(ImageView)findViewById(R.id.mImage03);
mButton=(Button)findViewById(R.id.mButton);
/* 运行洗牌程序 */
randon();
/* 替mImageView01添加onClickListener*/
mImageView01.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
/* 三张牌同时翻面,并将未选择的两张牌变透明 */
mImageView01.setImageDrawable(getResources()
.getDrawable(s1[0]));
mImageView02.setImageDrawable(getResources()
.getDrawable(s1[1]));
mImageView03.setImageDrawable(getResources()
.getDrawable(s1[2]));
mImageView02.setAlpha(100);
mImageView03.setAlpha(100);
/* 依有没有猜对来决定TextView要显示的信息 */
if(s1[0]==R.drawable.p01)
{
mText.setText("哇!你猜对了喔!!拍拍手!");
}
else
{
mText.setText("你猜错了喔!!要不要再试一次?");
}
}
});
/* 替mImageView02添加onClickListener*/
mImageView02.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
/* 三张牌同时翻面,并将未选择的两张牌变透明 */
mImageView01.setImageDrawable(getResources()
.getDrawable(s1[0]));
mImageView02.setImageDrawable(getResources()
.getDrawable(s1[1]));
mImageView03.setImageDrawable(getResources()
.getDrawable(s1[2]));
mImageView01.setAlpha(100);
mImageView03.setAlpha(100);
/* 依有没有猜对来决定TextView要显示的信息 */
if(s1[1]==R.drawable.p01)
{
mText.setText("哇!你猜对了喔!!拍拍手!");
}
else
{
mText.setText("你猜错了喔!!要不要再试一次?");
}
}
});
/* 替mImageView03添加onClickListener*/
mImageView03.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
/* 三张牌同时翻面,并将未选择的两张牌变透明 */
mImageView01.setImageDrawable(getResources()
.getDrawable(s1[0]));
mImageView02.setImageDrawable(getResources()
.getDrawable(s1[1]));
mImageView03.setImageDrawable(getResources()
.getDrawable(s1[2]));
mImageView01.setAlpha(100);
mImageView02.setAlpha(100);
/* 依有没有猜对来决定TextView要显示的信息 */
if(s1[2]==R.drawable.p01)
{
mText.setText("哇!你猜对了喔!!拍拍手!");
}
else
{
mText.setText("你猜错了喔!!要不要再试一次?");
}
}
});
/* 单击Button后三张牌都翻为背面且重新洗牌*/
mButton.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
mText.setText("猜猜看红桃A是哪一张?");
mImageView01.setImageDrawable(getResources()
.getDrawable(R.drawable.p04));
mImageView02.setImageDrawable(getResources()
.getDrawable(R.drawable.p04));
mImageView03.setImageDrawable(getResources()
.getDrawable(R.drawable.p04));
mImageView01.setAlpha(255);
mImageView02.setAlpha(255);
mImageView03.setAlpha(255);
randon();
}
});
}
/*重新洗牌的程序*/
private void randon()
{
for(int i=0;i<3;i++)
{
int tmp=s1[i];
int s=(int)(Math.random()*2);
s1[i]=s1[s];
s1[s]=tmp;
}
}
}
本范例仅运用ImageView的onClick事件,就实现出一个简单的猜牌小游戏,其中洗牌的randon()方法为众多随机洗牌方式的其中一种,各位也可以尝试用其他的方法来改写。
程序中为了视觉的效果,使用了ImageView的setAlpha(int alpha)方法,将没选到的两张牌设置透明度为100,没选到的牌变透明了,选到的那一张牌自然就突显了出来,其中alpha值255即为没有透明度的意思,所以,才会在“再玩一次”按钮的onClick事件中将三张牌的alpha值都重设为255。