Code optimieren?
Huhu ich hab's endlich geschafft meinen eigenen Code zu schreiben so dass er funktioniert und ich diesen auch verstehe. Jetzt ist meine nächstes "Problem" die optimierung kann man diesen in kürzerer Form schreiben?
```js
const array = ["3","4","5","6","7"];
for (let i= 0; i<=15; i++){
console.log(array[0].repeat(20-i)+array[1].repeat(i));
}
for (let i= 16; i<=20; i++){
console.log(array[0].repeat(20-i)+array[1].repeat(i));
console.log(array[0].repeat(20-i)+array[1].repeat(i));
}
for (let i= 21; i<=35; i++){
console.log(array[1].repeat(40-i)+array[2].repeat(i-20));
}
for (let i= 36; i<=40; i++){
console.log(array[1].repeat(40-i)+array[2].repeat(i-20));
console.log(array[1].repeat(40-i)+array[2].repeat(i-20));
}
for (let i= 41; i<=55; i++){
console.log(array[2].repeat(60-i)+array[3].repeat(i-40));
}
for (let i= 56; i<=60; i++){
console.log(array[2].repeat(60-i)+array[3].repeat(i-40));
console.log(array[2].repeat(60-i)+array[3].repeat(i-40));
}
for (let i= 61; i<=75; i++){
console.log(array[3].repeat(80-i)+array[4].repeat(i-60));
}
for (let i= 76; i<=80; i++){
console.log(array[3].repeat(80-i)+array[4].repeat(i-60));
console.log(array[3].repeat(80-i)+array[4].repeat(i-60));
}
```
sry hab kein plan wie man hier code formatiert rein haut^^ und danke für die geduld und fürs erklären. PS ich hoffe das kürzere ergebnis wird nicht zu kryptisch weil ich es dann wenn ich das in 6 wochen nochmal anschaue nicht mehr lesen kann. Dankö und habt einen schönen Start in die Woche🌞✌🏼
1 Antwort
In der Softwareentwicklung gibt es das DRY-Prinzip (Don't Repeat Yourself) und dieses darauf abzielt, Redundanzen im Code zu vermeiden. Genau das wurde nicht gemacht und hier immer wieder Wiederholungen von For-Schleifen hast. Dabei ändern sich lediglich die Parameter, daher würde ich wie nachfolgend einkürzen.
const array = ["3", "4", "5", "6", "7"];
const ranges = [
{ start: 0, end: 15, a: 0, b: 1, offset: 20},
{ start: 16, end: 20, a: 0, b: 1, offset: 20, double: true},
{ start: 21, end: 35, a: 1, b: 2, offset: 20},
{ start: 36, end: 40, a: 1, b: 2, offset: 20, double: true},
{ start: 41, end: 55, a: 2, b: 3, offset: 40},
{ start: 56, end: 60, a: 2, b: 3, offset: 40, double: true},
{ start: 61, end: 75, a: 3, b: 4, offset: 60},
{ start: 76, end: 80, a: 3, b: 4, offset: 60, double: true}
];
function generatePattern(array, ranges) {
ranges.forEach(({ start, end, a, b, offset, double}) => {
for (let i = start; i <= end; i++) {
const repeatA = array[a].repeat(offset - i);
const repeatB = array[b].repeat(i - (offset - 20));
const output = repeatA + repeatB;
console.log(output);
if (double) console.log(output);
}
});
}
generatePattern(array, ranges);
LG medmonk
Bei deinem Programmcode dich halt immer und immer wiederholst, obwohl sich lediglich die Parameter oder Bedingungen geändert haben. Das Problem daran ist, dass man später nicht immer sofort weiß, wofür die Schleifen und Werte stehen.
Es macht allgemein Sinn, gewisse Logiken gescheit zu benennen, aufzuteilen und mit Blick auf DRY so umzusetzen, dass gewisse Schritte wiederverwendbar sind. In deinem Fall beispielsweise eine Funktion für die Level an sich. Eine weitere zum Berechnen der Werte und alles weitere lediglich per Parameter übergeben wird.
Die obige Funktion ggf. nicht durch Parameter befühlst, sondern „array” und „ranges” mit in die Funktion packst. Danach eine weitere Funktion für die Berechnung der Erfahrung der Level sowie eine für die Kartenverteilung. Das nachfolgende Code-Snippet dir ggf. als Orientierung weiterhelfen kann.
function getExperience(level) {
return Math.round(100 * Math.pow(1.1, level));
}
function getDeal(level) {
const deals = [
{maxLvl: 15, loseOff: 20, win1Off: 0, win2: 0},
{maxLvl: 25, loseOff: 20, win1Off: 16, win2: 0},
{maxLvl: 50, loseOff: 20, win1Off: 26, win2: 1},
{maxLvl: 75, loseOff: 50, win1Off: 51, win2: 25},
{maxLvl: 100, loseOff: 100, win1Off: 76, win2: 50}
];
let deal = [0, 0, 0]; // lose, win1, win2
for (let d of deals) {
if (level <= d.maxLvl) {
deal[0] = d.loseOff - (level - d.win1Off);
deal[1] = level - d.win1Off;
deal[2] = d.win2;
break;
}
}
return deal;
}
// Alles weitere wie Aufruf, Ausgabe etc.
Was dir vielleicht ebenso weiterhelfen wird, wenn du mal einen Blick in den reversed Quellcode von GTA III und GTA VC reinschaust. Besonders wie die Waffen, Gegner usw. definiert wurden. Das lässt sich dann leicht adaptieren.
Das sieht auch gut aus. Der Codeschnipsel gehört zu einem Katenspiel. Und ich möcht quasi die verbindung zwischen Spielerlvl und verhältnis der karten schaffen. So ist das verhältnis zwischen niete und gewinn bei lvl 1= 20:0 (20mal i[0] und 0mal i[1]) bei lvl 2 wäre das 19mal i[0] und so weiter bis lvl 15 dann sollen jeweils lvl paare gebildet werden sprich lvl 16+17,18+19 bis 24+25. Danach wird eine neuer gewinn eingeführt i[2] und der alte gewinn i[0] wird zur niete. und das ganze wird dann bis 50 gemacht dann bis 75 und bis 100. Und die Erfahrung pro lvlaufstieg setzt sich aus f(lvl)=100*1,1^lvl zusammen. Dann hat i[0] noch einen erfahrungsgewinn von 50 erfahrungspunkte. Ah und was ich vergessen habe, Pro 20 lvl sprich bei lvl 20,40,60... darf der user eine karte mehr aufdecken als davor startzahl ist 2 Karten. Ich hoffe das hab ich verständlich erklärt. Und das DIY versuche ich mir zu merken