佈局文件:java
activity_main.xml: 1.<?xml version="1.0" encoding="utf-8"?> 2.<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. xmlns:app="http://schemas.android.com/apk/res-auto" 4. xmlns:tools="http://schemas.android.com/tools" 5. android:layout_width="match_parent" 6. android:layout_height="match_parent" 7. tools:context=".MainActivity"> 8. 9. <android.support.v7.widget.RecyclerView 10. android:id="@+id/recyclerView" 11. android:layout_width="0dp" 12. android:layout_height="0dp" 13. android:layout_marginStart="8dp" 14. android:layout_marginLeft="8dp" 15. android:layout_marginTop="8dp" 16. android:layout_marginEnd="8dp" 17. android:layout_marginRight="8dp" 18. android:layout_marginBottom="8dp" 19. app:layout_constraintBottom_toTopOf="@+id/linearLayout" 20. app:layout_constraintEnd_toEndOf="parent" 21. app:layout_constraintStart_toStartOf="parent" 22. app:layout_constraintTop_toTopOf="parent" /> 23. 24. <LinearLayout 25. android:id="@+id/linearLayout" 26. android:layout_width="match_parent" 27. android:layout_height="60dp" 28. android:layout_marginStart="8dp" 29. android:layout_marginLeft="8dp" 30. android:layout_marginEnd="8dp" 31. android:layout_marginRight="8dp" 32. android:layout_marginBottom="8dp" 33. android:orientation="horizontal" 34. app:layout_constraintBottom_toBottomOf="parent" 35. app:layout_constraintEnd_toEndOf="parent" 36. app:layout_constraintStart_toStartOf="parent" 37. app:layout_constraintTop_toBottomOf="@+id/recyclerView"> 38. 39. <TextView 40. android:id="@+id/textView" 41. android:layout_width="wrap_content" 42. android:layout_height="wrap_content" 43. android:layout_weight="1" 44. android:text="score:" /> 45. 46. <Button 47. android:id="@+id/button" 48. android:layout_width="wrap_content" 49. android:layout_height="wrap_content" 50. android:onClick="reset" 51. android:text="reset" /> 52. 53. <Button 54. android:id="@+id/button2" 55. android:layout_width="wrap_content" 56. android:layout_height="wrap_content" 57. android:onClick="showHistory" 58. android:text="history" /> 59. </LinearLayout> 60.</android.support.constraint.ConstraintLayout>
activity_history.xml 1.<?xml version="1.0" encoding="utf-8"?> 2.<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. xmlns:app="http://schemas.android.com/apk/res-auto" 4. xmlns:tools="http://schemas.android.com/tools" 5. android:layout_width="match_parent" 6. android:layout_height="match_parent" 7. tools:context=".HistoryActivity"> 8. 9. <ListView 10. android:id="@+id/listView" 11. android:layout_width="0dp" 12. android:layout_height="0dp" 13. android:layout_marginStart="8dp" 14. android:layout_marginLeft="8dp" 15. android:layout_marginTop="8dp" 16. android:layout_marginEnd="8dp" 17. android:layout_marginRight="8dp" 18. android:layout_marginBottom="8dp" 19. app:layout_constraintBottom_toBottomOf="parent" 20. app:layout_constraintEnd_toEndOf="parent" 21. app:layout_constraintStart_toStartOf="parent" 22. app:layout_constraintTop_toTopOf="parent" /> 23.</android.support.constraint.ConstraintLayout>
Java文件android
MainActivity.java 1.package com.example.recyclercardgame2; 2. 3.import android.support.annotation.NonNull; 4.import android.support.v7.widget.RecyclerView; 5.import android.view.View; 6.import android.view.ViewGroup; 7.import android.widget.Button; 8. 9.import com.example.recyclercardgame2.model.Card; 10.import com.example.recyclercardgame2.model.CardMatchingGame; 11. 12.public class CardGameAdapter extends RecyclerView.Adapter<CardGameAdapter.ViewHolder> { 13. 14. private CardMatchingGame game; 15. private View.OnClickListener monClickListener; 16. 17. public void setonClickListener(View.OnClickListener monClickListener) { 18. this.monClickListener = monClickListener; 19. } 20. 21. 22. public CardGameAdapter(CardMatchingGame game) { 23. this.game = game; 24. } 25. 26. @NonNull 27. @Override 28. public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { 29. View view = new Button(viewGroup.getContext()); 30. view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,360)); 31. ViewHolder viewHolder = new ViewHolder(view); 32. return viewHolder; 33. } 34. 35. @Override 36. public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) { 37. Card card = game.cardAtIndex(i); 38. 39. viewHolder.cardButton.setAlpha(card.isMatched() ? (float)0.5: 1); 40. if(card.isChosen()){ 41. viewHolder.cardButton.setBackgroundResource(R.drawable.blankcard); 42. viewHolder.cardButton.setText(card.getContents()); 43. } else { 44. viewHolder.cardButton.setBackgroundResource(R.drawable.stanfordtree); 45. viewHolder.cardButton.setText(""); 46. } 47. 48. viewHolder.cardButton.setOnClickListener(new View.OnClickListener() { 49. @Override 50. public void onClick(View v) { 51. if (monClickListener != null ) { 52. v.setTag(i); 53. monClickListener.onClick(v); 54. } 55. } 56. }); 57. } 58. 59. @Override 60. public int getItemCount() { 61. return game.count(); 62. } 63. 64. public class ViewHolder extends RecyclerView.ViewHolder { 65. Button cardButton; 66. public ViewHolder(@NonNull View itemView) { 67. super(itemView); 68. cardButton = (Button) itemView; 69. } 70. } 71.}
HistoryActivity .java 1.package com.example.recyclercardgame2; 2. 3.import android.content.Intent; 4.import android.support.v7.app.AppCompatActivity; 5.import android.os.Bundle; 6.import android.widget.ArrayAdapter; 7.import android.widget.ListView; 8. 9.import java.util.ArrayList; 10. 11.public class HistoryActivity extends AppCompatActivity { 12. 13. @Override 14. protected void onCreate(Bundle savedInstanceState) { 15. super.onCreate(savedInstanceState); 16. setContentView(R.layout.activity_history); 17. 18. Intent intent = getIntent(); 19. ArrayList<String> playHistory = intent.getStringArrayListExtra("history"); 20. 21. ListView listView = findViewById(R.id.listView); 22. 23. ArrayAdapter<String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,playHistory); 24. listView.setAdapter(adapter); 25. 26. } 27. 28. @Override 29. public void finish() { 30. super.finish(); 31. overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right); 32. } 33.}
CardGameAdapter.javaapp
1.package com.example.recyclercardgame2; 2. 3.import android.support.annotation.NonNull; 4.import android.support.v7.widget.RecyclerView; 5.import android.view.View; 6.import android.view.ViewGroup; 7.import android.widget.Button; 8. 9.import com.example.recyclercardgame2.model.Card; 10.import com.example.recyclercardgame2.model.CardMatchingGame; 11. 12.public class CardGameAdapter extends RecyclerView.Adapter<CardGameAdapter.ViewHolder> { 13. 14. private CardMatchingGame game; 15. private View.OnClickListener monClickListener; 16. 17. public void setonClickListener(View.OnClickListener monClickListener) { 18. this.monClickListener = monClickListener; 19. } 20. 21. 22. public CardGameAdapter(CardMatchingGame game) { 23. this.game = game; 24. } 25. 26. @NonNull 27. @Override 28. public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { 29. View view = new Button(viewGroup.getContext()); 30. view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,360)); 31. ViewHolder viewHolder = new ViewHolder(view); 32. return viewHolder; 33. } 34. 35. @Override 36. public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) { 37. Card card = game.cardAtIndex(i); 38. 39. viewHolder.cardButton.setAlpha(card.isMatched() ? (float)0.5: 1); 40. if(card.isChosen()){ 41. viewHolder.cardButton.setBackgroundResource(R.drawable.blankcard); 42. viewHolder.cardButton.setText(card.getContents()); 43. } else { 44. viewHolder.cardButton.setBackgroundResource(R.drawable.stanfordtree); 45. viewHolder.cardButton.setText(""); 46. } 47. 48. viewHolder.cardButton.setOnClickListener(new View.OnClickListener() { 49. @Override 50. public void onClick(View v) { 51. if (monClickListener != null ) { 52. v.setTag(i); 53. monClickListener.onClick(v); 54. } 55. } 56. }); 57. } 58. 59. @Override 60. public int getItemCount() { 61. return game.count(); 62. } 63. 64. public class ViewHolder extends RecyclerView.ViewHolder { 65. Button cardButton; 66. public ViewHolder(@NonNull View itemView) { 67. super(itemView); 68. cardButton = (Button) itemView; 69. } 70. } 71.}
Card.java文件dom
1.package com.example.recyclercardgame2.model; 2. 3.import java.io.Serializable; 4. 5./** 6. * Created by lys on 19/3/20. 7. */ 8.public abstract class Card implements Serializable { 9. private boolean _chosen; 10. private boolean _matched; 11. public abstract String getContents(); 12. public boolean isChosen(){ 13. return _chosen; 14. } 15. public void setChosen(boolean chosen){ 16. _chosen = chosen; 17. } 18. public boolean isMatched(){ 19. return _matched; 20. } 21. public void setMatched(boolean matched){ 22. _matched = matched; 23. } 24. public int match(Card[] otherCards){ 25. int score = 0; 26. for (Card card : otherCards) { 27. if (card.getContents().equals(this)){ 28. score = 1; 29. } 30. } 31. return score; 32. } 33.}
Deck.java文件ide
1.package com.example.recyclercardgame2.model; 2. 3.import java.util.ArrayList; 4.import java.util.Random; 5. 6./** 7. * Created by liguiyang on 16/3/7. 8. */ 9.public class Deck { 10. private ArrayList<Card> _cards = new ArrayList<>(); 11. private Random r = new Random(); 12. 13. public void addCard(Card card,boolean atTop){ 14. if (atTop) { 15. _cards.add(0,card); 16. }else{ 17. _cards.add(card); 18. } 19. } 20. 21. public void addCard(Card card){ 22. addCard(card,false); 23. } 24. 25. public Card drawRandomCard(){ 26. Card randomCard = null; 27. if (_cards.size()>0){ 28. randomCard = _cards.remove(r.nextInt(_cards.size())); 29. } 30. return randomCard; 31. } 32.}
PlayingCard.java文件佈局
1.package com.example.recyclercardgame2.model; 2. 3.import java.util.Arrays; 4. 5.public class PlayingCard extends Card{ 6. private String _suit; 7. private int _rank; 8. 9. public String getSuit(){ 10. return _suit; 11. } 12. public void setSuit(String suit){ 13. if(Arrays.asList(PlayingCard.validSuits()).contains(suit)){ 14. _suit = suit; 15. } 16. } 17. public int getRank(){ 18. return _rank; 19. } 20. public void setRank(int rank){ 21. if(rank <= PlayingCard.maxRank()) { 22. _rank = rank; 23. } 24. } 25. public static String[] validSuits(){ 26. return new String[]{"♥","♦","♠","♣"}; 27. } 28. private static String[] rankStrings(){ 29. return new String[]{"?","A","2","3","4","5","6","7","8","9","10","J","Q","K"}; 30. } 31. 32. public static int maxRank(){ 33. return PlayingCard.rankStrings().length - 1; 34. } 35. 36. @Override 37. public int match(Card[] otherCards) { 38. int score = 0; 39. if(otherCards.length == 1){ 40. PlayingCard otherCard = (PlayingCard) otherCards[0]; 41. if(otherCard.getRank()==this.getRank()){ 42. score = 4; 43. }else if (otherCard.getSuit().equals(this.getSuit())){ 44. score = 1; 45. } 46. } 47. 48. return score; 49. } 50. 51. @Override 52. public String getContents() { 53. return PlayingCard.rankStrings()[_rank] + _suit; 54. } 55.}
PlayingDeck.java文件ui
1.package com.example.recyclercardgame2.model; 2. 3. 4.public class PlayingDeck extends Deck{ 5. public PlayingDeck(){ 6. super(); 7. for (String suit : 8. PlayingCard.validSuits()) { 9. for (int rank = 1 ; rank <= PlayingCard.maxRank() ; rank++) { 10. PlayingCard card = new PlayingCard(); 11. card.setRank(rank); 12. card.setSuit(suit); 13. addCard(card); 14. } 15. } 16. } 17.}
運行結果: this