CardGame猜牌小遊戲

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;

    }

而後在相應的位置設置即可。

最後效果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章