ID.nl logo
Zo kun je programmeren in Python - Deel 5
© Reshift Digital
Zekerheid & gemak

Zo kun je programmeren in Python - Deel 5

In de href="https://computertotaal.nl/artikelen/pc/zo-kun-je-programmeren-in-python-deel-4/" rel="noopener noreferrer" target="_blank">vorige les</a> toonden we allerlei manieren om de uitvoer van tekst op het scherm aan te passen. In deze les zetten we de stap van je scherm naar bestanden: we gaan gegevens uit bestanden lezen en naar bestanden schrijven. Daarnaast leer je reageren op exceptions: foutmeldingen die Python je geeft als er iets misgaat.

Twee lessen geleden gebruikte je de functie input om wat de gebruiker op zijn toetsenbord intypt te registreren. En in de vorige les toonden we je hoe je met de functie print uitvoer op het scherm toont. Maar in- en uitvoer kan ook via bestanden verlopen. Laten we eens kijken hoe dat gaat.

Hier kun je les vier bekijken.

We beperken ons in deze les tot het lezen en schrijven van tekstbestanden. Je kunt ook met binaire bestanden werken, die willekeurige data in een andere vorm dan tekst kunnen bevatten, maar dat is wat meer werk omdat je de data nog moet interpreteren. Voor de rest werkt dit hetzelfde.

Een tekstbestand lezen

We tonen hier in een voorbeeld hoe je op een Linux-machine zoals een Raspberry Pi met Raspberry Pi OS (tot voor kort Raspbian geheten) het bestand met de lijst van gebruikers uitleest. Ook op macOS werkt dit voorbeeld. Gebruik je Windows, maak dan zelf een bestand aan met de inhoud die we in ons voorbeeld tonen en pas de locatie van het te openen bestand aan in je Python-code.

De eenvoudigste manier om een volledig tekstbestand uit te lezen en op het scherm te tonen, heeft maar twee regels nodig:

with open('/etc/passwd', 'rt') as bestand:

print(bestand.read())

In de eerste regel openen we het bestand met de functie open. Het eerste argument is het bestand dat we willen openen. We hebben hier een volledig pad gebruikt: '/etc/passwd'. Als je een bestand wilt lezen dat in dezelfde directory staat als waarin je de Python-interpreter hebt opgestart, hoef je geen volledig pad door te geven: de bestandsnaam volstaat dan. Met het tweede argument 'rt' geven we aan dat we het bestand willen lezen en dat het om een tekstbestand gaat.

De constructie met with is wat Python een ‘context manager’ noemt. In het with-blok heb je toegang tot het object bestand dat het geopende bestand voorstelt. Na het with-blok wordt het bestand automatisch gesloten, zodat je het niet meer kunt lezen. Dit lijkt vanzelfsprekend, maar dat is het niet: ook zonder with kun je bestanden openen, maar als je dan het bestand na gebruik vergeet te sluiten, kan dit tot problemen leiden. Werk dus nooit met bestanden zonder with.

In de tweede regel roepen we de functie read op het object bestand aan. Deze functie geeft de volledige inhoud van het tekstbestand terug als een string, die we dan met print op het scherm tonen. Op een typisch Linux-systeem ziet de uitvoer er als volgt uit (we tonen hier maar enkele regels):

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

Enzovoort

Een tekstbestand regel voor regel lezen

Maar wat als we niet het hele bestand in één keer willen inlezen, maar regel voor regel, bijvoorbeeld omdat we willen testen of de regels aan specifieke voorwaarden voldoen? Geen probleem, ook dat is in Python heel eenvoudig. In plaats van de functie read op je bestand toe te passen, ga je dan met een for-lus door de elementen van het bestand. Het tekstbestand dat je van de functie open terugkrijgt, gedraagt zich immers als een lijst met als elementen de opeenvolgende regels in het bestand.

Een string splitsen

Maar als we die regels een voor een gaan inlezen, moeten we er ook iets mee doen. Zoals je ziet, bevat het bestand /etc/passwd op elke regel allerlei informatie over de gebruiker, telkens afgescheiden door een dubbele punt. We willen elk van die gegevens afzonderlijk uitlezen. Dat gaat eenvoudig met de functie split die we op een string kunnen uitvoeren. Bijvoorbeeld:

>>> 'root:x:0:0:root:/root:/bin/bash'.split(':')

['root', 'x', '0', '0', 'root', '/root', '/bin/bash']

Je ziet hier dat we aan de functie split het teken meegeven dat de verschillende componenten van de string afscheidt: ':'. Het resultaat is een lijst met strings die onderdeel uitmaken van onze lange string, zonder de afscheidingstekens ':'.

De opeenvolgende componenten in de regels van het bestand /etc/passwd hebben overigens de volgende betekenis: gebruikersnaam, ongebruikt, ID van de gebruiker, ID van de groep, volledige gebruikersnaam, persoonlijke map van de gebruiker, shell van de gebruiker.

Een lijst uitpakken

Je kunt nu naar de elementen in de gesplitste string verwijzen met een index, bijvoorbeeld:

>>> informatie = 'root:x:0:0:root:/root:/bin/bash'.split(':')

>>> informatie[0]

'root'

>>> informatie[6]

'/bin/bash'

Maar dat is niet heel duidelijk. Zo willen we informatie[0] eigenlijk gebruiker noemen en informatie[6] de naam shell geven. Gelukkig kun je in Python de elementen van een lijst eenvoudig in één keer aan enkele variabelen toekennen. Dat heet unpacking. In ons voorbeeld gaat dat als volgt:

>>> gebruiker, *_, naam, directory, shell = 'root:x:0:0:root:/root:/bin/bash'.split(':')

>>> gebruiker

'root'

>>> _

['x', '0', '0']

>>> naam

'root'

>>> directory

'/root'

>>> shell

'/bin/bash'

De notatie * gebruik je om een willekeurig aantal elementen uit te pakken. Omdat we in dit geval niet in deze elementen geïnteresseerd zijn, kennen we ze toe aan de variabele met de naam _, vandaar dat we bij het uitpakken *_ gebruiken. We konden dit hier ook vervangen door gebruiker, _, _, _, naam, directory, shell.

Gegevens uit een tekstbestand filteren

Dan weet je nu genoeg om de volgende opdracht uit te voeren: lees het bestand met wachtwoorden regel per regel in en als de shell geen '/usr/sbin/nologin' of '/bin/false' is, toon je de gebruikersnaam, volledige gebruikersnaam en persoonlijke map.

De code ziet er als volgt uit:

with open('/etc/passwd', 'rt') as bestand:

for regel in bestand:

gebruiker, *_, naam, directory, shell = regel.strip().split(':')

if shell not in ['/bin/false', '/usr/sbin/nologin']:

print(' {1} ({0}): {2} ({3})'.format(gebruiker, naam, directory, shell))

We openen dus het bestand /etc/passwd als tekstbestand om te lezen. Voor elke regel in het bestand pakken we de verschillende elementen uit in enkele variabelen. We kijken dan of de shell niet gelijk is aan de twee eerdergenoemde shells. Als aan die voorwaarde is voldaan, tonen we de gebruiker, zijn volledige naam, zijn persoonlijke map en zijn shell.

Er is slechts één nieuwigheid in deze code: de functie strip. Die verwijdert witruimte en nieuwe regels aan het begin en het einde van een string. Dat hebben we hier nodig omdat de shell op het einde van de regel staat en er daar dus een teken voor een nieuwe regel komt. Zonder die aanroep van strip zou de vergelijking in de regel erna niet werken.

Naar een tekstbestand schrijven

Naar een tekstbestand schrijven, verloopt op een vergelijkbare manier als een tekstbestand lezen. We beginnen een with-blok waarin we het bestand openen en daarin schrijven we naar het bestand:

with open('bestand.txt', 'wt') as bestand:

bestand.write('Dit is de eerste regel.\n')

bestand.write('Dit is de tweede regel.\n')

bestand.write('Dit is de derde regel.\n')

Op het einde van elke regel moet je zelf een teken voor een nieuwe regel toevoegen: \n. Een andere manier om een regel naar een tekstbestand te schrijven, is met de functie print, die automatisch een nieuwe regel toevoegt:

print('Dit is de eerste regel.', file=bestand)

Merk op dat we het bestand openen met als tweede argument 'wt', waarmee we aangeven dat we naar het bestand willen schrijven. Op deze manier overschrijven we alle al bestaande inhoud van het bestand, dus let hiermee op!

Als je deze situatie wilt vermijden, kun je open aanroepen met de bestandsmodus 'xt'. Als het bestand nog niet bestaat, doet die hetzelfde als 'wt': je kunt naar het bestand schrijven. Maar als het bestand al bestaat, krijg je een foutmelding:

with open('bestand.txt', 'xt') as bestand:

print('Dit is een test.', file=bestand)

with open('bestand.txt', 'xt') as bestand:

print('Dit is nog een test.', file=bestand)

Traceback (most recent call last):

File "<pyshell>", line 1, in <module>

FileExistsError: [Errno 17] File exists: 'bestand.txt'

Een andere interessante bestandsmodus is 'at' (van ‘append’): hiermee voeg je aan het einde van een bestaand tekstbestand regels toe.

Exceptions afhandelen

In het voorbeeld hierboven zou je waarschijnlijk de foutmelding dat het bestand al bestaat op een nettere manier willen afhandelen. Wat we tot nu toe een foutmelding genoemd hebben, heet in Python een exception. Er bestaan verschillende types exceptions en in je Python-code kun je eenvoudig het optreden van exceptions afvangen. Dat gaat als volgt:

try:

with open('bestand.txt', 'xt') as bestand:

print('Dit is nog een test.', file=bestand)

except FileExistsError:

print('FOUT: Het bestand bestaat al.')

De code binnen het try-blok wordt uitgevoerd zoals normaal. Maar als er binnen dit blok een exception voorkomt, gaat het programma door naar het except-blok. Daarin hebben we aangegeven dat we alleen in de exceptions van het type FileExistsError geïnteresseerd zijn. In het geval er zo een voorkomt, tonen we onze eigen foutmelding. Daarna gaat het programma verder na het except-blok.

Als je meerdere types exceptions wilt afvangen, voeg je meerdere except-blokken toe met elk het andere type exception. Als je voor meerdere types exceptions dezelfde code wilt uitvoeren, dan zet je die exceptions tussen haakjes, zoals hier:

except (ZeroDivisionError, ValueError):

En als je op alle mogelijke exceptions hetzelfde wilt reageren, voeg je gewoon een except-blok zonder de naam van een exception toe, al is dat niet zo vaak zinvol.

Samenvatting

In deze les hebben we geleerd hoe we tekstbestanden kunnen inlezen en strings in onderdelen kunnen splitsen. Ook in de andere richting kun je nu met tekstbestanden werken: je kunt willekeurige tekst naar een bestand schrijven. En doordat je hebt geleerd hoe je exceptions kunt afvangen, hoeven de gebruikers van je programma geen cryptische foutmeldingen van Python meer te krijgen. Omdat je met deze kennis al complexere Python-programma’s kunt schrijven, leer je in de volgende les hoe je je programma meer kunt structureren in functies en modules.

Opdracht

Vraag de gebruiker om een regel zoals root:x:0:0:root:/root:/bin/bash voor gebruik in een wachtwoordbestand op te geven. Schrijf de belangrijkste elementen van de regel naar een afzonderlijke regel in een bestand, in de vorm: Gebruiker: root Naam: root Directory: /root Shell: /bin/bash Zorg dat je programma een heldere foutmelding geeft als de regel niet de correcte vorm voor een wachtwoordbestand heeft.

Uitwerking

regel = input('Voer een regel voor het wachtwoordbestand in: ') try: gebruiker, _, _, _, naam, directory, shell = regel.strip().split(':') with open('wachtwoordbestand', 'wt') as bestand: print('Gebruiker: {}'.format(gebruiker), file=bestand) print('Naam: {}'.format(naam), file=bestand) print('Directory: {}'.format(directory), file=bestand) print('Shell: {}'.format(shell), file=bestand) except ValueError: print('Voer de regel in de volgende vorm in:') print('gebruiker:x:0:0:naam:directory:shell') Dit is een rechtstreekse combinatie van alles wat je in deze les geleerd hebt. Let op: we hebben hier wel gebruiker, _, _, _, naam, directory, shell nodig en niet de kortere versie gebruiker, *_, naam, directory, shell. Met die laatste regel garanderen we immers niet dat de regel uit exact zeven elementen bestaat.

Cheatsheet

exception: een foutmelding in Python pad: de locatie van een bestand, met alle bovenliggende directorynamen erbij

▼ Volgende artikel
Nú is het moment: zo breng (én houd) je je cyberhygiëne op orde
© ID.nl
Zekerheid & gemak

Nú is het moment: zo breng (én houd) je je cyberhygiëne op orde

De digitale wereld verandert in een razendsnel tempo. Oplichters gaan dankzij AI steeds overtuigender te werk, waardoor valse berichten en nepwebsites nauwelijks nog van echte te onderscheiden zijn. Tegelijkertijd groeit het aantal accounts en apps dat je dagelijks gebruikt, wat de kans op beveiligingslekken vergroot. Het is daarom belangrijker dan ooit om je online aanwezigheid (nóg) actiever te beschermen. In dit artikel lees je welke aanpassingen je zelf direct kunt doorvoeren en welke extra beschermingslagen jou helpen je digitale veiligheid te versterken.

Partnerbijdrage - in samenwerking met Bitdefender

Waarom cyberhygiëne juist nu belangrijk is

In een modern huishouden volgen de digitale vernieuwingen elkaar razendsnel op. Van schoolapps en games tot werken op afstand; jij en je familie verzamelen ongemerkt een enorme berg online accounts. Tegelijkertijd worden digitale dreigingen steeds lastiger te herkennen.

Vroeger pikte je een nepbericht er zo uit door de kromme zinnen of spelfouten, maar die tijd is echt voorbij. Dankzij de inzet van slimme AI-technieken zien phishingberichten er tegenwoordig ontzettend professioneel uit. Ook foto's, filmpjes en zelfs stemmen kunnen digitaal zo nagemaakt worden dat je niet meer ziet of hoort met wie je echt te maken hebt. Het wordt daardoor steeds moeilijker om de risico's te zien. Hoog tijd dus om je digitale huishouding belangrijker op orde te brengen.

Beginnen bij het begin: een digitale schoonmaak

Veel mensen hebben meer oude accounts dan ze denken. Door die op te ruimen, sluit je meteen een aantal achterdeuren die je gemakkelijk over het hoofd ziet. De volgende onmisbare stap is het gebruik van sterke, unieke wachtwoorden. Zie het als een sleutelbos: wanneer je overal hetzelfde wachtwoord (of een variatie daarop) gebruikt, geef je criminelen met één enkele sleutel direct toegang tot al je accounts. Met unieke wachtwoorden zorg je ervoor dat een lek bij de ene dienst niet automatisch leidt tot een inbraak bij de andere. Een wachtwoordmanager neemt al dat denkwerk van je over. Het geeft je de rust dat je niet langer tientallen ingewikkelde codes zelf hoeft te onthouden. Handig: in een beveiligingspakket als Bitdefender Premium Security zit zo'n Password Manager bijvoorbeeld standaard inbegrepen. Zie tweestapsverificatie vervolgens als een extra slot op de deur; deze laag houdt kwaadwillenden buiten, zelfs als je wachtwoord onverhoopt toch op straat komt te liggen.

Vergeet daarnaast de updates van je apparaten niet. Deze software-updates dichten beveiligingslekken voordat criminelen er misbruik van kunnen maken. Dit is niet alleen belangrijk voor je smartphone, maar juist ook voor apparaten waar je minder vaak bij stilstaat. Denk aan de router in de meterkast of de tablets die de kinderen dagelijks gebruiken.

©Queenmoonlite Studio - stock.adobe.com

De dreigingen van nu vragen om extra hulp

Zelf alert blijven is de basis, maar het speelveld verandert razendsnel. Oplichting wordt steeds geraffineerder door in te spelen op situaties uit je dagelijkse leven. Je krijgt bijvoorbeeld precies op het juiste moment een bericht over een pakket dat vertraagd is, of een dringende waarschuwing die van je bank lijkt te komen. Omdat de grens tussen echt en nep zo vervaagt, is het prettig om een hulpmiddel achter de hand te hebben voor die momenten van twijfel.

Scamio is zo'n hulpmiddel. Deze gratis online tool van Bitdefender controleert binnen een paar seconden of een link of screenshot verdacht is. Je hoeft alleen de inhoud te plakken of de afbeelding te uploaden. Scamio analyseert de informatie en vertelt je direct hoe betrouwbaar het bericht is. Het is alsof er even een expert met je meekijkt voordat je besluit om ergens op te klikken. 

View post on TikTok

Een veilige basis voor het hele gezin

Goede cyberhygiëne draait om slimme gewoonten, maar ook om bescherming die meebeweegt met de dagelijkse werkelijkheid. Bitdefender Premium Security biedt die extra laag voor het hele huishouden. Omdat moderne gezinnen allerlei verschillende apparaten gebruiken, is het omslachtig om alles apart te beveiligen. Door al deze apparaten onder één pakket te brengen, creëer je direct overzicht en rust.

Achter de schermen werken verschillende lagen bescherming nauw samen om je gezin te beveiligen. De software blokkeert malware en ransomware en houdt valse websites tegen nog voordat je ze kunt openen. Scam Copilot kijkt ondertussen met je mee tijdens het browsen en analyseert aanbiedingen en berichten in realtime. Zodra er iets niet klopt, krijg je direct een waarschuwing. Naast deze beveiliging helpt Bitdefender je privacy te bewaken. Denk aan een VPN die je verbinding versleutelt wanneer je onderweg bent, of meldingen wanneer je gegevens onverhoopt opduiken in een datalek.

©Bitdefender

Daarnaast is het goed om te weten dat Bitdefender een Europese partij is met datacenters op eigen bodem. In een tijd waarin je gegevens soms de hele wereld overgaan, is het een prettig idee dat jouw privacy wordt beschermd volgens de strenge regels die we hier in Europa kennen. Je houdt zo simpelweg meer grip op je eigen gegevens.

Samen slim en veilig online

Je digitale veiligheid hoeft geen hoofdpijndossier te zijn. Door kritisch naar je oude accounts te kijken, overal unieke wachtwoorden te gebruiken en updates direct te installeren, zet je zelf al de belangrijkste stappen. Met een totaalpakket als Bitdefender Premium Security voeg je daar een slimme beschermlaag aan toe die de lastige taken van je overneemt. Zo creëer je met een paar simpele aanpassingen een veilige online omgeving voor je hele gezin, waarin je met een gerust hart kunt blijven internetten

▼ Volgende artikel
Review: Dragon Quest 7 Reimagined is een klassieke rpg in een nieuw jasje
Huis

Review: Dragon Quest 7 Reimagined is een klassieke rpg in een nieuw jasje

Dragon Quest is al meer dan drie decennia een icoon binnen de game-industrie. Hoewel de oudere delen al snel gedateerd voelden, zorgde een gestroomlijnde vernieuwing voor een nieuwe aanwas van fans. Toch moest alles nog één keer overboord. Met volle moed en een frisse stijl blijkt Dragon Quest 7 Reimagined een prachtige herinterpretatie van een klassieke rpg voor een nieuwe generatie.

Dragon Quest 7 is een beetje het verloren kindje binnen de reeks. Het was het debuut van de franchise op PlayStation, maar werd berucht door de langzame openingsuren en unieke structuur. Sterker nog: de regisseur van deze remake, Takeshi Ichikawa, biechtte op dat hij als kind nooit verder kwam dan het openingssegment in een recent interview. Er zou dus behoorlijk wat gesneden moeten worden in deze structuur. Bovendien is dit de derde remake van een mainline Dragon Quest-game in twee jaar tijd. Gelukkig onderscheidt Dragon Quest 7 Reimagined zich dit keer wel al vanaf het eerste uur.

©Square Enix

Schuitje Varen, Eilandje Redden

Op het eerste gezicht lijkt Dragon Quest 7 logisch in lijn te vallen met de rest van de serie. Als ‘de Held’ begin je op het enige eiland in de wereld. Samen met prins Keifer en jeugdvriendin Maribel ga je op een groot avontuur wanneer er een portaal opent in de mysterieuze tempel op het eiland. Niet alleen verschijnt er opeens een nieuw eiland in de eindeloze oceaan, maar ook reist de groep terug in de tijd. Ieder nieuw eiland bezoek je zo eerst in het verleden, waarna je acties gevolgen hebben in het heden.

Zo wordt de spelwereld steeds groter. Het ene eiland is compleet verlaten, omdat alle inwoners zijn versteend. Op een ander eiland probeert een groep reizende pelgrims om hun God te helpen terugkeren na zijn verdwijning aan de hand van de Demon King. Onderweg vind je tabletstukken om nieuwe portalen te openen. Ieder eiland heeft zo zijn eigen verhaal en personages die je volgt, wat kan voelen als een televisieserie met allemaal kleine uitstapjes. Het bouwt langzaam op naar een grotere verhaallijn met de terugkeer van de Demon King. Het geeft Dragon Quest 7 een eigen identiteit ten opzichte van andere Dragon Quest-titels, maar vereist wel een langere aandachtsspanne.

Watch on YouTube

Visueel vakmanschap

Gelukkig spat het spel van je scherm. De nieuwe visuele stijl is een hoogtepunt, een fenomenale balans tussen de originele tekeningen en ontwerpen van Akira Toriyama (Dragon Ball) en de 3D-stijl die de games hebben omarmd sinds de PlayStation 2. De hoofdpersonages zien er uit als handgemaakte poppetjes. Steden en kamers worden getoond als kleine diorama's. Het deed mij op meer dan één manier denken aan de uitstekende remake van Zelda: Link’s Awakening op de Nintendo Switch. De nieuwe stijl complementeert de Dragon Quest-serie uitstekend. Wanneer het samenkomt onder begeleiding van de prachtige symfonische muziek, voelt Reimagined als een warme deken voor fans van klassieke rpg’s.

Ik wilde elk hoekje van de wereld verkennen. Elk eiland voelde als een nieuw avontuur. Naarmate de groep avonturiers groter wordt, zwijmel je zo weer weg in de wereld van Dragon Quest. De game heeft zowel Japanse als Engelse stemwerk voor de tussenfilmpjes en belangrijke dialogen, maar ook het schrijfwerk is behoorlijk sterk. Leuke details zoals het gebruik van  ‘Thou’s’ en ‘Thy’s’ bij eilanden in het verleden voelen gepast. Wat minder gepast zijn de plaatsen die stilistische fouten gebruiken om over te komen als ‘Duits’ of ‘Frans’ (‘Wiz’ in plaats van ‘With’, of het weglaten van werkwoorden). Geen pretje om te lezen, maar het brengt wel degelijk het gevoel van een gevarieerde wereld over.

Knokken bouwt karakter

De combat is traditioneel zoals je kan verwachten van Dragon Quest. Elke beurt kies je welke aanval je personage uitvoert. Je maakt gebruik van de zwaktes van vijanden om je aanvallen maximale schade te laten toebrengen. Om in te spelen op de sterke punten van je party kun je ze allemaal een rol geven met het ‘vocation’-systeem. Deze beïnvloedt de statistieken en aanvallen die je kan leren. Na het vrijspelen van de ‘Alltrades abbey’ is het mogelijk om op ieder moment een ander pad te kiezen. Als je specifieke combinaties van vocations leert, krijg je toegang tot speciale rollen. Nadat je de Sailor- en de Thief-vocation beheerst, krijg je de Pirate-vocation, een unieke mix van beide rollen.

Het is een flexibel systeem dat uitnodigt om lekker te experimenteren. Zo maakte ik van Ruff een glazen kanon met een hele hoge kans op critical hits om massale schade uit te delen, terwijl ik Maribel als Sage en Priest gebruikte voor magische aanvallen en genezing. In de beste gevechten van Dragon Quest 7 voelt je party als een goed geoliede machine die compleet kan worden afgestemd op elke situatie. Dankzij de uitgebreide instellingen is het mogelijk om aan te passen hoeveel XP, geld, of levels in vocations je verdient in gevechten. In combinatie met de aangepaste snelheid van gevechten en tactische opties blies ik mij door de gevechten.

©Square Enix

Ideale moderne remake

Al deze kleine verbeteringen maken van Dragon Quest 7 Reimagined de ideale moderne remake. Hoe dol ik ook ben op de 2D-HD-stijl die Square Enix heeft toegepast in de laatste paar Dragon Quest-titels, is de nieuwe stijl in Reimagined een prachtige samensmelting van oud en nieuw. Structureel is de game flink opgepoetst en met de toegankelijkheidsopties hoef je niet eindeloos te grinden voor elke eindbaas. Dit alles komt samen in een heerlijke traditionele en tegelijkertijd modern aanvoelende rpg. Voor de oudgedienden: verwacht geen bergen aan nieuwe missies of verhalen, maar een ‘greatest hits’-album van Dragon Quest 7.

Voor de nieuwkomer is dit niet de eerste Dragon Quest die ik zou aanraden, maar zeker eentje om te ervaren als je nieuwsgierig bent naar andere delen in de serie. Ik kan alleen maar hopen dat dit het startschot is om ook andere delen in de serie op deze manier te ‘reimaginen’. Dragon Quest 9 bijvoorbeeld?

Dragon Quest 7 Reimagined is vanaf 5 februari beschikbaar voor PlayStation 5, PlayStation 4, Xbox Series X en S, pc (via Steam), Nintendo Switch 2en Nintendo Switch. Voor deze review is de game getest op Nintendo Switch 2.

Uitstekend
Conclusie

Dragon Quest 7 Reimagined is een klassieke rpg in een prachtig nieuw jasje. Met een gestroomlijnd verhaal, talloze opties om de ervaring soepeler te maken en een nieuwe visuele stijl is het hopelijk de eerste stap op een nieuwe weg voor Dragon Quest-remakes.

Plus- en minpunten
  • De visuele stijl is fris
  • Gestroomlijnd verhaal
  • Veel toegankelijkheidsopties
  • Klassieke rpg in een nieuw jasje
  • Verhaal komt (nog steeds) langzaam op gang
  • Turn-based combat kan wat eentonig overkomen