vue通过组件的方式制作教学软件翻牌游戏环节

野生程序猿-杂烧4年前随意分享306

为了方便学生记忆学习,将记忆知识点做成了翻牌游戏形式。

由于记忆点知识比较多,我们可以设计成多个关卡,每个关卡就是一些知识点配置,通过组件的形式加载,更为合理,更为方便。

【fanpai.vue】

<template>
	
	<view class="game_fangpai"   style="margin-left: 5vw; width: 90vw;">
		
		<view class="game_fangpai_top">
			
			<view class="game_fangpai_top_jindu">
				剩余步数:{{shengyu_bushu}}
			</view>
			
			<view class="game_fangpai_top_xingji">
				<image  class="game_fangpai_top_xingji_image"  :src="'../../static/xing_'+game_config.speed+'.png'"  ></image>
			</view>
			
			<view class="game_fangpai_top_daojishi">
				剩余时间:{{daojishi_time}}s
			</view>
		</view>
		<view class="game_fangpai_card" v-for="x in list" @click="click_one(x)">
			<!-- <view class="game_fangpai_card__zhedang" v-if="list_obj[x.id].finish==1">
				
			</view> -->
			<view :class="'game_fangpai_card__side game_fangpai_card_front_'+fanzhuan_statu[x.id]" >
				<view class="game_fangpai_card__text"  >
				
				{{x.text}}
				</view>
				
				<image  class="game_fangpai_card__bg"   src="../../static/feiji_bg2.png"  v-if="list_obj[x.id].finish!=1" ></image>
				<image  class="game_fangpai_card__bg"   src="../../static/feiji_bg3.png"  v-if="list_obj[x.id].finish==1" ></image>
				<!-- <text v-if="list_obj[x.id].finish==1">success</text> -->
			</view>		
					
			<view :class="'game_fangpai_card__side  game_fangpai_card_backx game_fangpai_card_back_'+fanzhuan_statu[x.id]" >
				<image  class="game_fangpai_card__bg"  src="../../static/feiji_bg1.png"  ></image>
			</view>	
		</view>	
		<view class="game_fangpai_bottom_jindu">
			{{config_index*2}}/{{config_bak.length*2}}
		</view>
		
		<view v-if="game_waiting==1" style="position: fixed; top:0;left:0; z-index: 999; width: 100vw; height: 100vh;line-height: 100vh; ">
			<view style="height: 10vw; line-height: 10vw; border-radius: 5vw; width: 70vw; margin: 43vh auto 0 auto; background: rgba(0,0,0,0.2); color: #fff; font-size: 4vw; text-align: center;">
			即将开始新的挑战
			</view>
		</view>	
			
	
		
		
		
		
	</view>
	

</template>
<style>
	.game_fangpai_top { width: 84vw; margin-left: 2vw; height: 10vw;  display: flex; justify-content: center;align-items:center;}
	.game_fangpai_top_xingji_image { width: 15.5vw; height: 10vw; position: absolute; margin-top: -7vw; margin-left: 4.3vw;}
	.game_fangpai_top .game_fangpai_top_jindu {  width: 30vw; font-size:3.5vw;text-align: left;}
	.game_fangpai_top .game_fangpai_top_xingji { flex: 1; font-size:3.5vw; }
	
	.game_fangpai_top .game_fangpai_top_daojishi { width: 30vw;font-size:3.5vw; text-align: right;}
	
	.game_fangpai { position: absolute; z-index: 1;  background: rgba(0,0,0,0);}
	.game_fangpai .game_fangpai_card {
	  -webkit-perspective: 150vw;
	          perspective: 150vw;
	  -moz-perspective: 150vw;
	  position: relative;
	  height: 25vw; line-height:25vw ; text-align: center;
	  width: 40vw; float: left; margin: 2vw;
	  moz-user-select: -moz-none;
	  -moz-user-select: none;
	  -o-user-select:none;
	  -khtml-user-select:none;
	  -webkit-user-select:none;
	  -ms-user-select:none;
	  user-select:none;
	  
	}
	
	.game_fangpai .game_fangpai_card .game_fangpai_card__zhedang {
		position: absolute; z-index: 99; width: 40vw; height: 25vw; background: rgba(255,0,0,0.05);
		border-radius: 2vw;
		-webkit-box-shadow: 0 1.5vw 4vw rgba(255, 0, 0, 0.65);
		        box-shadow: 0 1.5vw 4vw rgba(255, 0, 0, 0.65);
		
	}
	.game_fangpai .game_fangpai_card .game_fangpai_card__side {
		text-align: left;;
		 height: 25vw;
		  -webkit-transition: all 0.8s ease;
		  transition: all 0.8s ease;
		  position: absolute;
		  top: 0;
		  left: 0;
		  width: 40vw;
		  -webkit-backface-visibility: hidden;
		          backface-visibility: hidden;
		  border-radius: 2vw;
		  overflow: hidden;
		  -webkit-box-shadow: 0 1.5vw 4vw rgba(0, 0, 0, 0.15);
		          box-shadow: 0 1.5vw 4vw rgba(0, 0, 0, 0.15);
				  
				  
		-moz-user-select:none;
		      -webkit-user-select:none;
		      user-select:none;    
				  
				  
				  
	}
	.game_fangpai .game_fangpai_card .game_fangpai_card_backx {
/* 			-webkit-transform: rotateY(180deg);
          transform: rotateY(180deg); */
	}		
	.game_fangpai .game_fangpai_card .game_fangpai_card_front_1 {
		  -webkit-transform: rotateY(-180deg);
		          transform: rotateY(-180deg);
	}
	.game_fangpai .game_fangpai_card .game_fangpai_card_back_1 {
		  -webkit-transform: rotateY(0deg);
		          transform: rotateY(0deg);
	}
	.game_fangpai .game_fangpai_card .game_fangpai_card_front_2 {
		  -webkit-transform: rotateY(0deg);
		          transform: rotateY(0deg);
	}
	.game_fangpai .game_fangpai_card .game_fangpai_card_back_2 {
		  -webkit-transform: rotateY(180deg);
		          transform: rotateY(180deg);
	}		
	
	.game_fangpai_card__bg {
		position: absolute; z-index: 11;
		 width: 40vw; height: 25vw; margin:0vw 0 0 0vw;
		 
	}

	.game_fangpai_card__text {
		position: absolute; z-index: 21;
		width: 40vw; height: 25vw; margin:0vw 0 0 0vw; font-size: 3.8vw; color: #fff; font-weight: bold;
		text-align: center; 
	}
	
	.game_fangpai_bottom_jindu {width: 100%; height: 10vw; line-height: 10vw;font-size: 3.8vw; color: #fff; font-weight: bold; text-align: center;}
</style>
<script>
	import base from '../../src/base.js'
	import music from '../../src/music.js'
	export default {
		name: 'GameFanpai',

		created() {

			

		},
		data() {
			return {
				tag_pause:false,
				tag_hide:false,
		
				is_gameover:false,
				config_bak:[],
				config:[],
				config_index:0,
				game_config:{},
	
				speed_time:{
					"1":30,
					"2":25,
					"3":20
				},
				step_num:{
					"1":30,
					"2":25,
					"3":20
				},
				list_obj:{},
				list:[],



				app_config:base.app_config(),
				is_start:false,
				bg_music:null,
				fanzhuan_statu:{
					
				},
				active_id:null,
				daojishi_time:null,
				game_waiting:0,
				daojishi_index:null,
				shengyu_bushu:0,
				zuida_bushu:0

			}
		},
		
	   
		onReady() {
			// 页面打开自动打开对话框
			console.log('onReady');
			

		},

		methods: {
			init(config,game_config){
				//config 游戏数据配置 学习元素 三字代码部分的数据   [[a1,b1],[a2,b2],[a3,b3][a4,b4]]
				//game_config 游戏方法,背景等配置
				console.log('init');
				console.error(config);
				console.error(game_config);
				this.config_bak=config;
				
				this.game_config=game_config;
				if(this.game_config.speed>3)
				{
					this.game_config.speed=3;
				}
				this.start_one();
			}
			//单页面的开始
			,start_one()
			{
				//得到config config_index开始 8个
				var max_index=this.config_index+4;
				if(max_index>this.config_bak.length)
				{
					max_index=this.config_bak.length;
				}
				var config_new=[];
				for(let i=this.config_index;i<max_index;i++)
				{
					config_new.push(this.config_bak[i]);
				}
				this.config=config_new;
				this.config_index=max_index;
				this.reload_one();
				
			}
			,getinfo()
			{
				var jindu=Math.floor(((this.config_index-4)*100)/this.config_bak.length);
				var wrong_list=[];
				for(let i in this.list)
				{
					if(this.list[i].text==this.list[i].key)
					{
						wrong_list.push(this.list[i].text);
					}
					
				}
				var wrong=wrong_list.join(",");
				var result={
					jindu:jindu,
					wrong:wrong,
					speed:this.game_config.speed
				};
				return result;
				
			}
			,reload_one()
			{
				var that=this;
				this.daojishi_time=this.speed_time[this.game_config.speed];
				this.zuida_bushu=this.step_num[this.game_config.speed];
				this.shengyu_bushu=this.zuida_bushu;
				
				
				
				this.config_list(this.config);//乱序成 游戏list obj数据
				for(let i in this.list)
				{
					this.list_obj[this.list[i].id].finish=0;
					this.fanzhuan_statu[this.list[i].id]=1;
				}
				console.error(this.list);
				console.error(this.fanzhuan_statu);
				this.is_gameover=false;
				this.active_id=null;
				this.play();
				try{
					clearTimeout(that.daojishi_index);
				}catch(e){}
				this.daojishi();
			}
			,click_one_bushu()
			{
				if(this.shengyu_bushu>0)
				{
					this.shengyu_bushu=this.shengyu_bushu-1;
					return true;
				}else{
					return false;
				}
				
			}
			,click_one(obj)
			{
				console.log(obj);
				console.log(this.list_obj);
				if(this.list_obj[obj.id].finish==1)
				{
					console.error('finish no*********');
					return false;
				}


				
				//步数结束了,不可以点
				console.error('剩余步数-前',this.shengyu_bushu,this.is_gameover);
				if(this.click_one_bushu()==false)
				{
					return false;
				}
				
				this.music_click();
				if(!this.active_id)
				{
					//如果空的,直接翻牌 并设置为当前id
					console.log('如果空的,直接翻牌');
					this.fanzhuan_statu[obj.id]=2;
					this.active_id=obj.id;
				}else{
					
					
					
					//如果不是空的,成对不成对
					//如果是当前翻回去
					//如果不是当前1:成对 配对,并且active空
					//如果不是当前2:不成对 老的翻回去,并且active为当前
					if(this.active_id==obj.id)
					{
						console.log('如果是当前翻回去');
						this.fanzhuan_statu[obj.id]=1;
						this.active_id=null;

					}else{
						//如果不是当前1:成对 配对,并且active空
						if(this.list_obj[obj.id].key==this.list_obj[this.active_id].key)
						{
							console.log('如果不是当前1:成对 配对,并且active空');
							this.fanzhuan_statu[obj.id]=2;
							this.list_obj[obj.id].finish=1;
							this.list_obj[this.active_id].finish=1;
							this.active_id=null;
							if(this.check_success()==true)
							{
								this.tag_pause=true;
								this.game_over('success');
								return true;
							}
						}else{
						//如果不是当前2:不成对 老的翻回去,并且active为当前
							console.log('如果不是当前2:不成对 老的翻回去,并且active为当前');
							this.fanzhuan_statu[this.active_id]=1;
							this.fanzhuan_statu[obj.id]=2;
							this.active_id=obj.id;
						}
					}
				}
				console.error('剩余步数-后',this.shengyu_bushu,this.is_gameover);
				//点击后步数为0 游戏结束
				if(this.shengyu_bushu<=0 && this.is_gameover!=true)
				{
					this.tag_pause=true;
					this.game_over('time_up');
				}
				
				
				
				/*
				if(this.fanzhuan_statu[obj.id]==1)
				{
					this.fanzhuan_statu[obj.id]=2;
				}else{
					this.fanzhuan_statu[obj.id]=1;
				}
				*/
				this.$forceUpdate();
			}
			
			
			,config_list(config)
			{
				//config 转游戏的list数据
				var zhengxu_a=[];//[0,1,2,3,4,5,6,7];  一般是8个
				for(let i=0;i<config.length*2;i++)
				{
					zhengxu_a.push(i);
				}
				var luanxu_a=base.arr_rand(zhengxu_a);
				
				var config_list=[];
				let id=0;
				for(let i in config)
				{
					id++;
					var obj1={
						text:config[i][0]
						,key:config[i][1]
						,id:id
						,finish:0
						
					};
					id++;
					var obj2={
						text:config[i][1]
						,key:config[i][1]
						,id:id 
						,finish:0
						
					};
					config_list.push(obj1);
					config_list.push(obj2);
				}				
				
				var list=[];//8个4组数据 [{text:'中文',key:'abc'},{text:'中文2',key:'efg'}]
				var list_obj={};
				for(let i in luanxu_a)
				{
					var this_index=luanxu_a[i];
					list.push(config_list[this_index]);
					list_obj[config_list[this_index].id]=config_list[this_index];
				}
				this.list=list;
				this.list_obj=list_obj;
				console.log(list);
				this.$forceUpdate();
			}
			,go_start(){
				//this.dingshi_xiaoluo();
				//this.dingshi_donghua();
				this.is_start=true;
				this.music_bg_start();
			}

			,on_hide(){
				this.tag_hide=true;
				console.log('GAME Hide',new Date().getTime());
			}
			,on_show(){
				this.tag_hide=false;
				console.log('GAME Show',new Date().getTime());
			}

			,pause(){
				this.tag_pause=true;
				this.music_bg_stop();
			}
			,play()
			{
				this.tag_pause=false;
				this.music_bg_start();
			}
			,daojishi()
			{
				var that=this;
				//console.log('daojishi',this.tag_pause);
				if(this.tag_pause==true)
				{
					that.daojishi_index=setTimeout(()=>{
						
						this.daojishi();
					},1000);
				}else{
					if(this.daojishi_time>0)
					{
						that.daojishi_index=setTimeout(()=>{
							this.daojishi_time=this.daojishi_time-1;
							if(this.daojishi_time<0)
							{
								this.daojishi_time=0;
							}
								this.daojishi();
							
							
						},1000);					
					}else{
						this.game_over('time_up');
					}
					
				}

			}
			
			
			,check_success()
			{
				var result=true;
				for(let i in this.list_obj)
				{
					if(this.list_obj[i].finish==0)
					{
						result=false;
						break;
					}
				}
				return result;
			}
			,game_over(str)
			{
				var that=this;
				this.music_bg_stop();
				this.is_gameover=true;
				var info=this.getinfo();
				console.error('game_over',str);
				console.error(info);
				
				try{
					clearTimeout(that.daojishi_index);
				}catch(e){}
				
				
				
				if(str=='success')
				{
					//如果不是最后一次,下一关
					if(this.config_index>=this.config_bak.length)
					{
						this.music_success();
						if(this.game_config.success_back)
						{	
							
							this.game_config.success_back(info);
						}
					}else{
						this.game_waiting=1;
						setTimeout(()=>{
							this.game_waiting=0;
							this.start_one();
						},1500);
						
					}
					
					
				}else{
					this.music_fail();
					if(this.game_config.fail_back)
					{
						this.game_config.fail_back(info);
					}
					
				}
				
			}
			
			
			
			
			
			,music_click()
			{
				let innerAudioContext = uni.createInnerAudioContext();
				innerAudioContext.autoplay = false;
				//innerAudioContext.src = '../../static/pengzhuang.mp3';
				//innerAudioContext.src = music.music_click();
				innerAudioContext.src = this.app_config.server_url+'static/click.mp3';
				innerAudioContext.play();
			}
			
			,music_success()
			{
				let innerAudioContext = uni.createInnerAudioContext();
				innerAudioContext.autoplay = false;
				//innerAudioContext.src = '../../static/tongguan_success.mp3';
				//innerAudioContext.src = music.music_success();
				innerAudioContext.src = this.app_config.server_url+'static/success.mp3';
				innerAudioContext.play();
			}
			,music_fail()
			{
				let innerAudioContext = uni.createInnerAudioContext();
				innerAudioContext.autoplay = false;
				//innerAudioContext.src = '../../static/tongguan_fail.mp3';
				//innerAudioContext.src = music.music_fail();
				innerAudioContext.src = this.app_config.server_url+'static/fail.mp3';
				innerAudioContext.play();
			}
			,music_bg_start()
			{
				this.music_bg_stop();
				let innerAudioContext = uni.createInnerAudioContext();
				innerAudioContext.autoplay = true;
				innerAudioContext.volume =0.9;
				innerAudioContext.loop = true;
				innerAudioContext.src = this.app_config.server_url+'static/bg12.mp3';
				console.log(innerAudioContext.src);
				innerAudioContext.play();
				innerAudioContext.onPlay(() => {
				  console.log('开始播放');
				});
				innerAudioContext.onError((res) => {
				  console.log(res);
				  
				});
				this.bg_music=innerAudioContext;
			}
			,music_bg_stop()
			{
				let that=this;
				console.log("stop");
				try{
					that.bg_music.stop();
				}catch(e){}
			}

		},
		/**
		 * 拦截应用返回事件,仅仅 app 端生效
		 */
		onBackPress() {
	
		}
	}
</script>

<style>
</style>

【page】

<view  style="width: 98vw; margin-left: 1vw;" >
				<GameFanpai  ref="game" ></GameFanpai>

						
			</view>	
<script>
import GameFanpai from '@/components/game/fanpai.vue'
export default {
		components: {
			MyBase,
			GameFanpai,
			...
		}
		...
		onLoad(options) {
			let that=this;
						
			this.game_config.speed=3;


			this.game_config.fail_back=function(obj){
				
				console.log('fail_back');
				that.fail_back(obj);
				
			}
			this.game_config.success_back=function(obj){
				console.log('success_back');
				that.success_back(obj);
			}  
		},
</script>


标签: vue

相关文章

前端的多端适配-硬件接口篇

前端的多端适配-硬件接口篇

我们在多端开发的时候经常会遇到硬件接口的坑,比方调用扫一扫。h5网页要扫一扫,小程序要扫一扫,app也要扫一扫。我们 正常都是一边开发,一边h5端网页调试。但是h5端根本没有办法扫一扫啊?没有支付啊?...

vue编译成微信小程序的坑

uniapp最大的好处是方便,最大的问题就是编译后多端的异常难以排查。h5端一切正常,在其他端异常。代码不存在语法上的错误,几乎都是平台的差异性导致的,这个时候多半是经验积累不够,坑踩得不够多。很多时...

vue的部分文字选中效果-选中变色

vue的部分文字选中效果-选中变色

我们在检索或者要突出部分文字重要的时候,都会有选中变色的效果。vue的文字选中变色研究了一下,没有找到很快速的方法。只能把文字字符串变成了list,然后js循环每个字符,把需要变色的字符找到。<...