visalMemory.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. <template>
  2. <div class="bd activeTask">
  3. <img
  4. @click="screenState()"
  5. src="../../assets/small-big.png"
  6. alt=""
  7. style="
  8. height: 48px;
  9. width: 48px;
  10. position: fixed;
  11. top: 24px;
  12. right: 22px;
  13. cursor: pointer;
  14. "
  15. />
  16. <div class="glass">
  17. <div>
  18. <el-row>
  19. <el-col :span="12">
  20. <h3 class="bTitle">6.视觉空间记忆</h3>
  21. </el-col>
  22. <el-col :span="12" style="text-align: center">
  23. <div
  24. style="
  25. height: 36px;
  26. background: rgba(0, 0, 0, 0.39);
  27. border-radius: 24px;
  28. color: #ffffff;
  29. padding-top: 10px;
  30. margin-left: 250px;
  31. padding-right: 10px;
  32. "
  33. v-if="isbegin == true"
  34. v-bind:text-content.prop="time1 + '(用时)'"
  35. >
  36. 用时
  37. </div>
  38. </el-col>
  39. </el-row>
  40. <el-card
  41. style="
  42. margin-top: 20px;
  43. background-color: white;
  44. width: 90%;
  45. margin-left: 5%;
  46. "
  47. >
  48. <p style="text-align: left">
  49. 屏幕呈现一个方形矩阵,里面的方块随机点亮,需要被试准确记住点亮方块的具体位置,再后续测查中还原点亮方块的位置,同一个难度有2次机会,两次全部做错后结束测试,做对任何一个进行下一难度测试。成绩:做对一个加1分
  50. </p>
  51. </el-card>
  52. </div>
  53. <div class="txt-center">
  54. <el-button
  55. v-if="isbegin == false"
  56. style="margin-top: 10%"
  57. class="start-bb"
  58. @click="begin"
  59. >开始测试>></el-button
  60. >
  61. </div>
  62. <div v-if="isbegin == true">
  63. <div class="rubik">
  64. <div
  65. v-for="(item, index) in imgGroup"
  66. :key="index"
  67. :style="styleItem"
  68. @click="btn(index)"
  69. >
  70. <el-image :src="item.url" />
  71. </div>
  72. </div>
  73. <div class="txt-center">
  74. <!--<el-button style="margin-top: 5px" class="start-bb" @click="check" :disabled="choice">提交</el-button>-->
  75. <el-button style="margin-top: 5px" class="start-bb" @click="throttle" :disabled="choice">提交</el-button>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. </template>
  81. <script>
  82. import screenfull from "screenfull";
  83. export default {
  84. data() {
  85. return {
  86. width: 3, //表示的是方块一行个数
  87. height: 3, //表示的是方块一列的列数
  88. //根据width和height的乘积来生成新的imgGroup,并初始化为全部不亮
  89. leval: 1,
  90. isbegin: false, //是否点击开始按钮
  91. // isdisplaycomplete: false,
  92. time1: "00时00分00秒",
  93. flag1: 0,
  94. flag2: 0,
  95. grades1: 0,
  96. grade: 0,
  97. timer: "",
  98. memoryType: 1,
  99. correlationMemory: "",
  100. status: 1,
  101. userId: "",
  102. choice:true,
  103. ssss:true,
  104. result: 0, //保存第一次测试错误的成绩
  105. /**
  106. * 默认等级是一级,一级点亮三,二级点亮四,点亮的个数为2+leval
  107. * l,w
  108. * 看leval与长和宽的关系,1)33 2)34 l+1 3)44 w+1 4)45 l+1 5)55
  109. * this.width=3 this.height=3(初值) 根据leval的值,及现在的width 和height 的值生成下一等级的weight 和height
  110. *
  111. * 根据weight 和 height 的值来确定 计算方块的长度和宽度,绑定小块的样式
  112. *
  113. *
  114. */
  115. styleItem: {
  116. width: "150px", //绑定的是方块的宽度
  117. height: "150px", //绑定的是方块的高度
  118. background: "#dddddd",
  119. padding: "2px",
  120. "box-sizing": "border-box",
  121. },
  122. buttonItem: {
  123. float: "left",
  124. width: "90px", //绑定的是方块的宽度
  125. height: "90px", //绑定的是方块的高度
  126. background: "#bbbbbb",
  127. padding: "2px",
  128. color: "#ffffff",
  129. },
  130. isArray: [0, 0, 0, 0, 0, 0, 0, 0, 0], //保存的isArray,变
  131. displayArray: [0, 0, 0, 0, 0, 0, 0, 0, 0], //保存生成的亮点与isArray做比较,变
  132. //保存等级1的结果
  133. imgGroup: [
  134. //初始要渲染的数组,变
  135. { url: require("../../../public/static/assets/black.png") },
  136. { url: require("../../../public/static/assets/black.png") },
  137. { url: require("../../../public/static/assets/black.png") },
  138. { url: require("../../../public/static/assets/black.png") },
  139. { url: require("../../../public/static/assets/black.png") },
  140. { url: require("../../../public/static/assets/black.png") },
  141. { url: require("../../../public/static/assets/black.png") },
  142. { url: require("../../../public/static/assets/black.png") },
  143. { url: require("../../../public/static/assets/black.png") },
  144. ],
  145. isShow: true,
  146. throttleTimer: null, //防重复点击
  147. };
  148. },
  149. beforeDestroy() {
  150. clearInterval(this.timer);
  151. },
  152. mounted: function () {
  153. var that = this;
  154. screenfull.request();
  155. document.onkeydown = function (e) {
  156. let key = window.event.keyCode;
  157. if (key === 122) {
  158. e.preventDefault();
  159. screenfull.toggle();
  160. }
  161. };
  162. },
  163. methods: {
  164. screenState() {
  165. screenfull.toggle();
  166. },
  167. btn(i) {
  168. if (this.isShow) {
  169. return;
  170. }
  171. //点击的时候改变isArray的值,作为最终的结果要比较
  172. if (this.isArray[i] == 0) {
  173. this.isArray[i] = 1;
  174. this.imgGroup[
  175. i
  176. ].url = require("../../../public/static/assets/light.png");
  177. console.log("亮了");
  178. } else if (this.isArray[i] == 1) {
  179. this.isArray[i] = 0;
  180. this.imgGroup[
  181. i
  182. ].url = require("../../../public/static/assets/black.png");
  183. console.log("灭了");
  184. }
  185. },
  186. //生成一个随机函数,输入获取随机数的个数和最大值,产生n个不同的随机数
  187. randomLight(n, max) {
  188. var s = new Set();
  189. var i = 0;
  190. while (i < n) {
  191. var a = Math.floor(Math.random() * max);
  192. s.add(a);
  193. i = s.size;
  194. }
  195. return s;
  196. },
  197. randomImage() {
  198. this.isShow = true;
  199. this.set = this.randomLight(this.leval + 2, this.width * this.height); //返回产生的n个随机值
  200. for (let x of this.set) {
  201. this.displayArray[x] = 1;
  202. this.imgGroup[
  203. x
  204. ].url = require("../../../public/static/assets/light.png"); //点亮
  205. }
  206. // 延时2秒之后恢复
  207. let _this = this;
  208. _this.choice=true;
  209. setTimeout(function () {
  210. _this.choice=false;
  211. for (let x of _this.set) {
  212. _this.imgGroup[
  213. x
  214. ].url = require("../../../public/static/assets/black.png"); //熄灭
  215. }
  216. _this.isShow = false;
  217. }, 2000);
  218. },
  219. begin() {
  220. //开启定时器
  221. this.beginTest();
  222. var count = 0;
  223. let _this = this;
  224. this.timer = setInterval(function () {
  225. var h = parseInt(count / 1000 / 60 / 60);
  226. var m = parseInt(count / 1000 / 60) % 60;
  227. var s = parseInt(count / 1000) % 60;
  228. h = h < 10 ? "0" + h : h;
  229. m = m < 10 ? "0" + m : m;
  230. s = s < 10 ? "0" + s : s;
  231. _this.time1 = h + "时" + m + "分" + s + "秒";
  232. count = count + 1000;
  233. }, 1000);
  234. },
  235. beginTest() {
  236. //点击开始测试
  237. this.ssss=true;
  238. this.isbegin = true;
  239. this.randomImage();
  240. //开始
  241. let _this = this;
  242. /* setTimeout(function () {
  243. _this.isdisplaycomplete = true;
  244. }, 6000); */
  245. },
  246. check() {
  247. //检查成绩
  248. if (!this.ssss) {
  249. return;
  250. }
  251. this.ssss=false;
  252. this.isShow=true;
  253. console.log("displayArray:" + this.displayArray);
  254. console.log("isArray:" + this.isArray);
  255. /**
  256. * 判断成绩是否正确,正确的保存成绩,进行下一关测试,如果不正确,要不要存储成绩?
  257. * 其次是要考虑如果第二次也没通过,保存的是第一次的成绩还是第二次的成绩
  258. * 考虑第二次如何实现
  259. */
  260. /*
  261. 四种情况
  262. a. 两次都对的 //进入下一个等级 flag2==2
  263. c. 第一次错的,第二次对的 //进入下一个等级 flag1==1 flag2==1
  264. d. 两次都错的 //保存成绩,结束测试flag2==2
  265. b. 第一次对,第二次错的 //进入下一个等级 flag1==1 flag2==1
  266. */
  267. if (this.displayArray.toString() == this.isArray.toString()) {
  268. this.flag2++;
  269. this.result = 0;
  270. /**
  271. * 20210920 应客户要求,暂时注释提示信息
  272. */
  273. // this.$message({
  274. // message: "正确,即将进入下一级测试",
  275. // type: "info",
  276. // });
  277. this.grades1 = this.grades1 + this.leval + 2; //成绩
  278. console.log("成绩正确:" + this.grades1);
  279. //保存这次测试正确的成绩,开始判断此时的测试位于和位置
  280. //a.两次都正确的情况,第一次错,第二次对的情况下,要进入下一等级
  281. if (this.flag2 == 2 || (this.flag1 == 1 && this.flag2 == 1)) {
  282. if (this.flag2 == 2) {
  283. this.grade = this.grade + 2;
  284. console.log("fuck:" + this.grade);
  285. }
  286. if (this.flag1 == 1 && this.flag2 == 1) {
  287. this.grade = this.grade + 1;
  288. console.log("fuck:" + this.grade);
  289. }
  290. //构造第二关布局:
  291. this.leval++; //等级+1
  292. this.flag1 = 0;
  293. this.flag2 = 0;
  294. //先改width和height
  295. if (this.leval % 2 == 0) {
  296. this.height++;
  297. } else {
  298. this.width++;
  299. }
  300. //根据width和height对改变的数组做一系列初始化
  301. let arr1 = new Array(this.width * this.height);
  302. for (var i = 0; i < arr1.length; i++) {
  303. arr1[i] = 0;
  304. }
  305. //重置这两个一个用于保存点亮信息,一个用于比较的数组,一个用于比较的数组
  306. this.isArray = arr1;
  307. let arr3 = new Array(this.width * this.height);
  308. for (var i = 0; i < arr3.length; i++) {
  309. arr3[i] = 0;
  310. }
  311. //重置这两个一个用于保存点亮信息,一个用于比较的数组,一个用于比较的数组
  312. this.displayArray = arr3;
  313. //初始化布局
  314. var w1 = 450 / this.width;
  315. var h1 = 450 / this.height;
  316. var w2 = 270 / this.width;
  317. var h2 = 270 / this.height;
  318. this.styleItem.width = w1.toString() + "px";
  319. this.styleItem.height = h1.toString() + "px";
  320. this.buttonItem.width = w2.toString() + "px";
  321. this.buttonItem.height = h2.toString() + "px";
  322. //初始化ImgGroup
  323. let arr2 = new Array(this.width * this.height);
  324. for (var i = 0; i < arr2.length; i++) {
  325. arr2[i] = {
  326. url: require("../../../public/static/assets/black.png"),
  327. };
  328. }
  329. this.imgGroup = arr2;
  330. //开始进行第二关测试
  331. let _this = this;
  332. setTimeout(function () {
  333. _this.beginTest();
  334. // _this.isdisplaycomplete = false;
  335. _this.flag1 = 0; //重置flag
  336. }, 1000);
  337. } else if (this.flag1 == 0 && this.flag2 == 1) {
  338. //第一次正确的话,再测一次
  339. for (let i = 0; i < this.displayArray.length; i++) {
  340. this.displayArray[i] = 0;
  341. this.isArray[i] = 0; //归零
  342. }
  343. for (var i = 0; i < this.imgGroup.length; i++) {
  344. this.imgGroup[
  345. i
  346. ].url = require("../../../public/static/assets/black.png");
  347. }
  348. let _this = this;
  349. setTimeout(function () {
  350. _this.beginTest();
  351. }, 1000);
  352. }
  353. } else {
  354. //成绩不正确
  355. this.flag1++;
  356. console.log("flag1:" + this.flag1);
  357. let g1 = 0;
  358. for (let i = 0; i < this.displayArray.length; i++) {
  359. if (
  360. this.displayArray[i] == this.isArray[i] &&
  361. this.displayArray[i] == 1
  362. ) {
  363. g1++; //计算成绩
  364. }
  365. }
  366. this.grades1 = this.grades1 + g1;
  367. console.log("成绩:" + this.grades1);
  368. //第一次对了,第二次错了,进入下一关
  369. if (this.flag1 == 1 && this.flag2 == 1) {
  370. this.grade = this.grade + 1;
  371. console.log("fuck:" + this.grade);
  372. this.leval++; //等级+1
  373. this.flag1 = 0;
  374. this.flag2 = 0;
  375. //先改width和height
  376. if (this.leval % 2 == 0) {
  377. this.height++;
  378. } else {
  379. this.width++;
  380. }
  381. //根据width和height对改变的数组做一系列初始化
  382. let arr1 = new Array(this.width * this.height);
  383. for (var i = 0; i < arr1.length; i++) {
  384. arr1[i] = 0;
  385. }
  386. //重置这两个一个用于保存点亮信息,一个用于比较的数组,一个用于比较的数组
  387. this.isArray = arr1;
  388. let arr3 = new Array(this.width * this.height);
  389. for (var i = 0; i < arr3.length; i++) {
  390. arr3[i] = 0;
  391. }
  392. //重置这两个一个用于保存点亮信息,一个用于比较的数组,一个用于比较的数组
  393. this.displayArray = arr3;
  394. //初始化布局
  395. var w1 = 450 / this.width;
  396. var h1 = 450 / this.height;
  397. var w2 = 270 / this.width;
  398. var h2 = 270 / this.height;
  399. this.styleItem.width = w1.toString() + "px";
  400. this.styleItem.height = h1.toString() + "px";
  401. this.buttonItem.width = w2.toString() + "px";
  402. this.buttonItem.height = h2.toString() + "px";
  403. //初始化ImgGroup
  404. let arr2 = new Array(this.width * this.height);
  405. for (var i = 0; i < arr2.length; i++) {
  406. arr2[i] = {
  407. url: require("../../../public/static/assets/black.png"),
  408. };
  409. }
  410. this.imgGroup = arr2;
  411. //开始进行第二关测试
  412. let _this = this;
  413. setTimeout(function () {
  414. _this.beginTest();
  415. // _this.isdisplaycomplete = false;
  416. _this.flag1 = 0; //重置flag
  417. }, 1000);
  418. //如果第一次错了,再测一次
  419. } else if (this.flag1 == 1 && this.flag2 == 0) {
  420. for (let i = 0; i < this.displayArray.length; i++) {
  421. this.displayArray[i] = 0;
  422. this.isArray[i] = 0; //归零
  423. }
  424. for (var i = 0; i < this.imgGroup.length; i++) {
  425. this.imgGroup[
  426. i
  427. ].url = require("../../../public/static/assets/black.png");
  428. }
  429. let _this = this;
  430. setTimeout(function () {
  431. _this.beginTest();
  432. }, 1000);
  433. //如果两次都错了
  434. } else if (this.flag1 == 2) {
  435. console.log("flag1是:" + this.flag1);
  436. console.log("time1是" + this.time1);
  437. clearInterval(this.timer);
  438. //调用save保存成绩,清空定时器,结束测试
  439. var question6 = {
  440. questionNo: "6",
  441. gradea: this.grade,
  442. gradeb: this.leval + 1,
  443. mina: this.time1,
  444. memoryType: this.memoryType,
  445. correlationMemory: this.correlationMemory,
  446. status: this.status,
  447. };
  448. sessionStorage.setItem("question6", JSON.stringify(question6));
  449. //提交成绩
  450. if (this.memoryType == 1) {
  451. //提交数据,路由跳转
  452. this.$router.push("prospectMemory");
  453. }
  454. }
  455. }
  456. },
  457. throttle(){
  458. clearTimeout(this.throttleTimer);
  459. this.throttleTimer = setTimeout(()=>{
  460. this.check();
  461. },500)
  462. },
  463. },
  464. };
  465. </script>
  466. <style scoped>
  467. .bd {
  468. /* margin-top: 20px; */
  469. }
  470. .bTitle {
  471. font-size: 24px;
  472. color: #333333;
  473. text-align: left;
  474. }
  475. .sTitle {
  476. font-size: 20px;
  477. color: #333333;
  478. text-align: left;
  479. }
  480. .rubik {
  481. width: 450px;
  482. height: 450px;
  483. margin: 20px auto;
  484. display: flex;
  485. justify-content: flex-start;
  486. flex-wrap: wrap;
  487. }
  488. #t1 {
  489. font-size: 20px;
  490. margin-top: 30px;
  491. margin-left: 78%;
  492. }
  493. .el-image {
  494. height: 100%;
  495. width: 100%;
  496. }
  497. .activeTask {
  498. background: url(../../assets/congnitiveAblitity/zhixing.png) no-repeat center;
  499. background-size: cover;
  500. /* background: black; */
  501. position: fixed;
  502. top: 0;
  503. left: 0;
  504. right: 0;
  505. bottom: 0;
  506. }
  507. .glass {
  508. width: 932px;
  509. height: 720px;
  510. /* height: 593px; */
  511. background: rgba(255, 255, 255, 0.41);
  512. border: 3px solid rgb(255, 255, 255);
  513. box-shadow: 0px 3px 6px rgba(255, 255, 255);
  514. border-radius: 12px;
  515. margin: 1vh auto;
  516. position: relative;
  517. }
  518. .start-bb {
  519. width: 170px;
  520. height: 48px;
  521. background: rgb(87, 172, 187);
  522. border: 2px solid rgba(255, 255, 255, 0.8);
  523. box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
  524. opacity: 1;
  525. border-radius: 39px;
  526. color: white;
  527. }
  528. </style>