整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

程序员写这个javascript项目,只是为了祭奠某些东西!

击查看打砖块游戏

HTML5/javascript打砖块!模块化开发思维!


动态的图有点丢帧,所以看起来很难受,实际效果可以,可以用左键和右键,也可以用鼠标控制!现在这样的小游戏一般都是基于HTML5/canvas画布来做的,这个也不例外,当然核心的还是javascript的控制,这里的代码量正好是200行,绝大部分是javascript来处理各种事件,包括核心的碰撞事件的检测以及响应,我们小时候玩的小游戏一般逻辑思维都很简单,但是具体用javascript去实践的时候,那必须有比较扎实的基础才可以,我一直建议学习前端的伙伴,把原生javascript学好,在现在的前端市场,原生javascript已经越来越重要!需要更多前端学习视频或者资料的可以去我前面的文章找哟,以下附上本项目的源码!


HTML5/javascript打砖块源码:

代码过长需要文档版源码来我的前端群570946165,已上传到群文件

HTML5/javascript代码量有点大,所以只能以动图的格式发送,请见谅,有需要的的可以加一下!

扣 554. 砖墙

题目描述

你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和相等。

你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的

给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量

示例 1:

输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
输出:2


示例 2:

输入:wall = [[1],[1],[1]]
输出:3


提示:

  • n == wall.length
  • 1 <= n <= 10^4
  • 1 <= wall[i].length <= 10^4
  • 1 <= sum(wall[i].length) <= 2 * 10^4
  • 对于每一行 i ,sum(wall[i]) 是相同的
  • 1 <= wall[i][j] <= 2^31 - 1


解决方案

方法一:哈希表

思路及算法

由于砖墙是一面矩形,所以对于任意一条垂线,其穿过的砖块数量加上从边缘经过的砖块数量之和是一个定值,即砖墙的高度。

因此,问题可以转换成求「垂线穿过的砖块边缘数量的最大值」,用砖墙的高度减去该最大值即为答案。

虽然垂线在每行至多只能通过一个砖块边缘,但是每行的砖块边缘也各不相同,因此我们需要用哈希表统计所有符合要求的砖块边缘的数量。

注意到题目要求垂线不能通过砖墙的两个垂直边缘,所以砖墙两侧的边缘不应当被统计。因此,我们只需要统计每行砖块中除了最右侧的砖块以外的其他砖块的右边缘即可。

具体地,我们遍历砖墙的每一行,对于当前行,我们从左到右地扫描每一块砖,使用一个累加器记录当前砖的右侧边缘到砖墙的左边缘的距离,将除了最右侧的砖块以外的其他砖块的右边缘到砖墙的左边缘的距离加入到哈希表中。最后我们遍历该哈希表,找到出现次数最多的砖块边缘,这就是垂线经过的砖块边缘,而该垂线经过的砖块数量即为砖墙的高度减去该垂线经过的砖块边缘的数量。

C++

class Solution {
public:
    int leastBricks(vector<vector<int>>& wall) {
        unordered_map<int, int> cnt;
        for (auto& widths : wall) {
            int n = widths.size();
            int sum = 0;
            for (int i = 0; i < n - 1; i++) {
                sum += widths[i];
                cnt[sum]++;
            }
        }
        int maxCnt = 0;
        for (auto& [_, c] : cnt) {
            maxCnt = max(maxCnt, c);
        }
        return wall.size() - maxCnt;
    }
};

Java

class Solution {
    public int leastBricks(List<List<Integer>> wall) {
        Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();
        for (List<Integer> widths : wall) {
            int n = widths.size();
            int sum = 0;
            for (int i = 0; i < n - 1; i++) {
                sum += widths.get(i);
                cnt.put(sum, cnt.getOrDefault(sum, 0) + 1);
            }
        }
        int maxCnt = 0;
        for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {
            maxCnt = Math.max(maxCnt, entry.getValue());
        }
        return wall.size() - maxCnt;
    }
}

C#

public class Solution {
    public int LeastBricks(IList<IList<int>> wall) {
        Dictionary<int, int> cnt = new Dictionary<int, int>();
        foreach (IList<int> widths in wall) {
            int n = widths.Count;
            int sum = 0;
            for (int i = 0; i < n - 1; i++) {
                sum += widths[i];
                if (!cnt.ContainsKey(sum)) {
                    cnt.Add(sum, 1);
                } else {
                    cnt[sum]++;
                }
            }
        }
        int maxCnt = 0;
        foreach (var entry in cnt) {
            maxCnt = Math.Max(maxCnt, entry.Value);
        }
        return wall.Count - maxCnt;
    }
}

JavaScript

var leastBricks = function(wall) {
    const cnt = new Map();
    for (const widths of wall) {
        const n = widths.length;
        let sum = 0;
        for (let i = 0; i < n - 1; i++) {
            sum += widths[i];
            cnt.set(sum, (cnt.get(sum) || 0) + 1);
        }
    }
    let maxCnt = 0;
    for (const [_, c] of cnt.entries()) {
        maxCnt = Math.max(maxCnt, c);
    }
    return wall.length - maxCnt;
};

Golang

func leastBricks(wall [][]int) int {
    cnt := map[int]int{}
    for _, widths := range wall {
        sum := 0
        for _, width := range widths[:len(widths)-1] {
            sum += width
            cnt[sum]++
        }
    }
    maxCnt := 0
    for _, c := range cnt {
        if c > maxCnt {
            maxCnt = c
        }
    }
    return len(wall) - maxCnt
}

C

struct HashTable {
    int key, val;
    UT_hash_handle hh;
};

int leastBricks(int** wall, int wallSize, int* wallColSize) {
    struct HashTable* cnt = NULL;
    for (int i = 0; i < wallSize; i++) {
        int n = wallColSize[i];
        int sum = 0;
        for (int j = 0; j < n - 1; j++) {
            sum += wall[i][j];
            struct HashTable* tmp;
            HASH_FIND_INT(cnt, &sum, tmp);
            if (tmp == NULL) {
                tmp = malloc(sizeof(struct HashTable));
                tmp->key = sum, tmp->val = 1;
                HASH_ADD_INT(cnt, key, tmp);
            } else {
                tmp->val++;
            }
        }
    }
    int maxCnt = 0;
    struct HashTable *iter, *tmp;
    HASH_ITER(hh, cnt, iter, tmp) {
        maxCnt = fmax(maxCnt, iter->val);
    }
    return wallSize - maxCnt;
}


复杂度分析

  • 时间复杂度:O(nm),其中 n 是砖墙的高度,m 是每行砖墙的砖的平均数量。我们需要遍历每行砖块中除了最右侧的砖块以外的每一块砖,将其右侧边缘到砖墙的左边缘的距离加入到哈希表中。
  • 空间复杂度:O(nm)。其中 n 是砖墙的高度,m 是每行砖墙的砖的平均数量。我们需要将每行砖块中除了最右侧的砖块以外的每一块砖的右侧边缘到砖墙的左边缘的距离加入到哈希表中。


BY /

本文作者:力扣

声明:本文归“力扣”版权所有,如需转载请联系。

没有幻想过以后当一名编程大师,往后成为一名工程师、前端或者后端开发人员?那么从小就需要对大脑铺入编程的概念,今日小编特意为大家带来了这款:scratch软件,这是由麻省理工学院推出的专为少儿打造的一款图形化编程软件,是适合于全世界儿童学习编程和交流的工具和平台。该平台是通过其图形化的界面将编程需要的基本技巧囊括其中,让孩子可以在简单的操作下快速掌握编程技巧。软件拥有支持3D立体编辑、内置图像稳定器以及灵活的用户界面,便于用户进行便捷的操作,除此之外:scratch软件还提供了云端数据保存及作品分享社区,为用户打造出了本地化的Scratch,同时支持代理模式,能很好的提高你的工作效率。

软件功能

1、更胜一筹的4K编辑流程,支持Blackmagic Design的Deck?Link 4K Extreme,Ultra Studio 4K,AJA KONA 3G (仅预览)非编硬件,支持使用Grass Valley HQX编码的EDL或 AAF导入/导出,与DaVinci Resolve 11交换时间线校色流程

2、支持Blackmagic Design, Matrox 和 AJA的第三方板卡

3、混编多种分辨率素材-从24*24到4K*2K,在同一时间线实时转换不同帧速率,为编辑人员提高了工作效率

4、支持当下最新的文件格式-SONY XAVCAM (Intra/ Long GOP)/XAVC S, Panasonic AVC-Ultra/AVC-Intra 4K 422及Canon XF-AVC(仅输入)

5、源码编辑多种视频格式,包括: SONY XDCAM, Panasonic P2, Ikegami GF, RED, Canon XF 和 EOS 电影格式

6、当前最快的AVCHD编辑速度,可做到3层以上实时编辑

7、多达16机位的多机位编辑能力,并可实时进行视频输出

8、增强的MPEG和264/AVC编解码能力(可对4K XAVC进行快速编码),支持更快的4K H.264回放

9、基于第四代Intel酷睿架构的优化,支持Intel Quick Sync Video极速264输出(用于蓝光刻录)

10、64位本地处理,快速处理海量静态图像文件(JPG, TGA, DPX等),提供更流畅的实时编辑

11、支持代理模式,增强PC处理能力,提高工作效率

12、灵活的用户界面,包括:无限的视频、音频、字幕和图文轨道

13、支持3D立体编辑、内置图像稳定器,并可从时间线上直接刻录蓝光、DVD

软件安装

downkuai.com/soft/148284.html

使用教程

scratch怎么做游戏?怎样在Scratch中编制打砖块游戏?

一、创建角色

1、打开Scratch软件,进入它的工作界面,将猫这个角色删除;

2、用鼠标左键单击“从角色库中选取角色”,

3、创建球:在角色库中选择物品,选择Baseball,确定

4、创建砖块:用绘制角色的方法创建砖块;

5、在角色Baseball上按鼠标右键,选择info,出现角色的信息面板,显示角色的名字,当前所在位置的坐标值,方向等;

6、将角色1名字改为气球,改完按左边的小箭头返回角色列表,再将角色2改为砖块;

二、编写脚本

1、在角色面板点球,给它添加脚本;

2、在角色面板点砖块,给它添加脚本;

3、复制砖块,覆盖上面的屏幕,我们发现复制砖块的时候,脚本代码也一起复制了,太好了!!


4、用同样复制的方法再增加第二行砖块,可以改变第二行砖块的颜色,方法是选择砖块6,点中间的造型,选择好颜色后用油漆桶工具改变填充色;复制砖块,并将它们在第二行排列好;跟第一行一样,我就不用再做了;

三、运行程序

点按绿旗开始运行,点按红色按钮停止执行。

scratch软件常见问题

问:scratch怎么让角色跳起来?

答:

1、运行打开scratch,然后选择一个需要动起来的角色图形。如下是该软件自带测试用的一个卡通角色。

2、选择脚本处选择可以让角色动起来的指令。

3、最后用以下几个指令,就可以让角色动起来了。

4、小伙伴们还可以自己设定动起来的指令,只要你喜欢都可以。

问:scratch怎么让角色跟着鼠标移动?

答:

1、首先我们需要运行打开scratch,然后需要准备一个角色(软件已经帮我们备好一个默认角色了,使用这个就可以了,如果你有其他需要也可以进行替换)

2、然后我们选择脚本处,选择需要让角色动起来的指令

3、再次选择动作中的移到鼠标指针,将其拖拽出来


4、小编在这里选择控制中的【重复执行】,将其拖拽至右侧灰色处


5、最后将鼠标指针填入到重复执行中,如下效果:


6、根据教程操作完毕,单击重复执行框就可以看到图形在跟着鼠标的移动动起来了

软件特色

1、scratch是中文语言,方便所有国内用户使用;

2、构成程序的命令和参数通过基本形状的模块来实现;

3、用鼠标拖动模块到程序编辑栏就可以了;

4、中间的部分是编辑好的程序代码;

5、左边是可以用来选择的功能模块;

6、右边上部是程序预览和运行窗口;

7、scratch中文版右边下部是角色窗口;