百度前端学院task33源码及总结——听指令的小方块

任务描述

  • 如图,实现一个类似棋盘的格子空间,每个格子用两个数字可以定位,一个红正方形的DOM在这个空间内,正方形中的蓝色边表示这是他的正面,有一个input输入框
  • 在输入框中允许输入如下指令,按下按钮后,使得正方形做相应动作
    • GO:向蓝色边所面向的方向前进一格(一格等同于正方形的边长)
    • TUN LEF:向左转(逆时针旋转90度)
    • TUN RIG:向右转(顺时针旋转90度)
    • TUN BAC:向右转(旋转180度)
  • 移动不能超出格子空间

分析:

  

源代码:

<!doctype html>
<html>
  <head>
    <title>听指令的小方块  by huansky</title>
    <meta charset="utf-8"/>
    <style type="text/css">
    h1 {
      font:400 16px/1 "Microsoft YaHei",KaiTi_GB2312,SimSun;
      text-align: center;
    }
    #main{
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translateY(-50%) translateX(-50%); 

    }
    #container{
      position: relative;
      border: 1px solid #ddd;
      width: 500px;
      height: 500px;
    }
    span{
      width: 50px;
      height: 50px;
      border: 1px solid #ddd;
      float: left;
      -moz-box-sizing: border-box;  /*Firefox3.5+*/
      -webkit-box-sizing: border-box; /*Safari3.2+*/
      -o-box-sizing: border-box; /*Opera9.6*/
      -ms-box-sizing: border-box; /*IE8*/
      box-sizing: border-box; /*W3C标准(IE9+,Safari5.1+,Chrome10.0+,Opera10.6+都符合box-sizing的w3c标准语法)*/
    }
    #box{
      position: absolute;
      width: 50px;
      height: 50px;
      -moz-box-sizing: border-box;  /*Firefox3.5+*/
      -webkit-box-sizing: border-box; /*Safari3.2+*/
      -o-box-sizing: border-box; /*Opera9.6*/
      -ms-box-sizing: border-box; /*IE8*/
      box-sizing: border-box; /*W3C标准(IE9+,Safari5.1+,Chrome10.0+,Opera10.6+都符合box-sizing的w3c标准语法)*/
    }
    #box .up{
      background: blue;
      height: 10px;
      width: 100%;
      position: relative;
      border: none;
    }
    #box .down{
      background: red;
      height: 40px;
      width: 100%;
      position: relative;
      border: none;
    }
    p{
      color: red;
      text-align: center;
    }
    input{
      margin: 6px;
    }
  </style>
</head>
<body>
  <div id="main">
    <h1>听指令的小方块 by huansky</h1>
    <p id="message"></p>
    <div id="container">
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span>
      <div id="box"><span class="up"></span><span class="down"></span></div>
      <span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
      <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
    </div>
    <br>
    <label><input type="text" id="invalue">请输入命令:go, left, right, back; 不区分大小写</label>
    <div id="btndir"><input type="button" id="excute" value="执行">
      <input id="go" type="button" value="GO">
      <input id="tunLef" type="button" value="LEFT">
      <input id="tunRig" type="button" value="RIGHT">
      <input id="tunBac" type="button" value="BACK">
    </div>
  </div>
</body>
<script type="text/javascript">

    //将所有的变量都放在moveBox里面。
    var moveBox={
        box:getid("box") ,  //获取小块的id
        invalue:getid("invalue") ,  //输入框的id
        btndir:getid("btndir"),     //获取按钮容器的id
        left:100,     //左边距
        topl:100,     //上边距
        direction:1,  //(0代表左,1代表up,2代表右,3代表down)
        current:0,    //当前角度
        message:getid("message")    //获取信息id
    }

    //获取id方法
    function getid(id){
      return document.getElementById(id);
    }

    //根据指令进行相应的旋转
    function rotate(dir){

        switch(dir){
          case "left":
            moveBox.current = (moveBox.current-90)%360;  //计算当前需要转的角度
            draw();
            moveBox.direction--;  //改变方向
            break;

          case "right":
            moveBox.current = (moveBox.current+90)%360;  //计算当前需要转的角度
            draw();
            moveBox.direction++;  //改变方向
            break;

          case "back":
          moveBox.current = (moveBox.current+180)%360;  //计算当前需要转的角度
            draw();
            moveBox.direction++;
            moveBox.direction++;  //改变方向
            break;
          case "go":
            go();
            break;
        }
  }

    function go(){
        //修正方向,使其在[0,4)之间
        moveBox.direction=moveBox.direction % 4+(moveBox.direction % 4 < 0 ? 4 : 0);

        if(moveBox.direction==0 && moveBox.left>0){
          moveBox.left=moveBox.left-50;
          draw();
        }else if(moveBox.direction==1 && moveBox.topl>0 ){
          moveBox.topl=moveBox.topl-50;
          draw();
        }else if(moveBox.direction==2 && moveBox.left<450){
          moveBox.left=moveBox.left+50;
          draw();
        }else if(moveBox.direction==3 && moveBox.topl<450){
          moveBox.topl=moveBox.topl+50;
          draw();
        } else {
          //当超出界限的时候,弹出提醒信息
          moveBox.message.innerHTML="移动不能超出格子空间";
        }
    }

    //事件绑定函数
    function on(element,eventName,listener){

        if (element.addEventListener){
            element.addEventListener(eventName,listener,false);
        }
        else if (element.attachEvent){
            element.attachEvent(‘on‘+eventName,listener);
        }
        else
            element[‘on‘+eventName]=listener;
    }

    //进行事件绑定
    on(btndir,"click",function(dir){

        var e=window.event||event;
        var target=e.target  || e.srcElement;
        dir=target.id
        switch(target.id){
          case "tunLef":
            rotate("left");
            break;
          case "tunRig":
            rotate("right");
            break;
          case "tunBac":
            rotate("back");
            break;
          case "go":
            go();
            break;
          case "excute":
            var dir=moveBox.invalue.value.toLowerCase();
            rotate(dir);
            break;
        }
    });

    //重绘小块的样式
    function draw(){
      moveBox.box.style.cssText=‘transform:rotate(‘+ (moveBox.current) +‘deg);‘;
      moveBox.box.style.left=moveBox.left+"px";
      moveBox.box.style.top=moveBox.topl+"px";
      moveBox.message.innerHTML="";
    }

    draw(); //显示

</script>
</html>

时间: 2024-11-08 12:57:03

百度前端学院task33源码及总结——听指令的小方块的相关文章

百度前端技术学院task35源代码——听指令的小方块3

任务描述 如图,命令输入框由input变为textarea,可以允许输入多条指令,每一行一条 textarea左侧有一列可以显示当前行数的列(代码行数列),列数保持和textarea中一致 当textarea发生上下滚动时,代码行数列同步滚动 能够判断指令是否合法,不合法的指令给出提示(如图) 点击执行时,依次逐条执行所有命令 对于GO,TRA以及MOV指令增加可以移动格子数量的参数,例如 GO 3:向当前方向前进三格 TRA TOP 2:向屏幕上方平移两格 MOV RIG 4:方向转向屏幕右侧

百度网盘采集源码 ,直接采集网盘添加cookies功能

名称:百度网盘采集源码 程序语言:php 数据库:mysql 程序介绍: 1.直接采集百度网盘url 2.前端基于bootstrap 3.搜索考虑到后期上亿数据,是基于coreseek,搜索时间毫秒级. 4.前后端做了非常极致的seo优化 5.资源详情页面 为了使内容聚合度.相关度增加,添加了相关内容 6.精准分词功能 7.热门词自动采集 ps:修修补补将近2个月时间,最终开发完成,在seo方面下了很大功夫,有需要的可以联系 q-q:3420435647 演示网站:http://www.blue

百度前端学院---小薇学院---任务---12

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 tr th { 8 color: #fff; 9 background-color: #000; 10 } 11 12 tbody tr:nth-child(1), 13 tbody tr:nth-child(2), 14

细读百度地图点聚合源码(下)---Renderer类解析

上一篇文章分析了ClusterMananger的整体结构和核心算法 细读百度地图点聚合源码(上),此文是接着上一篇来的. 在本文中,我们将学习如何在UI线程中做大量的操作,并且不会造成界面卡顿. 上次我们讲到ClusterManager类中的cluster()方法,调用ClusterTask后台线程处理核心算法,既然有doInBackground()后台任务函数,就会有onPostExecute()函数来处理后台线程返回的结果,这一篇我们就分析怎么处理返回的结果. 那么我们就从返回的结果开始吧!

nginx源码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个web服务器,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是根据配置文件的内容来创建的,在nginx.conf文件中有多少个地址就需要创建多少个监听套接字.这里不说各个结构体的构造 只说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞.接受发送的缓冲区.绑定.监听处理) 2

细读百度地图点聚合源码(上)

之前在项目中需要用到百度地图的点聚合,看了百度提供的demo之后,稍微读了一些源码就能达到需求了,所以并未深入解读源码. 最近有空就把百度实现点聚合的源码从里到外仔细研究了一遍受益良多,在此分享一下. 为了方便研究我把百度demo中点聚合相关的类抽出来,新建了个工程,有需要可以下载来研究.ClusterDemo 整个源码分析过程我分为三个部分: 1.整体结构分析 2.核心算法分析 3.实现点聚合 本篇为上篇,主要分析1,2部分.之后还会有个下篇,着重分析具体如何实现marker点聚合以及一些动画

ZLMusic模仿百度音乐应用项目源码

func stopPlayMusic() { if (self.isStop == true) { self.player.pause() btn .setTitle("播放", forState:UIControlState.Normal) //var paused = player.currentTime self.songImageView.layer.speed = 0.0 }else{ self.player.play() btn .setTitle("暂停&quo

Linux运维学习历程-第十三天-yum前端工具与源码编译安装

yum 前端工具 1.yum 2.源码编译安装http 二.作业: 1.输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序 2.删除kernel包后,无法启动,并恢复之 3.源码安装apache

果子学院Springboot源码解析视频教程

目录: 第1节Spring Boot介绍,源码阅读环境搭建,插件安装[免费观看]00:13:12分钟 第2节Spring源码阅读环境搭建[免费观看]00:19:58分钟 第3节SpringApplication初始化[免费观看]00:20:47分钟 % h8 p; L% a2 b& u' S第4节SpringApplication run方法解析(1)--前3步00:01:29:14:00分钟 第5节SpringApplication run方法解析(2)--第4步(上)00:01:53:39: