擊查看打磚塊游戲
動(dòng)態(tài)的圖有點(diǎn)丟幀,所以看起來(lái)很難受,實(shí)際效果可以,可以用左鍵和右鍵,也可以用鼠標(biāo)控制!現(xiàn)在這樣的小游戲一般都是基于HTML5/canvas畫(huà)布來(lái)做的,這個(gè)也不例外,當(dāng)然核心的還是javascript的控制,這里的代碼量正好是200行,絕大部分是javascript來(lái)處理各種事件,包括核心的碰撞事件的檢測(cè)以及響應(yīng),我們小時(shí)候玩的小游戲一般邏輯思維都很簡(jiǎn)單,但是具體用javascript去實(shí)踐的時(shí)候,那必須有比較扎實(shí)的基礎(chǔ)才可以,我一直建議學(xué)習(xí)前端的伙伴,把原生javascript學(xué)好,在現(xiàn)在的前端市場(chǎng),原生javascript已經(jīng)越來(lái)越重要!需要更多前端學(xué)習(xí)視頻或者資料的可以去我前面的文章找喲,以下附上本項(xiàng)目的源碼!
代碼過(guò)長(zhǎng)需要文檔版源碼來(lái)我的前端群570946165,已上傳到群文件
HTML5/javascript代碼量有點(diǎn)大,所以只能以動(dòng)圖的格式發(fā)送,請(qǐng)見(jiàn)諒,有需要的的可以加一下!
扣 554. 磚墻
題目描述
你的面前有一堵矩形的、由 n 行磚塊組成的磚墻。這些磚塊高度相同(也就是一個(gè)單位高)但是寬度不同。每一行磚塊的寬度之和相等。
你現(xiàn)在要畫(huà)一條 自頂向下 的、穿過(guò) 最少 磚塊的垂線。如果你畫(huà)的線只是從磚塊的邊緣經(jīng)過(guò),就不算穿過(guò)這塊磚。你不能沿著墻的兩個(gè)垂直邊緣之一畫(huà)線,這樣顯然是沒(méi)有穿過(guò)一塊磚的。
給你一個(gè)二維數(shù)組 wall ,該數(shù)組包含這堵墻的相關(guān)信息。其中,wall[i] 是一個(gè)代表從左至右每塊磚的寬度的數(shù)組。你需要找出怎樣畫(huà)才能使這條線 穿過(guò)的磚塊數(shù)量最少 ,并且返回 穿過(guò)的磚塊數(shù)量。
示例 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
提示:
解決方案
思路及算法
由于磚墻是一面矩形,所以對(duì)于任意一條垂線,其穿過(guò)的磚塊數(shù)量加上從邊緣經(jīng)過(guò)的磚塊數(shù)量之和是一個(gè)定值,即磚墻的高度。
因此,問(wèn)題可以轉(zhuǎn)換成求「垂線穿過(guò)的磚塊邊緣數(shù)量的最大值」,用磚墻的高度減去該最大值即為答案。
雖然垂線在每行至多只能通過(guò)一個(gè)磚塊邊緣,但是每行的磚塊邊緣也各不相同,因此我們需要用哈希表統(tǒng)計(jì)所有符合要求的磚塊邊緣的數(shù)量。
注意到題目要求垂線不能通過(guò)磚墻的兩個(gè)垂直邊緣,所以磚墻兩側(cè)的邊緣不應(yīng)當(dāng)被統(tǒng)計(jì)。因此,我們只需要統(tǒng)計(jì)每行磚塊中除了最右側(cè)的磚塊以外的其他磚塊的右邊緣即可。
具體地,我們遍歷磚墻的每一行,對(duì)于當(dāng)前行,我們從左到右地掃描每一塊磚,使用一個(gè)累加器記錄當(dāng)前磚的右側(cè)邊緣到磚墻的左邊緣的距離,將除了最右側(cè)的磚塊以外的其他磚塊的右邊緣到磚墻的左邊緣的距離加入到哈希表中。最后我們遍歷該哈希表,找到出現(xiàn)次數(shù)最多的磚塊邊緣,這就是垂線經(jīng)過(guò)的磚塊邊緣,而該垂線經(jīng)過(guò)的磚塊數(shù)量即為磚墻的高度減去該垂線經(jīng)過(guò)的磚塊邊緣的數(shù)量。
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;
}
復(fù)雜度分析
BY /
本文作者:力扣
聲明:本文歸“力扣”版權(quán)所有,如需轉(zhuǎn)載請(qǐng)聯(lián)系。
沒(méi)有幻想過(guò)以后當(dāng)一名編程大師,往后成為一名工程師、前端或者后端開(kāi)發(fā)人員?那么從小就需要對(duì)大腦鋪入編程的概念,今日小編特意為大家?guī)?lái)了這款:scratch軟件,這是由麻省理工學(xué)院推出的專為少兒打造的一款圖形化編程軟件,是適合于全世界兒童學(xué)習(xí)編程和交流的工具和平臺(tái)。該平臺(tái)是通過(guò)其圖形化的界面將編程需要的基本技巧囊括其中,讓孩子可以在簡(jiǎn)單的操作下快速掌握編程技巧。軟件擁有支持3D立體編輯、內(nèi)置圖像穩(wěn)定器以及靈活的用戶界面,便于用戶進(jìn)行便捷的操作,除此之外:scratch軟件還提供了云端數(shù)據(jù)保存及作品分享社區(qū),為用戶打造出了本地化的Scratch,同時(shí)支持代理模式,能很好的提高你的工作效率。
軟件功能
1、更勝一籌的4K編輯流程,支持Blackmagic Design的Deck?Link 4K Extreme,Ultra Studio 4K,AJA KONA 3G (僅預(yù)覽)非編硬件,支持使用Grass Valley HQX編碼的EDL或 AAF導(dǎo)入/導(dǎo)出,與DaVinci Resolve 11交換時(shí)間線校色流程
2、支持Blackmagic Design, Matrox 和 AJA的第三方板卡
3、混編多種分辨率素材-從24*24到4K*2K,在同一時(shí)間線實(shí)時(shí)轉(zhuǎn)換不同幀速率,為編輯人員提高了工作效率
4、支持當(dāng)下最新的文件格式-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、當(dāng)前最快的AVCHD編輯速度,可做到3層以上實(shí)時(shí)編輯
7、多達(dá)16機(jī)位的多機(jī)位編輯能力,并可實(shí)時(shí)進(jìn)行視頻輸出
8、增強(qiáng)的MPEG和264/AVC編解碼能力(可對(duì)4K XAVC進(jìn)行快速編碼),支持更快的4K H.264回放
9、基于第四代Intel酷睿架構(gòu)的優(yōu)化,支持Intel Quick Sync Video極速264輸出(用于藍(lán)光刻錄)
10、64位本地處理,快速處理海量靜態(tài)圖像文件(JPG, TGA, DPX等),提供更流暢的實(shí)時(shí)編輯
11、支持代理模式,增強(qiáng)PC處理能力,提高工作效率
12、靈活的用戶界面,包括:無(wú)限的視頻、音頻、字幕和圖文軌道
13、支持3D立體編輯、內(nèi)置圖像穩(wěn)定器,并可從時(shí)間線上直接刻錄藍(lán)光、DVD
軟件安裝
downkuai.com/soft/148284.html
使用教程
scratch怎么做游戲?怎樣在Scratch中編制打磚塊游戲?
一、創(chuàng)建角色
1、打開(kāi)Scratch軟件,進(jìn)入它的工作界面,將貓這個(gè)角色刪除;
2、用鼠標(biāo)左鍵單擊“從角色庫(kù)中選取角色”,
3、創(chuàng)建球:在角色庫(kù)中選擇物品,選擇Baseball,確定
4、創(chuàng)建磚塊:用繪制角色的方法創(chuàng)建磚塊;
5、在角色Baseball上按鼠標(biāo)右鍵,選擇info,出現(xiàn)角色的信息面板,顯示角色的名字,當(dāng)前所在位置的坐標(biāo)值,方向等;
6、將角色1名字改為氣球,改完按左邊的小箭頭返回角色列表,再將角色2改為磚塊;
二、編寫(xiě)腳本
1、在角色面板點(diǎn)球,給它添加腳本;
2、在角色面板點(diǎn)磚塊,給它添加腳本;
3、復(fù)制磚塊,覆蓋上面的屏幕,我們發(fā)現(xiàn)復(fù)制磚塊的時(shí)候,腳本代碼也一起復(fù)制了,太好了!!
4、用同樣復(fù)制的方法再增加第二行磚塊,可以改變第二行磚塊的顏色,方法是選擇磚塊6,點(diǎn)中間的造型,選擇好顏色后用油漆桶工具改變填充色;復(fù)制磚塊,并將它們?cè)诘诙信帕泻茫桓谝恍幸粯樱揖筒挥迷僮隽耍?/span>
三、運(yùn)行程序
點(diǎn)按綠旗開(kāi)始運(yùn)行,點(diǎn)按紅色按鈕停止執(zhí)行。
scratch軟件常見(jiàn)問(wèn)題
問(wèn):scratch怎么讓角色跳起來(lái)?
答:
1、運(yùn)行打開(kāi)scratch,然后選擇一個(gè)需要?jiǎng)悠饋?lái)的角色圖形。如下是該軟件自帶測(cè)試用的一個(gè)卡通角色。
2、選擇腳本處選擇可以讓角色動(dòng)起來(lái)的指令。
3、最后用以下幾個(gè)指令,就可以讓角色動(dòng)起來(lái)了。
4、小伙伴們還可以自己設(shè)定動(dòng)起來(lái)的指令,只要你喜歡都可以。
問(wèn):scratch怎么讓角色跟著鼠標(biāo)移動(dòng)?
答:
1、首先我們需要運(yùn)行打開(kāi)scratch,然后需要準(zhǔn)備一個(gè)角色(軟件已經(jīng)幫我們備好一個(gè)默認(rèn)角色了,使用這個(gè)就可以了,如果你有其他需要也可以進(jìn)行替換)
2、然后我們選擇腳本處,選擇需要讓角色動(dòng)起來(lái)的指令
3、再次選擇動(dòng)作中的移到鼠標(biāo)指針,將其拖拽出來(lái)
4、小編在這里選擇控制中的【重復(fù)執(zhí)行】,將其拖拽至右側(cè)灰色處
5、最后將鼠標(biāo)指針填入到重復(fù)執(zhí)行中,如下效果:
6、根據(jù)教程操作完畢,單擊重復(fù)執(zhí)行框就可以看到圖形在跟著鼠標(biāo)的移動(dòng)動(dòng)起來(lái)了
軟件特色
1、scratch是中文語(yǔ)言,方便所有國(guó)內(nèi)用戶使用;
2、構(gòu)成程序的命令和參數(shù)通過(guò)基本形狀的模塊來(lái)實(shí)現(xiàn);
3、用鼠標(biāo)拖動(dòng)模塊到程序編輯欄就可以了;
4、中間的部分是編輯好的程序代碼;
5、左邊是可以用來(lái)選擇的功能模塊;
6、右邊上部是程序預(yù)覽和運(yùn)行窗口;
7、scratch中文版右邊下部是角色窗口;
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。