Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
freem
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Openai/6929f812-9cc4-800c-9c5b-06df7e85abe3
Add languages
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{DISPLAYTITLE:Pasianssipelin toteutus}} ''This conversation was exported from ChatGPT''<ref>{{cite web|title=Pasianssipelin toteutus|url=https://chatgpt.com/share/6929f812-9cc4-800c-9c5b-06df7e85abe3|publisher=ChatGPT|access-date=2025-11-28}}</ref> == research == === User: Sinulta halutaan seuraavaa: === Sinulta halutaan seuraavaa: ” kysy pasianssi pelin koodia niin saan kevyen pasianssi pelin” ” Vaikka html-muodossa niin voi selaimessa pelata” Toteuta === Assistant: Haluatko yksinkertaisen pasianssipelin, kuten Klondike klassinen Solitaire, vai jonkin muun version esim. === Haluatko yksinkertaisen pasianssipelin, kuten Klondike (klassinen Solitaire), vai jonkin muun version (esim. Spider, FreeCell)? Voinko käyttää vain HTML/CSS/JavaScriptiä ilman ulkoisia kirjastoja, vai sallitaanko myös esimerkiksi p5.js tai jQuery? === User: Ilman ulkoisia kirjastoja. === Ilman ulkoisia kirjastoja. Haluan vain html-tiedoston, jonka ajamalla voin pelata selaimen kautta peliä. Klassinen solitaire === Assistant: Selvä! === Selvä! Haen yksinkertaisen Klondike-pasianssin toteutuksen HTML-, CSS- ja JavaScript-muodossa, joka toimii suoraan selaimessa ilman ulkoisia kirjastoja. Ilmoitan sinulle, kun tiedosto on valmis tarkasteltavaksi. == gpt-? == === Assistant: Klondike-pasianssin toteutuksia HTML/CSS/JavaScriptillä === === Klondike-pasianssin toteutuksia HTML/CSS/JavaScriptillä === Netissä on useita esimerkkejä Klondike-pasianssista, jotka on toteutettu pelkällä HTML:llä, CSS:llä ja JavaSkriptillä ilman ulkoisia kirjastoja. Esimerkiksi GitHub-käyttäjän HectorVilas projektissa “solitaire” on klassinen Klondike-peli toteutettuna puhtaalla DOM-menetelmillägithub.com<ref>{{cite web|title=github.com|url=https://github.com/HectorVilas/solitaire#:~:text=Welcome%20to%20my%20new%20project%21,way%20to%20recreate%20this%20game|publisher=github.com|access-date=2025-11-28}}</ref>. Vastaavasti dev.to-sivustolla quantotius on julkaissut sarjan artikkeleita otsikolla “Building a Klondike Solitaire Game in Vanilla Javascript”, jossa pelin kaikki toiminnot rakennetaan nimenomaan ilman kirjastojadev.to<ref>{{cite web|title=dev.to|url=https://dev.to/quantotius/building-a-klondike-solitaire-game-in-vanilla-javascript-2jg0#:~:text=Building%20a%20Klondike%20Solitaire%20Game,in%20Vanilla%20Javascript|publisher=dev.to|access-date=2025-11-28}}</ref>. Myös SourceCodester-sivustolla esitteessä mainitaan yksinkertainen JavaScript-versio Klondikestasourcecodester.com<ref>{{cite web|title=sourcecodester.com|url=https://www.sourcecodester.com/javascript/16647/klondike-solitaire-card-game-javascript-free-source-code.html#:~:text=The%20Klondike%20Solitaire%20Card%20Game,to%20code%20in%20JavaScript%20programming|publisher=sourcecodester.com|access-date=2025-11-28}}</ref>. Sen sijaan jotkut esimerkit (esim. Game-Solitaire GitHubissa) käyttävät jQuerytä ja jQuery UI:tagithub.com<ref>{{cite web|title=github.com|url=https://github.com/michelleheh/Game-Solitaire#:~:text=Libraries%20Used|publisher=github.com|access-date=2025-11-28}}</ref>, jolloin ne eivät sovi vaatimukseen “ilman ulkoisia kirjastoja”. ==== Esimerkki: Yksitiedostoinen ratkaisu ==== Seuraavassa on esimerkki kevyestä Klondike-pelistä, joka on toteutettu kokonaan yhdelle HTML-sivulle ilman ulkoisia riippuvuuksia. Kaikki tyylit ja skriptit on sijoitettu suoraan tiedostoon, ja kortit piirretään tekstinä (♣♦♥♠), joten erillisiä kuvia tai verkkoyhteyksiä ei tarvita. Pelissä klikkaamalla nostetaan kortti pakasta (Stock) jätteen (Waste) päälle, ja valittua korttia voi siirtää sääntöjen mukaisesti joko johonkin lasinaluseen (Foundations) tai pöytään (Tableau) klikkaamalla tavoitekasaa. Tässä versiossa kortit näytetään periaatteessa avoimina (ei toteuteta erillisiä käännettyjä kortteja), mutta siirtojen perustarve (väri- ja arvosääntöjen valvonta, kuninkaiden siirto tyhjään pinoon jne.) on toteutettu. Peli toimii täysin paikallisesti selaimessa ilman internet-yhteyttä. <syntaxhighlight lang="html"><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Klondike Solitaire</title> <style> body { font-family: sans-serif; background: #0b5eac; color: white; } #stock { margin: 10px; width: 100px; height: 140px; line-height: 140px; text-align: center; background: #555; color: white; border: 2px solid #333; border-radius: 5px; cursor: pointer; } #stock.empty { background: #333; color: #888; } #waste { margin: 10px; width: 100px; min-height: 140px; background: green; border: 2px solid #333; border-radius: 5px; } #foundations { margin: 10px; } .foundation-container { display: inline-block; margin: 0 5px; vertical-align: top; } .foundation { width: 100px; height: 140px; background: darkgreen; border: 2px solid #333; border-radius: 5px; } #tableaus { margin: 10px; } .tableau { display: inline-block; margin: 0 5px; vertical-align: top; background: green; border: 2px solid #333; border-radius: 5px; } .tableau div { min-height: 140px; padding: 5px; } .card { width: 80px; height: 120px; background: white; color: black; border: 1px solid #222; border-radius: 5px; text-align: center; line-height: 120px; margin: 2px; display: inline-block; position: relative; } .card.red { color: red; } .selected { box-shadow: 0 0 10px yellow; } </style> </head> <body> <h1>Klondike Solitaire</h1> <div id="stock" onclick="drawCard()">Stock</div> <div id="waste"></div> <div id="foundations"> <div>Foundations:</div> <div class="foundation-container" onclick="dropInFoundation(0, event)"><div id="foundation0" class="foundation"></div></div> <div class="foundation-container" onclick="dropInFoundation(1, event)"><div id="foundation1" class="foundation"></div></div> <div class="foundation-container" onclick="dropInFoundation(2, event)"><div id="foundation2" class="foundation"></div></div> <div class="foundation-container" onclick="dropInFoundation(3, event)"><div id="foundation3" class="foundation"></div></div> </div> <div id="tableaus"> <div>Tableau:</div> <div class="tableau" onclick="dropInTableau(0)"><div id="col0"></div></div> <div class="tableau" onclick="dropInTableau(1)"><div id="col1"></div></div> <div class="tableau" onclick="dropInTableau(2)"><div id="col2"></div></div> <div class="tableau" onclick="dropInTableau(3)"><div id="col3"></div></div> <div class="tableau" onclick="dropInTableau(4)"><div id="col4"></div></div> <div class="tableau" onclick="dropInTableau(5)"><div id="col5"></div></div> <div class="tableau" onclick="dropInTableau(6)"><div id="col6"></div></div> </div> <script> // Pelin tietorakenteet var foundation = [[],[],[],[]]; var tableau = [[],[],[],[],[],[],[]]; var stock = [], waste = [], selectedCard = null; // Alustus: luodaan korttipakka ja jaetaan function init() { var suits = ['♣','♦','♥','♠'], deck = []; for (var s=0; s<4; s++) { for (var r=1; r<=13; r++) { var color = (suits[s]=='♥'||suits[s]=='♦')?'red':'black'; deck.push({suit:suits[s], rank:r, color:color}); } } // sekoitus (Fisher–Yates) for (var i=deck.length-1; i>0; i--) { var j = Math.floor(Math.random()*(i+1)); var tmp=deck[i]; deck[i]=deck[j]; deck[j]=tmp; } // jaetaan pöydälle: i:äässäin i+1 korttia for (var i=0; i<7; i++) { for (var j=0; j<=i; j++) { tableau[i].push(deck.pop()); } } stock = deck.splice(0); // loput pakkaan updateUI(); } // Päivitetään käyttöliittymä tauluilta function updateUI() { // Päivitä stock-pakka var stockDiv = document.getElementById('stock'); if (stock.length>0) { stockDiv.textContent = 'Stock ('+stock.length+')'; stockDiv.className = ''; } else { stockDiv.textContent = 'Stock (0)'; stockDiv.className = 'empty'; } // Päivitä waste (vain päällimmäinen kortti näkyviin) var wasteDiv = document.getElementById('waste'); wasteDiv.innerHTML = ''; if (waste.length>0) { wasteDiv.appendChild(createCardDiv(waste[waste.length-1])); } // Päivitä foundations for (var f=0; f<4; f++) { var fd = document.getElementById('foundation'+f); fd.innerHTML = ''; if (foundation[f].length>0) { fd.appendChild(createCardDiv(foundation[f].slice(-1)[0])); } } // Päivitä tableau-pakat for (var t=0; t<7; t++) { var col = document.getElementById('col'+t); col.innerHTML = ''; for (var c=0; c<tableau[t].length; c++) { col.appendChild(createCardDiv(tableau[t][c])); } } } // Luo yksittäisen kortin HTML-elementin function createCardDiv(card) { var div = document.createElement('div'); div.className = 'card ' + card.color; var rankNames = [null,'A','2','3','4','5','6','7','8','9','10','J','Q','K']; div.textContent = rankNames[card.rank] + card.suit; div.card = card; div.onclick = function(evt) { selectCard(this); evt.stopPropagation(); }; return div; } // Kortin nostaminen stock-pakasta (klikkaamalla) function drawCard() { if (stock.length === 0) { // jos pakka tyhjä, palautetaan waste uudeksi pakaksi while (waste.length>0) stock.push(waste.pop()); } else { waste.push(stock.pop()); } if (selectedCard) { selectedCard.classList.remove('selected'); selectedCard=null; } updateUI(); } // Kortin valinta siirtoa varten function selectCard(elem) { if (!selectedCard) { // valitaan vain waste-päällinen tai tableau-kortti var pid = elem.parentElement.id; if (pid==='waste' || pid.startsWith('col')) { selectedCard = elem; elem.classList.add('selected'); } } else { // jo valittu kortti -> yritetään siirtää valittuun kohtaan var pid = elem.parentElement.id; if (pid.startsWith('col')) { dropInTableau(parseInt(pid.replace('col',''))); } else if (pid.startsWith('foundation')) { var f = parseInt(pid.replace('foundation','')); dropInFoundation(f, event); } if (selectedCard) { selectedCard.classList.remove('selected'); selectedCard=null; } updateUI(); } } // Siirto lasinaluseen (tyhjään tai päällimmäisen kortin päälle) function dropInFoundation(index, evt) { // tapahtuu, kun klikataan tyhjää alusta-aluetta if (evt.target.id.startsWith('foundation')) { if (!selectedCard) return; // jos tyhjä: vaatii Ässän if (foundation[index].length===0 && selectedCard.card.rank===1) { removeSelectedCard(); foundation[index].push(selectedCard.card); } selectedCard.classList.remove('selected'); selectedCard=null; updateUI(); } } // Siirto tableau-pinoon function dropInTableau(index) { if (!selectedCard) return; var card = selectedCard.card; removeSelectedCard(); var dest = tableau[index]; if (dest.length===0) { // tyhjään vain kuningas if (card.rank===13) dest.push(card); else undoReturn(card); } else { var top = dest[dest.length-1]; // vuorovärisyys ja numero ylin+1 if (top.color!==card.color && top.rank===card.rank+1) { dest.push(card); } else { undoReturn(card); } } selectedCard.classList.remove('selected'); selectedCard=null; updateUI(); } // Poistaa valitun kortin alkuperäisestä paikasta function removeSelectedCard() { var card = selectedCard.card; if (waste[waste.length-1]===card) { waste.pop(); } else { for (var i=0; i<7; i++) { var idx = tableau[i].indexOf(card); if (idx>=0) { tableau[i].splice(idx,1); break; } } } } // Palautus, jos siirto epäonnistuu (yksinkertaistus) function undoReturn(card) { // yksinkertainen: laitetaan kortti loppuun ensimmäiseen tableau-kasaan for (var i=0;i<7;i++) { if (tableau[i].length<=i) { tableau[i].push(card); break; } } } window.onload = init; </script> </body> </html> </syntaxhighlight> Tämän koodin voi tallentaa esimerkiksi tiedostoon solitaire.html ja avata selaimessa. Peli toimii ilman internet-yhteyttä ja ilman ulkopuolisia kirjastoja. Korttien symbolit (♣♦♥♠) tulevat fontista, joten erillisiä kuvia ei tarvita. Peliä pelataan klikkaamalla: Stock-kohtaa kortin nostamiseksi, ja sitten klikkaamalla valittua korttia ja sen siirto-kohdetta (lautaa tai foundationia) sääntöjen mukaan. Lähteet: Esimerkkejä puhtaista HTML/CSS/JS-pasiansseista löytyy mm. GitHubistagithub.com<ref>{{cite web|title=github.com|url=https://github.com/HectorVilas/solitaire#:~:text=Welcome%20to%20my%20new%20project%21,way%20to%20recreate%20this%20game|publisher=github.com|access-date=2025-11-28}}</ref> ja dev.to-blogisarjoistadev.to<ref>{{cite web|title=dev.to|url=https://dev.to/quantotius/building-a-klondike-solitaire-game-in-vanilla-javascript-2jg0#:~:text=Building%20a%20Klondike%20Solitaire%20Game,in%20Vanilla%20Javascript|publisher=dev.to|access-date=2025-11-28}}</ref>. Eräät toteutukset (kuten GitHubin Game-Solitaire) käyttävät jQueryägithub.com<ref>{{cite web|title=github.com|url=https://github.com/michelleheh/Game-Solitaire#:~:text=Libraries%20Used|publisher=github.com|access-date=2025-11-28}}</ref>, mutta yllä oleva ratkaisu on rakennettu nimenomaan ilman ulkoisia kirjastoja. Lisäksi SourceCodester-sivu kuvaa perusklondiken toteutusta JavaScriptilläsourcecodester.com<ref>{{cite web|title=sourcecodester.com|url=https://www.sourcecodester.com/javascript/16647/klondike-solitaire-card-game-javascript-free-source-code.html#:~:text=The%20Klondike%20Solitaire%20Card%20Game,to%20code%20in%20JavaScript%20programming|publisher=sourcecodester.com|access-date=2025-11-28}}</ref>, mikä vahvistaa, että tällainen täysin omakätinen ratkaisu on mahdollista. Kaikki yllä oleva toteutus on paikallista ja toimii myös offline-tilassa. == References == <references /> [[Category:ChatGPT Shares]] [[Category:openai]]
Summary:
Please note that all contributions to freem are considered to be released under the Creative Commons Attribution-ShareAlike 4.0 (see
Freem:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Templates used on this page:
Template:Cite web
(
edit
)
Module:Citation/CS1
(
edit
)
Module:Citation/CS1/COinS
(
edit
)
Module:Citation/CS1/Configuration
(
edit
)
Module:Citation/CS1/Date validation
(
edit
)
Module:Citation/CS1/Identifiers
(
edit
)
Module:Citation/CS1/Utilities
(
edit
)
Module:Citation/CS1/Whitelist
(
edit
)
Module:Citation/CS1/styles.css
(
edit
)