您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

【创新项目实训】Android移动开发教学app案例之飞花令(二)

上一篇完成了查询活动,本篇将继续完成过渡部分和飞花令游戏。

活动之间的参数传递

在两个Activity之间传递数据,最终都是通过Intent传递,但设置数据和保存数据方式有两种(使用Intent 和 Bundle),分别对应如下:

设置数据(MainActivity.java)

方法一:1.直接用intent.putExtra(“name”,“Nicole”)

              Intent intent = new Intent(MainActivity.this,OtherActivity.class);
              intent.putExtra("name", "Nicole");
              intent.putExtra("age", 25);
              intent.putExtra("address", "Shenzhen");

方法二:2.用bundle.putString(“name”,“Nicole”) ;

              Intent intent = new Intent(MainActivity.this,OtherActivity.class);
              Bundle bundle = new Bundle();
              bundle.putString("name", "Ben");
              bundle.putInt("age", 28);
              bundle.putString("address", "China");
              intent.putExtras(bundle);     //将bundle传入intent中。

读取数据 (OtherActivty.java)

方法一:直接用Intent , String nameString = intent.getStringExtra(“name”);

         Intent intent = getIntent();
         String nameString = intent.getStringExtra("name");
         int age = intent.getIntExtra("age");
         String addressString = intent.getStringExtra("address");

方法二:用bundle , String nameString = bundle.getString(“name”);

         Intent intent = getIntent();
         Bundle bundle = intent.getExtras();
         String nameString = bundle.getString("name");
         int age = bundle.getInt("age");
         String addressString = bundle.getString("address");

为活动一中的开始键设置监听,点击后传参并开始活动二

public void onClick(View view) {
       EditText key= findViewById(R.id.id_key);
       Intent intent = new Intent(MainActivity.this,MainActivity2.class);
       System.out.println(key.getText().toString());
       Bundle bundle = new Bundle();
       bundle.putString("data",key.getText().toString());
       intent.putExtras(bundle);
       startActivity(intent);
}

飞花令游戏的UI界面

其实飞花令的UI和简单的聊天界面很类似,有很多共通的地方
在activity_main2.xml里添加EditText,Button,ListView控件:

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <ListView
            android:id="@+id/msg_list_view"
            android:layout_height="30dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:divider="#0000"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <EditText
                android:id="@+id/input_text"
                android:layout_height="wrap_content"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:hint="输入含关键词的诗句"
                android:maxLines="2"/>
            <Button
                android:id="@+id/send"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:text="发送"/>
        </LinearLayout>
</LinearLayout>

基础界面:底部有输入框和发送按钮
在这里插入图片描述
接下来往ListView里加东西,新建msg_item.xml:

<LinearLayout
    android:id="@+id/left_layout"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_gravity="left"
    >
    <TextView
        android:id="@+id/left_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        />
</LinearLayout>
<LinearLayout
    android:id="@+id/right_layout"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_gravity="right"
    >
    <TextView
        android:id="@+id/right_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"/>
</LinearLayout>

“对话”区的预想界面:
在这里插入图片描述
我们可以观察到到,消息有两个种类:用户接收到的和用户发出的,分别位于左端和右端
这就需要一个Msg.java类,利用类里的变量来对消息作区分,其中0为接收到的消息,1为发出的消息

public class Msg {
    public static final int TYPE_RECEIVED = 0;
    public static final int TYPE_SEND = 1;
    private String content;
    private int type;
    public Msg(String content, int type) {
        this.content = content;
        this.type = type;
    }
    public String getContent() {
        return content;
    }
    public int getType() {
        return type;
    }
}

然后新建MsgAdapter类

public class MsgAdapter extends ArrayAdapter<Msg> {
    private int resourceId;
    public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        Msg msg = getItem(position);
        View view;
        ViewHolder viewHolder;
        if(convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, null);
            viewHolder = new ViewHolder();
            viewHolder.leftLayout = (LinearLayout)view.findViewById(R.id.left_layout);
            viewHolder.rightLayout = (LinearLayout)view.findViewById(R.id.right_layout);
            viewHolder.leftMsg = (TextView)view.findViewById(R.id.left_msg);
            viewHolder.rightMsg = (TextView)view.findViewById(R.id.right_msg);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        if(msg.getType() == Msg.TYPE_RECEIVED) {
            viewHolder.leftLayout.setVisibility(View.VISIBLE);
            viewHolder.rightLayout.setVisibility(View.GONE);
            viewHolder.leftMsg.setText(msg.getContent());
        } else if(msg.getType() == Msg.TYPE_SEND) {
            viewHolder.rightLayout.setVisibility(View.VISIBLE);
            viewHolder.leftLayout.setVisibility(View.GONE);
            viewHolder.rightMsg.setText(msg.getContent());
        }
        return view;
    }
    class ViewHolder {
        LinearLayout leftLayout;
        LinearLayout rightLayout;
        TextView leftMsg;
        TextView rightMsg;
    }
}

至此UI部分基本完成了

飞花令

这个游戏的逻辑其实很简单
选定飞花令的关键词后,用户和程序人机“对话”,对话的内容是符合要求且不重复的诗句,顺序是程序先用户后,轮次发言
那么就由此产生了几个问题:

  1. 程序先发言,如果程序无法找到包含关键字的诗句,那意味着人肯定也找不到,游戏就没有进行的必要了
  2. 如何满足“不重复”要求,不仅对人,也对程序,这个要求是双向的
  3. 如何保证用户发送的消息是符合规范的,假如用户只发送关键字是否能够投机取巧
  4. 程序只有第一次是主动“发言”,其他时候都在等待用户发送符合要求的诗句

可以用脏位的思想来解决,新建poems.java类,当该诗句已经被程序或用户发送,则hint置1,即脏位

public class poems {
    Poem poem;
    int hint;//0为干净,1为脏位
    public poems(Poem poem,int hint){
        this.poem = poem;
        this.hint = hint;
    }
    public int getHint() {
        return hint;
    }
    public void setHint(int hint) {
        this.hint = hint;
    }
    public Poem getPoem() {
        return poem;
    }
    public void setPoem(Poem poem) {
        this.poem = poem;
    }
}

每开始一次飞花令游戏,都会将符合要求的所有诗句存到poemslist里,hint全部置0

List<poems> poemsList = new ArrayList<poems>();
		InputStream input = getResources().openRawResource(R.raw.sumtry);
        //对文件内容进行读取
        //把文件内容传给scanner
        Scanner scanner=new Scanner(input);
        int sum=0;//计数
        String line= "";
        String title="";
        out:
        while (scanner.hasNext()){
            //一次读取一行
            line=scanner.nextLine();
            for (int i = 0; i < line.length(); i++)
            {
                if(line.charAt(i)==':') {
                    title = line;
                    continue out;
                }
            }
            if(line.contains(key)){
                Poem poem1 = new Poem(line,title.replaceAll("\\d+",""));
                poems poems1 = new poems(poem1,0);
                poemsList.add(poems1);
                sum++;
            }
        }
        scanner.close();
        System.out.println(sum);

检查sum,保证在sum不为0的情况下程序才会先发言,这就解决了问题1

if(sum==0){
  Toast.makeText(MainActivity2.this, "没有包含该内容的诗句", Toast.LENGTH_LONG).show();
}

随机生成0到sum-1之间的整数作为索引,来确定被选中的诗句,hint位置1

Random random = new Random();
int i = random.nextInt(sum);
poems poems0 = poemsList.get(i);
poems0.setHint(1);//脏位
Msg msg1 = new Msg(poems0.getPoem().getStences(), Msg.TYPE_RECEIVED);
msgList.add(msg1);

在MainActivity2.java里为发送按钮加监听
1.输入判断:不能为空也不能和关键字相同
2.判断输入是否包含关键字
3.判断输入是否在poemslist中
4.判断是否被脏位
符合要求后,将hint置1,程序再次随机生成0到sum-1之间的整数,此处也有脏位判断

int sum0 = sum;
            send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String content = inputText.getText().toString();
                    if (!"".equals(content) && !key.equals(content)) {
                        if (content.contains(key)) {
                            int j = 0;
                            for (int i = 0; i < sum0; i++) {
                                //System.out.println(poemsList.get(i).getPoem().getStences());
                                if (poemsList.get(i).getPoem().getStences().contains(content)) {
                                    if (poemsList.get(i).getHint() == 0) {//未被脏位
                                        poemsList.get(i).setHint(1);//脏位
                                        Msg msg = new Msg(content, Msg.TYPE_SEND);
                                        msgList.add(msg);

                                        Random random1 = new Random();
                                        int x;
                                        while (true) {
                                            x = random1.nextInt(sum0);
                                            if (poemsList.get(x).getHint() == 0) {
                                                break;
                                            }
                                        }
                                        poems poems00 = poemsList.get(x);
                                        poems00.setHint(1);//脏位
                                        Msg msg1 = new Msg(poems00.getPoem().getStences(), Msg.TYPE_RECEIVED);
                                        msgList.add(msg1);

                                        adapter.notifyDataSetChanged();
                                        msgListView.setSelection(msgList.size());
                                    } else {
                                        Toast.makeText(MainActivity2.this, "重复的诗句不算哦", Toast.LENGTH_LONG).show();
                                    }
                                } else {
                                    j++;
                                }
                            }
                            if (j == sum0) {
                                Toast.makeText(MainActivity2.this, "诗句错了", Toast.LENGTH_LONG).show();
                            }
                        } else {
                            Toast.makeText(MainActivity2.this, "诗句错了", Toast.LENGTH_LONG).show();
                        }

                        inputText.setText("");
                    }
                }
            });

分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进