精华内容
下载资源
问答
  • 程序中使用vuex开发v-html的样式加载不出来,加载的富文本信息img的样式无法设置,怎么才能修改?
  • 开源项目——Q聊天机器人V1.4

    万次阅读 2016-05-19 15:30:57
    Q聊天机器人V1.0 Q聊天机器人V1.1 Q聊天机器人V1.2 Q聊天机器人V1.3 Q聊天机器人V1.5GitHub:https://github.com/baiyuliang/QRobot注意:发送消息后如果Q没回答,或回答“亲爱的,当天请求次数已用...

    声明:本博客内容只为学习交流使用,未经本人同意,禁止商用,此应用已有上线版本,严禁盗版!!!

    小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281
    小Q聊天机器人V1.1 http://blog.csdn.net/baiyuliang2013/article/details/51395163
    小Q聊天机器人V1.2 http://blog.csdn.net/baiyuliang2013/article/details/51424971
    小Q聊天机器人V1.3 http://blog.csdn.net/baiyuliang2013/article/details/51443156
    小Q聊天机器人V1.4 http://blog.csdn.net/baiyuliang2013/article/details/51454161
    小Q聊天机器人V1.5 http://blog.csdn.net/baiyuliang2013/article/details/51461008

    GitHub:https://github.com/baiyuliang/QRobot

    注意:发送消息后如果小Q没回答,或回答“亲爱的,当天请求次数已用完”,表示当天的api调用次数已经超过限制次数,大家可以自己申请apikey用于测试!(音乐和位置功能不受影响)
    V1.4版本中,对来聊天界面不同消息布局进行了优化,使得聊天消息类型的扩展性更强!1.4之前的版本我们知道,我是将各种消息类型布局全部集中在了一个xml中,这种方式对少量消息类型的应用还可以,如果消息类型过多,那么这种方式就显得很low了,而且影响性能!1.4版本中,将各种消息类型逐一拆分(并且发送和接收一一对应),在adapter中根据消息类型去加载不同view:

    这里写图片描述

    同时使用了通用ViewHolder,我们可以比较下1.4之前版本和1.4版本中adapter的getview部分:

    1.4之前:

     @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHodler hodler;
            if (convertView == null) {
                hodler = new ViewHodler();
                convertView = LayoutInflater.from(mContext).inflate(R.layout.chat_lv_item, null);
                hodler.rl_chat = (RelativeLayout) convertView.findViewById(R.id.rl_chat);//聊天布局
                //接收的消息
                hodler.fromIcon = (CircleImageView) convertView.findViewById(R.id.chatfrom_icon);//他人头像
                hodler.toIcon = (CircleImageView) convertView.findViewById(R.id.chatto_icon);//自己头像
    
                hodler.fromContainer = (LinearLayout) convertView.findViewById(R.id.chart_from_container);
                hodler.fromText = (TextView) convertView.findViewById(R.id.chatfrom_content);//文本
                hodler.fromImg = (ImageView) convertView.findViewById(R.id.chatfrom_img);//图片
                hodler.fromLocation = (ImageView) convertView.findViewById(R.id.chatfrom_location);//位置
                hodler.ll_music = (LinearLayout) convertView.findViewById(R.id.ll_music);//音乐
                hodler.iv_music= (ImageView) convertView.findViewById(R.id.iv_music);
                hodler.pb_music=(ProgressBar)convertView.findViewById(R.id.pb_music);
                hodler.tv_song_name = (TextView) convertView.findViewById(R.id.tv_song_name);//音乐名
                hodler.tv_song_author = (TextView) convertView.findViewById(R.id.tv_song_author);//音乐作者
                hodler.progress_load = (ProgressBar) convertView.findViewById(R.id.progress_load);//ProgressBar
                //发送的消息
                hodler.toContainer = (RelativeLayout) convertView.findViewById(R.id.chart_to_container);
                hodler.toText = (TextView) convertView.findViewById(R.id.chatto_content);//文本
                hodler.toImg = (ImageView) convertView.findViewById(R.id.chatto_img);//图片
                hodler.toLocation = (ImageView) convertView.findViewById(R.id.chatto_location);//位置
                //时间
                hodler.time = (TextView) convertView.findViewById(R.id.chat_time);
    
                convertView.setTag(hodler);
            } else {
                hodler = (ViewHodler) convertView.getTag();
            }
    
            final Msg msg = list.get(position);
    
            if (msg.getIsComing() == 0) {// 收到消息 from显示
                hodler.toContainer.setVisibility(View.GONE);//隐藏右侧布局
                hodler.fromContainer.setVisibility(View.VISIBLE);
                hodler.time.setText(msg.getDate());
                if (msg.getType().equals(Const.MSG_TYPE_TEXT)) {//文本类型
                    hodler.fromText.setVisibility(View.VISIBLE);//文本
                    hodler.fromImg.setVisibility(View.GONE);//图片
                    hodler.fromLocation.setVisibility(View.GONE);//位置
                    hodler.ll_music.setVisibility(View.GONE);//音乐
                    hodler.progress_load.setVisibility(View.GONE);
                    SpannableStringBuilder sb = ExpressionUtil.prase(mContext, hodler.fromText, msg.getContent());// 对内容做处理
                    hodler.fromText.setText(sb);
                    Linkify.addLinks(hodler.fromText, Linkify.ALL);//增加文本链接类型
                } else if (msg.getType().equals(Const.MSG_TYPE_IMG)) {//图片类型
                    hodler.fromText.setVisibility(View.GONE);//文本
                    hodler.fromImg.setVisibility(View.VISIBLE);//图片
                    hodler.fromLocation.setVisibility(View.GONE);//位置
                    hodler.ll_music.setVisibility(View.GONE);//音乐
                    hodler.progress_load.setVisibility(View.GONE);
                    finalImageLoader.display(hodler.fromImg, msg.getContent());//加载图片
                } else if (msg.getType().equals(Const.MSG_TYPE_LOCATION)) {//位置类型
                    hodler.fromText.setVisibility(View.GONE);//文本
                    hodler.fromImg.setVisibility(View.GONE);//图片
                    hodler.fromLocation.setVisibility(View.VISIBLE);//位置
                    hodler.ll_music.setVisibility(View.GONE);//音乐
                    hodler.progress_load.setVisibility(View.GONE);
                    finalImageLoader.display(hodler.fromLocation, msg.getContent());//加载网络图片
                } else if (msg.getType().equals(Const.MSG_TYPE_MUSIC)) {//音乐类型
                    hodler.fromText.setVisibility(View.GONE);//文本
                    hodler.fromImg.setVisibility(View.GONE);//图片
                    hodler.fromLocation.setVisibility(View.GONE);//位置
                    hodler.ll_music.setVisibility(View.VISIBLE);//音乐
                    hodler.progress_load.setVisibility(View.GONE);
                    if(!TextUtils.isEmpty(msg.getBak1())&&msg.getBak1().equals("1")){
                        hodler.pb_music.setVisibility(View.VISIBLE);
                        hodler.iv_music.setVisibility(View.GONE);
                    }else{
                        hodler.pb_music.setVisibility(View.GONE);
                        hodler.iv_music.setVisibility(View.VISIBLE);
                    }
                    String[] musicinfo = msg.getContent().split(",");
                    if (musicinfo.length==3) {//音乐链接,歌曲名,作者
                        hodler.tv_song_name.setText(musicinfo[1]);
                        hodler.tv_song_author.setText(musicinfo[2]);
                    }
                }
            } else {// 发送消息 to显示(目前发送消息只能发送文本类型,后期将会增加其它类型)
                hodler.toContainer.setVisibility(View.VISIBLE);
                hodler.fromContainer.setVisibility(View.GONE);
                hodler.time.setText(msg.getDate());
                if (msg.getType().equals(Const.MSG_TYPE_TEXT)) {//文本类型
                    hodler.toText.setVisibility(View.VISIBLE);//文本
                    hodler.toImg.setVisibility(View.GONE);//图片
                    hodler.toLocation.setVisibility(View.GONE);//位置
                    SpannableStringBuilder sb = ExpressionUtil.prase(mContext, hodler.toText, msg.getContent());// 对内容做处理
                    hodler.toText.setText(sb);
                    Linkify.addLinks(hodler.toText, Linkify.ALL);
                } else if (msg.getType().equals(Const.MSG_TYPE_IMG)) {//图片类型
                    hodler.toText.setVisibility(View.GONE);//文本
                    hodler.toImg.setVisibility(View.VISIBLE);//图片
                    hodler.toLocation.setVisibility(View.GONE);//位置
                    finalImageLoader.display(hodler.toImg, msg.getContent());//加载图片
                } else if (msg.getType().equals(Const.MSG_TYPE_LOCATION)) {//位置类型
                    hodler.toText.setVisibility(View.GONE);//文本
                    hodler.toImg.setVisibility(View.GONE);//图片
                    hodler.toLocation.setVisibility(View.VISIBLE);//位置
                    finalImageLoader.display(hodler.toLocation, msg.getContent());//加载网络图片
                }
            }
    
            // 文本点击
            hodler.fromText.setOnClickListener(new onClick(position));
            hodler.fromText.setOnLongClickListener(new onLongCilck(position));
            hodler.toText.setOnClickListener(new onClick(position));
            hodler.toText.setOnLongClickListener(new onLongCilck(position));
            //图片点击
            hodler.fromImg.setOnClickListener(new onClick(position));
            hodler.fromImg.setOnLongClickListener(new onLongCilck(position));
            hodler.toImg.setOnClickListener(new onClick(position));
            hodler.toImg.setOnLongClickListener(new onLongCilck(position));
            //位置
            hodler.fromLocation.setOnClickListener(new onClick(position));
            hodler.fromLocation.setOnLongClickListener(new onLongCilck(position));
            hodler.toLocation.setOnClickListener(new onClick(position));
            hodler.toLocation.setOnLongClickListener(new onLongCilck(position));
            //音乐
            hodler.ll_music.setOnClickListener(new onClick(position));
            hodler.ll_music.setOnLongClickListener(new onLongCilck(position));
    
            return convertView;
        }
    
        class ViewHodler {
            RelativeLayout rl_chat;
            CircleImageView fromIcon, toIcon;
            ImageView fromImg, fromLocation, toImg, toLocation;
            TextView fromText, toText, time;
            LinearLayout fromContainer;
            RelativeLayout toContainer;
            ProgressBar progress_load;
            //音乐
            LinearLayout ll_music;
            ImageView iv_music;
            ProgressBar pb_music;
            TextView tv_song_name, tv_song_author;
        }
    

    1.4版本:

     final Msg msg = list.get(position);
            if (convertView == null) {
                convertView = createViewByType(msg, position);
            }
    
            CircleImageView head_view = ViewHolder.get(convertView, R.id.head_view);//头像
            TextView chat_time = ViewHolder.get(convertView, R.id.chat_time);//时间
            TextView tv_text = ViewHolder.get(convertView, R.id.tv_text);//文本
            ImageView iv_image = ViewHolder.get(convertView, R.id.iv_image);//图片
            ImageView iv_location = ViewHolder.get(convertView, R.id.iv_location);//位置
    
            LinearLayout layout_voice = ViewHolder.get(convertView, R.id.layout_voice);//语音 语音播放按钮父控件
            ImageView iv_voice = ViewHolder.get(convertView, R.id.iv_voice);//动画
            ImageView iv_fy = ViewHolder.get(convertView, R.id.iv_fy);//翻译按钮
            final TextView tv_fy = ViewHolder.get(convertView, R.id.tv_fy);//翻译内容
    
            LinearLayout ll_music = (LinearLayout) convertView.findViewById(R.id.ll_music);//音乐
            ImageView iv_music = (ImageView) convertView.findViewById(R.id.iv_music);
            ProgressBar pb_music = (ProgressBar) convertView.findViewById(R.id.pb_music);
            TextView tv_song_name = (TextView) convertView.findViewById(R.id.tv_song_name);//音乐名
            TextView tv_song_author = (TextView) convertView.findViewById(R.id.tv_song_author);//音乐作者
    
            chat_time.setText(msg.getDate());//时间
    
            switch (msg.getType()) {
                case Const.MSG_TYPE_TEXT://文本
                    tv_text.setText(msg.getContent());
                    tv_text.setOnClickListener(new onClick(position));
                    tv_text.setOnLongClickListener(new onLongCilck(position));
                    break;
                case Const.MSG_TYPE_IMG://图片
                    finalImageLoader.display(iv_image, msg.getContent());
                    iv_image.setOnClickListener(new onClick(position));
                    iv_image.setOnLongClickListener(new onLongCilck(position));
                    break;
                case Const.MSG_TYPE_LOCATION://位置
                    finalImageLoader.display(iv_location, msg.getContent());
                    iv_location.setOnClickListener(new onClick(position));
                    iv_location.setOnLongClickListener(new onLongCilck(position));
                    break;
                case Const.MSG_TYPE_VOICE://语音
                    final String[] _content = msg.getContent().split(Const.SPILT);
                    tv_fy.setText(_content[1]);
                    tv_fy.setVisibility(View.GONE);
                    layout_voice.setOnClickListener(new RecordPlayClickListener(mContext, iv_voice, _content[0]));
                    iv_fy.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (tv_fy.getVisibility() == View.GONE) {
                                tv_fy.setVisibility(View.VISIBLE);
                            }else{
                                tv_fy.setVisibility(View.GONE);
                            }
                        }
                    });
                    layout_voice.setOnLongClickListener(new onLongCilck(position));
                    break;
                case Const.MSG_TYPE_MUSIC://音乐
                    if (!TextUtils.isEmpty(msg.getBak1()) && msg.getBak1().equals("1")) {
                        pb_music.setVisibility(View.VISIBLE);
                        iv_music.setVisibility(View.GONE);
                    } else {
                        pb_music.setVisibility(View.GONE);
                        iv_music.setVisibility(View.VISIBLE);
                    }
                    String[] musicinfo = msg.getContent().split(Const.SPILT);
                    if (musicinfo.length == 3) {//音乐链接,歌曲名,作者
                        tv_song_name.setText(musicinfo[1]);
                        tv_song_author.setText(musicinfo[2]);
                    }
                    ll_music.setOnClickListener(new onClick(position));
                    ll_music.setOnLongClickListener(new onLongCilck(position));
                    break;
            }
    
            return convertView;
    

    就拿代码行数来说就非常直观,而且1.4版本中还增加了语音消息类型!代码简洁,逻辑更加清晰,扩展也更加容易,这也算的上IM应用的标准写法啦!

    好了,接下来看看1.4版本中增加了哪些功能:

    1.增加语音聊天功能及语音翻译功能:

    1.4之前是录音完毕后转为文字并放进输入框,手动发送,而1.4版本中录音完毕后,可以转为语音形式自动发送,可点击播放,也可点击翻译按钮翻译成文字形式,类似QQ,看效果图:

    这里写图片描述

    看完你肯定会想问我是如何实现的,是直接识别音频文件并将音频文件转为文字吗?这么高大上?——哈哈,非也,其实我是取巧!在使用讯飞语音(录音)的参数设置代码中,看到如下代码:

     mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Const.FILE_VOICE_CACHE + "iat.wav");
    

    这个文件就是每次说话时,自动生成的音频文件,那么你刚说完的话,直接取这个音频文件播放不就可以了吗?!当然,你需要复制这个文件或者说移动这个文件,并修改文件名,否则你原封不动的话,下次录音不久吧上次录音的文件覆盖掉了吗?

      /**
         * 移动文件
         * @param oldPath
         * @param newPath
         * @return
         */
        public static boolean copyFile(String oldPath, String newPath) {
            File oldFile = new File(oldPath);
            if (!oldFile.exists()) {
                return false;
            }
            if(oldFile.renameTo(new File(newPath))){
                return true;
            }else{
                return false;
            }
        }
    

    音频文件路径有了,而语音识别后的文本也是讯飞直接识别后生成的,现在音频文件路径和对应的语音识别文本都有了,将其存储起来,那么所谓的语音聊天,语音翻译实现也就顺理成章了!(哎,还以为是多么高大上呢,原来是投机取巧啊^^)

    2.增加录音发送形式和回复自动朗读设置:

    这里写图片描述

    录音以语音形式发送,即录音完毕,直接以语音形式发送;
    录音以文字形式发送,即录音完毕,转为文字形式手动发送;
    回复内容直接朗读,即文本形式的回复直接朗读出来!

    GitHub:https://github.com/baiyuliang/QRobot

    展开全文
  • 开源项目——Q聊天机器人V1.2

    千次阅读 2016-05-16 14:55:49
    Q聊天机器人V1.3GitHub:https://github.com/baiyuliang/QRobotQ聊天机器人1.2版本中加入语音识别及语音合成功能,语音识别即将语音转化为文字输出,语音合成即将文字以语音的形式朗读出来!语音sdk使用的是科大...

    声明:本博客内容只为学习交流使用,未经本人同意,禁止商用,此应用已有上线版本,严禁盗版!!!

    小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281
    小Q聊天机器人V1.1 http://blog.csdn.net/baiyuliang2013/article/details/51395163
    小Q聊天机器人V1.2 http://blog.csdn.net/baiyuliang2013/article/details/51424971
    小Q聊天机器人V1.3 http://blog.csdn.net/baiyuliang2013/article/details/51443156
    小Q聊天机器人V1.4 http://blog.csdn.net/baiyuliang2013/article/details/51454161
    小Q聊天机器人V1.5 http://blog.csdn.net/baiyuliang2013/article/details/51461008

    GitHub:https://github.com/baiyuliang/QRobot

    注意:发送消息后如果小Q没回答,或回答“亲爱的,当天请求次数已用完”,表示当天的api调用次数已经超过限制次数,大家可以自己申请apikey用于测试!(音乐和位置功能不受影响)

    小Q聊天机器人1.2版本中加入语音识别及语音合成功能,语音识别即将语音转化为文字输出,语音合成即将文字以语音的形式朗读出来!语音sdk使用的是科大讯飞语音SDK,在国内第三方语音识别sdk中,科大讯飞还是算佼佼者了,有兴趣的朋友可以研究下!看效果图:

    这里写图片描述

    集成流程:

    1.进入科大讯飞官网http://www.xfyun.cn,注册,并创建应用:

    这里写图片描述

    记录Appid!

    2.点击添加更多服务:

    这里写图片描述

    选择前两项,语音听写和语音合成,确定!
    注意:刚创建的应用sdk每日限制调用次数500次,当开发完毕需时向讯飞提交安装包及应用截图,待讯飞审核成功后,不再限制调用次数!

    这里写图片描述

    这里写图片描述

    3.下载SDK(demo):

    这里写图片描述

    导入其中的SpeechDemo即可查看使用方法!

    关于jar包,只需添加Msc.jar及so文件即可,Sunflower.jar为讯飞统计功能,不需要可不添加!

    代码集成注意事项:

    1.AndroidManifest.xml:

        <meta-data
                android:name="IFLYTEK_APPKEY"
                android:value="'573945a6'" />
    

    并注意语音相关权限添加!

    2.Application.java

    初始化:

    SpeechUtility.createUtility(this, "appid=573945a6");
    

    3.语音听写界面

    如使用讯飞自带语音听写布局,则需将demo中assets下的相关资源文件拷贝到项目中!

    具体调用代码,不再贴了,可查看讯飞demo或本人项目!
    关于语音相关的设置,比如,语音合成时的语速,音量,”朗读人“的声音(女声,男声,大叔,小萝莉等),“朗读人”使用的的语言(方言:普通话,河南话,四川话,东北话,粤语等)都可自定义设置,不过1.2版本没有添加设置入口,全部默认,后续版本中会添加相关设置项,让小Q更加好玩!

    GitHub:https://github.com/baiyuliang/QRobot

    2016-05-17:

    **1.**增加了几个讯飞的广告位,欢迎页全屏广告和主页横幅广告,在不影响网友的前提下可以点几下^^,另外也可以参考下广告的设置代码,为自己的小应用接入一些不影响用户体验的小广告!

    这里写图片描述这里写图片描述

    关于广告平台依然使用的是讯飞http://www.voiceads.cn/,有兴趣的朋友可以研究下!

    2. 增加讯飞语音相关设置入口,如录音语言设置,朗读语言设置等:

    这里写图片描述这里写图片描述这里写图片描述

    另将ChatActivity中讯飞语音相关代码提取并封装了一个工具类,简化代码:

    这里写图片描述

    3. 添加向右滑动返回功能,主要代码位于SlideBackActivity!

    展开全文
  • 开源项目——Q聊天机器人V1.0

    万次阅读 2016-05-12 22:42:46
    Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281 Q聊天机器人V1.1 http://blog.csdn.net/baiyuliang2013/article/details/51395163 Q聊天机器人V1.2 ...

    声明:本博客内容只为学习交流使用,未经本人同意,禁止商用,此应用已有上线版本,严禁盗版!!!

    小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281
    小Q聊天机器人V1.1 http://blog.csdn.net/baiyuliang2013/article/details/51395163
    小Q聊天机器人V1.2 http://blog.csdn.net/baiyuliang2013/article/details/51424971
    小Q聊天机器人V1.3 http://blog.csdn.net/baiyuliang2013/article/details/51443156
    小Q聊天机器人V1.4 http://blog.csdn.net/baiyuliang2013/article/details/51454161
    小Q聊天机器人V1.5 http://blog.csdn.net/baiyuliang2013/article/details/51461008

    GitHub:https://github.com/baiyuliang/QRobot

    注意:发送消息后如果小Q没回答,或回答“亲爱的,当天请求次数已用完”,表示当天的api调用次数已经超过限制次数,大家可以自己申请apikey用于测试!(音乐和位置功能不受影响)

    GitHubhttps://github.com/baiyuliang/QRobot

    在1.0版本中,主要只做了简单的文本对话来实现机器人聊天的,后续会加入一些再稍复杂点的功能,比如语音啊,歌曲点播啊,航班查询啊以及类似微信资讯的UI效果等!项目中使用的机器人api来源于某网站,为了避免打广告的嫌疑,大家还是进项目看吧-.-||~,需要注册账号并得到一个key,请求时,调用api+key+请求内容即可得到响应,当然机器人的回答纯属娱乐,不具有权威性!网络框架方面,本打算使用okhttp,但介于该项目中网络请求部分非常简单,并不需要重量级的请求框架,因此选择了比较小巧轻量的afinal,图片加载,网络请求,文件下载等,简便快捷!

    好了,接下来,看看1.0版本中的都有一些什么样的UI和好玩的功能吧:

    1.启动页;

    (不再贴图)

    2.引导页;

    (不再贴图)

    3.登录页

    这里写图片描述

    并没有任何登录逻辑,只是简单的实现了常见的登录界面,手机号密码任意输入!

    4.首页

    这里写图片描述

    此页面有常见的banner轮播效果,以及资讯列表展示效果!列表内容参考自网上的的一个demo中抓取csdn网页资讯并解析的例子!首页其实与聊天机器人没有任何关联,完全是为了界面效果充数,哈哈!后续会添加一些常见的功能,比如左上角城市选择,右上角消息及数量等等!

    5.消息

    这里写图片描述

    这聊天机器人有什么样的功能,看图便知0.0!图标有点丑哈,没有资源,无奈去easyicon上下了几个样子还算不错的,先凑合着看!可参点:界面布局,消息处理,聊天框部分布局,表情使用等等!

    6.我的

    这里写图片描述

    很简单,没什么可说的,也是为了界面效果充数的,不过在后续的更新中可能会根据增加的一些功能来增加一些选项!

    效果展示动态图:

    这里写图片描述

    项目中,也有很多不足的地方,比如为了迅速出来效果,xml中一些文字、颜色的定义大都是直接写在布局xml中而并未按照标准规范写,代码中也有很多可以优化的地方等等吧,时间允许的话,在后续的更新中逐渐改进吧!

    项目代码简单易懂,非常适合初中级开发者,你可以发散你的思维,自己做出来一个聊天机器人,上传至应用市场,不仅仅是娱乐,也可以提高你整个项目的把控能力,思维能力,代码书写能力,UI布局能力,以及熟悉各大应用市场上线应用流程等!欢迎mark~

    GitHubhttps://github.com/baiyuliang/QRobot

    展开全文
  • C#winform 经典游戏贪吃蛇V2.0(二)

    千次阅读 多人点赞 2018-06-09 16:11:14
    关于V2.0 经过上一篇文章 贪吃蛇V1.0 我们的蛇已经能跑能吃,但是还是存在着许多的问题, 没有死亡判定; 不能调节游戏难度;...这里列出来的只是一...所以我在游戏的界面添加了网格线,玩家可以更加精准的找...

    关于V2.0

    经过上一篇文章
    贪吃蛇V1.0
    我们的蛇已经能跑能吃,但是还是存在着许多的问题,

    • 没有死亡判定;
    • 不能调节游戏难度;
    • 没有开始界面;
    • 游戏界面太单调。

    这里列出来的只是一部分的问题,也是我们这个版本主要解决的问题!

    首先针对游戏界面的问题

    由于原先的界面为单调的纯白,这样不仅加大了游戏难度,玩家的体验也极差,
    所以我在游戏的界面添加了网格线,让玩家可以更加精准的找到食物和蛇相对应的行列。
    原来界面:
    这里写图片描述
    更改后的界面:
    这里写图片描述
    是不是感觉好多了?
    在添加网格线的过程中我遇到了一些问题:
    解决方法

    网格线的绘制,放在窗体的Paint事件中,代码如下:

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                int col = 50;
                int row = 50;
                int drawRow = 0;
                int drawCol = 0;
                Pen black = new Pen(Color.Gray, 1);
                //black.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                Graphics g = this.CreateGraphics();
                for (int i = 0; i <= row; i++)
                {
                    g.DrawLine(black, 0, drawCol, 500, drawCol);
                    drawCol += 10;
                }
                // 画垂直线
                for (int j = 0; j <= col; j++)
                {
                    g.DrawLine(black, drawRow, 0, drawRow, 500);
                    drawRow += 10;
                }
            }

    蛇的死亡事件

    思路为在每一次移动,进行一次Snake_over判定
    代码如下:
    遍历蛇体判定蛇头Snake_Boby[0]的坐标,是否和蛇体位置重合
    然后在Timer_TickForm1_KeyDownSnake_move(x, y)后添加Snake_over()

            /// <summary>
            /// 蛇触碰身体死亡事件
            /// </summary>
            public void Snake_over()
            {
                int x, y;
                //记录snake head位置
                x = Snake_Boby[0].Left;
                y = Snake_Boby[0].Top;
                //遍历看是否和snake body重合
                foreach (Label lb in this.Controls)
                {
                    //将food排除
                    if (lb.Tag.ToString() != "food".ToString())
                    {
                        //出现重合
                        if ((lb.Left == x && lb.Top == y) && lb.Tag.ToString()!="0")
                        {
                            this.Close();
                            MessageBox.Show("GAME OVER !", "提示!");
    
                        }
                    }
                }
            }

    增加游戏开始界面Game_Begin

    Game_Begin界面如图
    这里写图片描述
    控件如下:

            private System.Windows.Forms.GroupBox groupBox1;
            private System.Windows.Forms.RadioButton radioButton4;
            private System.Windows.Forms.RadioButton radioButton3;
            private System.Windows.Forms.RadioButton radioButton2;
            private System.Windows.Forms.RadioButton radioButton1;
            private System.Windows.Forms.Button button2;
            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.Button button1;

    后台代码:
    设置一个成员变量用来存储时间间隔,设置游戏难度

            /// <summary>
            /// 用来设置游戏难度
            /// </summary>
            public static int time_interval = 100;

    页面跳转和难度选择

            private void button1_Click(object sender, EventArgs e)
            {
    
                Form1 form = new Form1();
                if (radioButton1.Checked)
                {
                    time_interval = 200;
                }
                else if (radioButton3.Checked)
                {
                    time_interval = 50;
                }
                else if (radioButton4.Checked)
                {
                    time_interval = 20;
                }
                else
                {
                    time_interval = 100;
                }
                form.Show();
    
            }

    将程序初始化界面设为Game_Begin界面
    在program.cs中改为:

                Application.Run(new Game_Begin());

    然后在游戏界面Form1的Load事件

    添加:

                timer.Interval = Game_Begin.time_interval;

    Timer_Tick的事件间隔timer.Interval改为Game_Begin界面我们获取RadioButton的值

    最后,看看V2.0的效果:

    这里写图片描述
    Git地址

    好了贪吃蛇的更新就到这了,如果以后有兴趣再做V3.0啦!(ง •_•)ง

    展开全文
  • vue v-for循环出来的数据动态绑定值

    千次阅读 2019-10-17 19:51:19
    记录一下,循环数据动态绑定值 //description这个数组是后台给的数据 //首先遍历这个数组,给这个数组加上value这个字段 for(let item of description){ ...div v-for="(item,index) in descriptio...
  • P2v, V2v 实践

    千次阅读 2018-03-21 15:04:45
    P2V(物理机转虚拟机)p2v,就是physical machine to virtual machine,物理机转换成虚拟机,物理机有硬件和软件资源两部分,虚拟机同样也有硬件和软件资源,只是硬件是虚拟出来的。p2v是把物理机的软件资源(操作...
  • oracle的V$log一些用处

    千次阅读 2009-05-08 18:14:00
    200w*30*4=240 000 000条的数据,表已经按照日期字段分月分区了,在从该表select出来insert到临时表的时候发现非常非常的慢,看了执行计划也没什么可以改善的,想查下是那个步骤执行慢,突然想起了日志文件V$LOG;...
  • Vue.js 指令v-for和v-if和v-show

    千次阅读 2019-02-19 23:03:11
    Vue指令之v-for和key属性 迭代数组 &amp;amp;amp;amp;lt;ul&amp;amp;amp;amp;gt; &amp;amp;amp;amp;lt;li v-for=&amp;amp;amp;quot;(item, i) in list&amp;amp;amp;quot;&amp;amp;amp;...
  • 提示CSDN通知的软件 v3.2.1

    千次阅读 2013-12-09 21:16:20
    后来发现跳出来吓一跳,就改了下界面,它缓慢出来。 运行环境是Java 7。 在JDK 7下编译所以Java 6下不能运行。 v3.2更新:去掉了快捷键ALT+C呼出窗口功能,代之以系统托盘;更改了外观效果。 v3.2.1...
  • <span :title="dropLabel(msg)" v-html="msg"></span> 这是我的项目代码,v-html解析后台返回的字段,但是字段里面包含的...文章大致的意思是在v-html中某些特殊字符若想显示出来,需要转为实体名称,...
  • 首先非常感谢研友 hh_milan ,7月7日和他讨论时提出了我这个波分解重构程序存在一个挺大的问题:一个16*16的矩阵,用我的V2.0波分解重构程序处理后,重构矩阵大小仅为9*9!当时我就判断出问题应该是出在重构程序...
  • v-for循环出来的列表中使用v-bing动态绑定class、v-show或v-if动态控制个别item 场景一般多用于多项选择原因是在v-for循环的时候 items是动态创建,所以不会被监听并且实时动态控制class解决方法是 vm.$set 官方...
  • 1、【设备端】安信可windows一体化环境IDE V1.5 版本降临,体积更,兼容新旧版本SDK编译; 2、【设备端】安信可windows一体化环境IDE V1.5 二次开发直连阿里云飞燕平台,天猫精灵语音控制; 文章目录一、前言二...
  • 今天在工作中,同事使用uni-app开发,想利用v-show指令实现页面内容切换,结果在微信程序中,页面的内容全部显示出来了。 看到这个现象,就怀疑 v-show 是否在微信程序中起作用 过程分析 我自己使用uni-app ...
  • RISC-V学习整理

    千次阅读 2019-02-22 16:12:23
    目前网上关于risc-v架构概念介绍的文章比较多,本文从开发角度把学习中的记录整理出来。 以下为作者为自学记录内容,文章仅抛砖引玉,有学习需要的同学还需以官网及risc-v专家的书籍为准。 有错误欢迎指出,共同学习...
  • v-model和v-bind

    千次阅读 2018-05-09 14:52:23
    VUE的模板采用DOM模板,也就是说它的模板可以当做DOM节点运行,在浏览器下不报错,绑定数据有三种方式,一种是插值,也就是{{名称}}的形式,一种是v-绑定,还有一种是v模型{{名称}}的形式比较好理解,就是以文本的...
  • 终于有人把RISC-V讲明白了

    万次阅读 多人点赞 2018-07-27 15:30:04
    0 RISC-V和其他开放架构有何不同 如果仅从“免费”或“开放”这两点来评判,RISC-V架构并不是第一个做到免费或开放的处理器架构。 在开始之前,我们先通过论述几个具有代表性的开放架构,来分析RISC-V架构的不同之...
  • RISC-V架构学习

    千次阅读 2020-05-24 16:28:46
    RISC-V架构RISC-V简介RISC-V起源RISC-V大事件RISC-V 指令特点设计哲学-简单就是美无病一身轻——架构的篇幅能屈能伸——模块化的指令集浓缩的都是精华——指令的数量RISC-V指令集简介模块化的指令子集规整的指令编码...
  • 请教:怎样用最小代价实现双电源供电自动切换,希望压降在0.2V以内 就是两个电源,比如一个接USB,一个接电池供电。 怎样实现自动切换电源供电,当不插入USB时,由电池盒供电,当插入USB时,由USB供电。 用...
  • demo,仅作记忆使用。 emm…结构问题,有点吃藕’ template: <div class="con"> <ul class="con-list"> <li class="con-item" v-for="(item,index) in list" :key="index" @click="son(item,...
  • LWIP v1.4.1和v2.1.0的对比

    万次阅读 2018-10-06 22:43:49
    一直想写点什么,又不知道要写什么,总是感觉学的很多,用的很少,学的很慢,忘得很快,但是学还是要学的,以前在学FreeRTOS的时候就学一点然后用文档记录一点,整理了点东西,当时没发出来,这会再去发出来还要重新...
  • mpvue入坑之v-for问题

    千次阅读 2019-04-30 09:53:21
    在项目的开发中循环渲染是不可避免的,mpvue中和原生vue一样拥有v-for这个遍历属性。但是实际使用时不小心就会出问题,会给你一个should hava explicit keys 错误提示? 代码 这是段异常代码,会引起上面说的 should...
  • 随需而变,拥抱CMMI V2.0新时代

    千次阅读 2018-07-04 14:00:43
    CMMI DEV V2.0在2018年3月底正式发布,这是CMMI从卡内基梅隆大学软件工程研究所剥离出来、归并入国际信息系统审计协会(ISACA)之后的第一次版本更新,自2011年11月SEI发布CMMIV1.3版本之后,已经历时七年没有更新...
  • hyper-v检查点

    千次阅读 2019-03-26 17:15:19
    hyper-v检查点一定要慎用 情况描述:我在生产环境的宿主机(win server2012R2)上开始一台存储数据的linux虚拟机(hyper-v开设)。...考虑过硬盘不够,但是当时检查点文件很,于是。。。。周一上班后发...
  • 3.7V升压9V方案对比---万用表改装

    千次阅读 2019-01-06 21:51:55
    最近在X宝上搜索3.7V升压9V关键词,结果出来很多升压板(PL2628)。还记得在2016年时搜索类似关键字,却很少有卖,当时买了一家使用SD6271的升压方案,这些年一直在万用表里用着,一年充不了几次电,没出过问题。...
  • @[TOC](RISC-V ISA 学习笔记(一)) (1)RISC-V指令集介绍 RISCV指令集是UC Berkley 大学设计的第五代开源 RISC ISA, V 暗示了支持变种(Variations)和向量(Vector),其中数据的并型加速功能也是设计的明确目标,这...
  • 软件测试V模型简介

    万次阅读 2018-03-07 21:14:33
    V模型大体可以划分为以下几个不同的阶段步骤:需求分析、概要设计、详细设计、软件编码、单元测试、集成测试、系统测试、验收测试。需求分析即首先要明确客户需要的是什么,需要软件做成什么样子,需要有哪几项功能...
  • 不瞒大家说,通过写作,我认识了太多太多优秀的年轻人,JavaGuide 就是其中的一位——胖嘟嘟的可爱,在 GitHub 上开源的同名项目足足有 98.1k 的星标,实名羡慕了! 2021 年的 1 月份,他的《JavaGuide 面试突击版...
  • 最近伙伴在写vue页面的时候发生了一个操作:用v-for生成了多个input,然后他把input的数据用v-model双向绑定到了一个数组cur里面。大概是这样写的v-for ··········v-model="cur[index]"具体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 524,443
精华内容 209,777
关键字:

怎么让小v出来