Code optimieren?

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

Woher ich das weiß:Berufserfahrung – UI/UX Designer, Full-Stack Developer

Zentur21 
Beitragsersteller
 26.08.2024, 07:18

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

0
Zentur21 
Beitragsersteller
 26.08.2024, 07:19
@Zentur21

und diese 20 ist die anzahl wie viele karten insgesamt auf dem tisch liegen ^^ die zahl soll immer gleich bleiben. Und der user kann dann karten auf decken ähnlich wie bei memorie

0
medmonk  26.08.2024, 08:11
@Zentur21

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.

1
Zentur21 
Beitragsersteller
 26.08.2024, 11:28
@medmonk

hey cool vielen lieben dank das mache ich

0