您的位置:首页 > 移动开发 > Android开发

CardGame猜牌小游戏

2016-03-06 21:29 387 查看

CardGame

新建项目CardGame

一直下一步完成创建工程。

 

首先新建一个drawable文件夹,将55张扑克牌放入文件夹中。

而后新建一个工具包:

创建一个工具类:Tools(在Tools中提供一些公共的静态方法供外部调用)

创建玩Tools工具类后,需要在string.xml中定义每一张扑克牌的名称:

    <stringname="p_1">大王</string>
    <stringname="p_2">小王</string>
    <stringname="p_b1">背面</string>
   
    <stringname="p_x_1">红心A</string>
    <stringname="p_x_2">红心2</string>
    <stringname="p_x_3">红心3</string>
    <stringname="p_x_4">红心4</string>
    <stringname="p_x_5">红心5</string>
    <stringname="p_x_6">红心6</string>
    <stringname="p_x_7">红心7</string>
    <stringname="p_x_8">红心8</string>
    <stringname="p_x_9">红心9</string>
    <stringname="p_x_10">红心10</string>
    <stringname="p_x_J">红心J</string>
    <stringname="p_x_Q">红心Q</string>
    <stringname="p_x_K">红心K</string>
   
    <stringname="p_f_1">方块A</string>
    <stringname="p_f_2">方块2</string>
    <stringname="p_f_3">方块3</string>
    <stringname="p_f_4">方块4</string>
    <stringname="p_f_5">方块5</string>
    <stringname="p_f_6">方块6</string>
    <stringname="p_f_7">方块7</string>
    <stringname="p_f_8">方块8</string>
    <stringname="p_f_9">方块9</string>
    <stringname="p_f_10">方块10</string>
    <stringname="p_f_J">方块J</string>
    <stringname="p_f_Q">方块Q</string>
    <stringname="p_f_K">方块K</string>
 
    <stringname="p_h_1">黑桃A</string>
    <stringname="p_h_2">黑桃2</string>
    <stringname="p_h_3">黑桃3</string>
    <stringname="p_h_4">黑桃4</string>
    <stringname="p_h_5">黑桃5</string>
    <stringname="p_h_6">黑桃6</string>
    <stringname="p_h_7">黑桃7</string>
    <stringname="p_h_8">黑桃8</string>
    <stringname="p_h_9">黑桃9</string>
    <stringname="p_h_10">黑桃10</string>
    <stringname="p_h_J">黑桃J</string>
    <stringname="p_h_Q">黑桃Q</string>
    <stringname="p_h_K">黑桃K</string>
   
    <stringname="p_m_1">梅花A</string>
    <stringname="p_m_2">梅花2</string>
    <stringname="p_m_3">梅花3</string>
    <stringname="p_m_4">梅花4</string>
    <stringname="p_m_5">梅花5</string>
    <stringname="p_m_6">梅花6</string>
    <stringname="p_m_7">梅花7</string>
    <stringname="p_m_8">梅花8</string>
    <stringname="p_m_9">梅花9</string>
    <stringname="p_m_10">梅花10</string>
    <stringname="p_m_J">梅花J</string>
    <stringname="p_m_Q">梅花Q</string>
    <stringname="p_m_K">梅花K</string>

首先在Tools类中创建一个方法public
static
StringgetCardName(Context mContext, String fileName),将文件名(图片的名称)传入,返回我们可以认得的扑克牌(string.xml中定义的扑克牌名称)。

public
static
String getCardName(Context mContext, String fileName) {
       Context context = mContext.getApplicationContext();
       String result = "null";
       switch (fileName) {
       case
"p_1": // 大王
           result = context.getString(R.string.p_1);
           break;
       case
"p_2": // 小王
           result = context.getString(R.string.p_2);
           break;
       case
"p_x_1": // 红心A
           result = context.getString(R.string.p_x_1);
           break;
       case
"p_x_2": // 红心2
           result = context.getString(R.string.p_x_2);
           break;
       case
"p_x_3": // 红心3
           result = context.getString(R.string.p_x_3);
           break;
       case
"p_x_4": // 红心4
           result = context.getString(R.string.p_x_4);
           break;
       case
"p_x_5": // 红心5
           result = context.getString(R.string.p_x_5);
           break;
       case
"p_x_6": // 红心6
           result = context.getString(R.string.p_x_6);
           break;
       case
"p_x_7": // 红心7
           result = context.getString(R.string.p_x_7);
           break;
       case
"p_x_8": // 红心8
           result = context.getString(R.string.p_x_8);
           break;
       case
"p_x_9": // 红心9
           result = context.getString(R.string.p_x_9);
           break;
       case
"p_x_10": // 红心10
           result = context.getString(R.string.p_x_10);
           break;
       case
"p_x_11": // 红心J
           result = context.getString(R.string.p_x_J);
           break;
       case
"p_x_12": // 红心Q
           result = context.getString(R.string.p_x_Q);
           break;
       case
"p_x_13": // 红心K
           result = context.getString(R.string.p_x_K);
           break;
 
       case
"p_h_1": // 黑桃A
           result = context.getString(R.string.p_h_1);
           break;
       case
"p_h_2": // 黑桃2
           result = context.getString(R.string.p_h_2);
           break;
       case
"p_h_3": // 黑桃3
           result = context.getString(R.string.p_h_3);
           break;
       case
"p_h_4": // 黑桃4
           result = context.getString(R.string.p_h_4);
           break;
       case
"p_h_5": // 黑桃5
           result = context.getString(R.string.p_h_5);
           break;
       case
"p_h_6": // 黑桃6
           result = context.getString(R.string.p_h_6);
           break;
       case
"p_h_7": // 黑桃7
           result = context.getString(R.string.p_h_7);
           break;
       case
"p_h_8": // 黑桃8
           result = context.getString(R.string.p_h_8);
           break;
       case
"p_h_9": // 黑桃9
           result = context.getString(R.string.p_h_9);
           break;
       case
"p_h_10": // 黑桃10
           result = context.getString(R.string.p_h_10);
           break;
       case
"p_h_11": // 黑桃J
           result = context.getString(R.string.p_h_J);
           break;
       case
"p_h_12": // 黑桃Q
           result = context.getString(R.string.p_h_Q);
           break;
       case
"p_h_13": // 黑桃K
           result = context.getString(R.string.p_h_K);
           break;
 
       case
"p_m_1": // 梅花A
           result = context.getString(R.string.p_m_1);
           break;
       case
"p_m_2": // 梅花2
           result = context.getString(R.string.p_m_2);
           break;
       case
"p_m_3": // 梅花3
           result = context.getString(R.string.p_m_3);
           break;
       case
"p_m_4": // 梅花4
           result = context.getString(R.string.p_m_4);
           break;
       case
"p_m_5": // 梅花5
           result = context.getString(R.string.p_m_5);
           break;
       case
"p_m_6": // 梅花6
           result = context.getString(R.string.p_m_6);
           break;
       case
"p_m_7": // 梅花7
           result = context.getString(R.string.p_m_7);
           break;
       case
"p_m_8": // 梅花8
           result = context.getString(R.string.p_m_8);
           break;
       case
"p_m_9": // 梅花9
           result = context.getString(R.string.p_m_9);
           break;
       case
"p_m_10": // 梅花10
           result = context.getString(R.string.p_m_10);
           break;
       case
"p_m_11": // 梅花J
           result = context.getString(R.string.p_m_J);
           break;
       case
"p_m_12": // 梅花Q
           result = context.getString(R.string.p_m_Q);
           break;
       case
"p_m_13": // 梅花K
           result = context.getString(R.string.p_m_K);
           break;
 
       case
"p_f_1": // 方块A
           result = context.getString(R.string.p_f_1);
           break;
       case
"p_f_2": // 方块2
           result = context.getString(R.string.p_f_2);
           break;
       case
"p_f_3": // 方块3
           result = context.getString(R.string.p_f_3);
           break;
       case
"p_f_4": // 方块4
           result = context.getString(R.string.p_f_4);
           break;
       case
"p_f_5": // 方块5
           result = context.getString(R.string.p_f_5);
           break;
       case
"p_f_6": // 方块6
           result = context.getString(R.string.p_f_6);
           break;
       case
"p_f_7": // 方块7
           result = context.getString(R.string.p_f_7);
           break;
       case
"p_f_8": // 方块8
           result = context.getString(R.string.p_f_8);
           break;
       case
"p_f_9": // 方块9
           result = context.getString(R.string.p_f_9);
           break;
       case
"p_f_10": // 方块10
           result = context.getString(R.string.p_f_10);
           break;
       case
"p_f_11": // 方块J
           result = context.getString(R.string.p_f_J);
           break;
       case
"p_f_12": // 方块Q
           result = context.getString(R.string.p_f_Q);
           break;
       case
"p_f_13": // 方块K
           result = context.getString(R.string.p_f_K);
           break;
       default:
           result = "error";
           break;
       }
       return result;
    }

而后在Tools继续添加一个通过id查找fileName的方法:

publicstaticString getFileNameById(Context mContext,int id)

public
static
String getFileNameById(Context mContext, int id) {
       Context context = mContext.getApplicationContext();
       String result = context.getResources().getResourceEntryName(id);
       return result;
    }

而后在Tools继续添加一个通过fileName查找id的方法:

publicstaticintgetIdByFileName(Context mContext, String fileName)

public
static int
getIdByFileName(Context mContext, String fileName) {
       Context context = mContext.getApplicationContext();
       int result = context.getResources().getIdentifier(fileName,
              "drawable", mContext.getPackageName());
       return result;
    }

接下来就是MainActivity的布局文件activity_main.xml,这里将根布局设置为LinearLayout,并添加一个Button。

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFFCC"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">
 
    <Button
        android:id="@+id/single_card_mode"
        style="@android:style/Widget.Button.Inset"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="@string/single_card"/>
 
</LinearLayout>

之后在MainActivity类中删除不必要的代码,并添加一个onClick(View view)方法

package lyx.feng.cardgame;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
 
public
class
MainActivity extends Activity {
 
    @Override
    protected
void
onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
    }
 
    public
void
onClick(View view) {
       switch (view.getId()) {
       case R.id.single_card_mode:
 
           break;
       }
    }
}
 

之后创建一个继承Activity的SingleCardModeActivity类,并添加布局文件:singlecardmode.xml

首先在singlecardmode.xml布局文件中添加一个Spinner、Button、ImageView这3个组件。

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFFCC"
    android:orientation="vertical">
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
 
        <Spinner
            android:id="@+id/singlecardmode_spinner"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
 
        <Button
            android:id="@+id/singlecardmode_btn"
            style="@android:style/Widget.Button.Inset"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:text="@string/showresult"/>
    </LinearLayout>
 
    <ImageView
        android:id="@+id/singlecardmode_imageview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="12dp"
        android:gravity="center_horizontal"
        android:src="@drawable/p_b1"/>
 
</LinearLayout>

布局都比较简单,上面一个水平方向的LinearLayout,里面包裹的是Spinner和一个Button,下面则直接显示一个ImageView。

接着就是SingleCardModeActivity这个类。

import lyx.feng.cardgame.R;
import android.app.Activity;
import android.os.Bundle;
 
public
class
SingleCardModeActivityextends Activity {
 
    @Override
    protected
void
onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       super.setContentView(R.layout.singlecardmode);
    }
}
 

在MainActivity类的onClick()方法中添加跳转的操作

public
void
onClick(View view) {
       switch (view.getId()) {
       case R.id.single_card_mode:
           startActivity(new Intent(this, SingleCardModeActivity.class));
           break;
       }
    }

并在AndroidManifest.xml文件注册SingleCardModeActivity。

  <activityandroid:name=".SingleCardModeActivity"/>

接下来运行程序:

主界面:

点击单张猜牌按钮:

接下来就是修改SingleCardModeActivity代码:

这里首先获取singlecardmodeactivity.xml布局的Spinner、Button、ImageView这3个组件。

package lyx.feng.cardgame;
......
public
class
SingleCardModeActivity extends Activity {
    private ImageViewimageView =
null;
    private Spinnerspinner =
null;
    private Buttonbtn =
null;
 
    @Override
    protected
void
onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       super.setContentView(R.layout.singlecardmode);
 
        init();
    }
 
    private
void
init() {
 
        this.imageView = (ImageView)super
              .findViewById(R.id.singlecardmode_imageview);
       this.spinner = (Spinner)super
              .findViewById(R.id.singlecardmode_spinner);
       this.btn = (Button)super.findViewById(R.id.singlecardmode_btn);
    }
}
 

接下来为Spinner初始化操作:在操作之前,先在strings.xml文件中添加一个数组,里面保存的是扑克牌的集合。

  <string-arrayname="allCards">
        <item>大王</item>
        <item>小王</item>
        <item>红桃A</item>
        <item>红桃1</item>
        <item>红桃2</item>
        <item>红桃3</item>
        <item>红桃4</item>
        <item>红桃5</item>
        <item>红桃6</item>
        <item>红桃7</item>
        <item>红桃8</item>
        <item>红桃9</item>
        <item>红桃10</item>
        <item>红桃J</item>
        <item>红桃Q</item>
        <item>红桃K</item>
       
        <item>黑桃A</item>
        <item>黑桃1</item>
        <item>黑桃2</item>
        <item>黑桃3</item>
        <item>黑桃4</item>
        <item>黑桃5</item>
        <item>黑桃6</item>
        <item>黑桃7</item>
        <item>黑桃8</item>
        <item>黑桃9</item>
        <item>黑桃10</item>
        <item>黑桃J</item>
        <item>黑桃Q</item>
        <item>黑桃K</item>
       
        <item>方块A</item>
        <item>方块1</item>
        <item>方块2</item>
        <item>方块3</item>
        <item>方块4</item>
        <item>方块5</item>
        <item>方块6</item>
        <item>方块7</item>
        <item>方块8</item>
        <item>方块9</item>
        <item>方块10</item>
        <item>方块J</item>
        <item>方块Q</item>
        <item>方块K</item>
       
        <item>梅花A</item>
        <item>梅花1</item>
        <item>梅花2</item>
        <item>梅花3</item>
        <item>梅花4</item>
        <item>梅花5</item>
        <item>梅花6</item>
        <item>梅花7</item>
        <item>梅花8</item>
        <item>梅花9</item>
        <item>梅花10</item>
        <item>梅花J</item>
        <item>梅花Q</item>
        <item>梅花K</item>
    </string-array>

 

而后是Spinner的初始化:

String allCards[] = getResources().getStringArray(R.array.allCards);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
              android.R.layout.simple_spinner_dropdown_item, allCards);
       this.spinner.setAdapter(adapter);

        this.spinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
 
           @Override
           public
void
onItemSelected(AdapterView<?> parent, View view,
                  int position,long id) {
              imageView.setImageResource(R.drawable.cardbackground);
           }
 
           @Override
           public
void
onNothingSelected(AdapterView<?> parent) {
              // TODO Auto-generated method stub
 
           }
       });

效果:

而后是在54张牌中随机获取一张牌设置到ImageView中去。这里添加一个getRandomCard()方法随机获取一张扑克牌,返回一个id。

public
int
getRandomCard() {
       List<Integer> list = Tools.getAllCards("p_");
       int id = list.get(new Random().nextInt(list.size()));
       return id;
    }

Tools.getAllCards方法返回所有扑克牌的集合。

public
static
List<Integer> getAllCards(String startWith) {
       List<Integer> list = new ArrayList<Integer>();
       Field fields[] = R.drawable.class.getDeclaredFields();
       for (int i = 0; i < fields.length; i++) {
           if (fields[i].getName().startsWith(startWith)) {
              try {
                  list.add(fields[i].getInt(R.drawable.class));
              } catch (Exception e) {
                  e.printStackTrace();
              }
           }
       }
       return list;
    }

接着就是SingleCardModeActivity类的Button按钮操作。

this.btn.setOnClickListener(new OnClickListener() {
 
           @Override
           public
void
onClick(View v) {
 
              // 随机获取的一张扑克牌Id
              int randomCard = getRandomCard();
              // Spinner选择的内容
              String temp = spinner.getSelectedItem().toString();
              // Spinner选择的位置
              intselectItem =
spinner.getSelectedItemPosition();
              // 显示的卡片名称
              String selectCardName = Tools.getCardName(
                     SingleCardModeActivity.this, Tools.getFileNameById(
                            SingleCardModeActivity.this, randomCard));
 
              imageView.setImageResource(randomCard);
              if (temp.equals(selectCardName)) {
                  Toast.makeText(SingleCardModeActivity.this,"猜对了",
                         Toast.LENGTH_SHORT).show();
              } else {
                  Toast.makeText(SingleCardModeActivity.this,
                         "你选择的是:" + temp +"\n显示的是:"
+ selectCardName,
                         Toast.LENGTH_SHORT).show();
              }
           }
       });

在Button按钮获取了选择的卡片和显示的卡片,然后对比显示对应的Toast提示内容。

在SingleCardModeActivity类新建2个Animation,一个显示ImageView进来的动画,一个显示ImageView出去的动画

public Animation getAlphaAnimation() {
       AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f);
       alpha.setDuration(500);
       return alpha;
    }
 
    public Animation getInTransAnimation() {
       int
height
= getWindowManager().getDefaultDisplay().getHeight();
       int width = getWindowManager().getDefaultDisplay().getWidth();
       TranslateAnimation trans = new TranslateAnimation(width, 0, 0, 0);
       trans.setDuration(500);
       return trans;
    }

而后在相应的位置设置即可。

最后效果:

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息