<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://freemwiki.com/index.php?action=history&amp;feed=atom&amp;title=Openai%2F6929f812-9cc4-800c-9c5b-06df7e85abe3</id>
	<title>Openai/6929f812-9cc4-800c-9c5b-06df7e85abe3 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://freemwiki.com/index.php?action=history&amp;feed=atom&amp;title=Openai%2F6929f812-9cc4-800c-9c5b-06df7e85abe3"/>
	<link rel="alternate" type="text/html" href="https://freemwiki.com/index.php?title=Openai/6929f812-9cc4-800c-9c5b-06df7e85abe3&amp;action=history"/>
	<updated>2026-04-08T10:40:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://freemwiki.com/index.php?title=Openai/6929f812-9cc4-800c-9c5b-06df7e85abe3&amp;diff=593791&amp;oldid=prev</id>
		<title>Lukegao: by freem.ai...</title>
		<link rel="alternate" type="text/html" href="https://freemwiki.com/index.php?title=Openai/6929f812-9cc4-800c-9c5b-06df7e85abe3&amp;diff=593791&amp;oldid=prev"/>
		<updated>2025-11-29T05:28:36Z</updated>

		<summary type="html">&lt;p&gt;by freem.ai...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
{{DISPLAYTITLE:Pasianssipelin toteutus}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;This conversation was exported from ChatGPT&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{cite web|title=Pasianssipelin toteutus|url=https://chatgpt.com/share/6929f812-9cc4-800c-9c5b-06df7e85abe3|publisher=ChatGPT|access-date=2025-11-28}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== research ==&lt;br /&gt;
=== User: Sinulta halutaan seuraavaa: ===&lt;br /&gt;
Sinulta halutaan seuraavaa:&lt;br /&gt;
” kysy pasianssi pelin koodia niin saan kevyen pasianssi pelin”&lt;br /&gt;
” Vaikka html-muodossa niin voi selaimessa pelata”&lt;br /&gt;
 Toteuta&lt;br /&gt;
&lt;br /&gt;
=== Assistant: Haluatko yksinkertaisen pasianssipelin, kuten Klondike klassinen Solitaire, vai jonkin muun version esim. ===&lt;br /&gt;
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?&lt;br /&gt;
&lt;br /&gt;
=== User: Ilman ulkoisia kirjastoja. ===&lt;br /&gt;
Ilman ulkoisia kirjastoja. Haluan vain html-tiedoston, jonka ajamalla voin pelata selaimen kautta peliä. Klassinen solitaire&lt;br /&gt;
&lt;br /&gt;
=== Assistant: Selvä! ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== gpt-? ==&lt;br /&gt;
=== Assistant: Klondike-pasianssin toteutuksia HTML/CSS/JavaScriptillä ===&lt;br /&gt;
=== Klondike-pasianssin toteutuksia HTML/CSS/JavaScriptillä ===&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;ref&amp;gt;{{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}}&amp;lt;/ref&amp;gt;. 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&amp;lt;ref&amp;gt;{{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}}&amp;lt;/ref&amp;gt;. Myös SourceCodester-sivustolla esitteessä mainitaan yksinkertainen JavaScript-versio Klondikestasourcecodester.com&amp;lt;ref&amp;gt;{{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}}&amp;lt;/ref&amp;gt;. Sen sijaan jotkut esimerkit (esim. Game-Solitaire GitHubissa) käyttävät jQuerytä ja jQuery UI:tagithub.com&amp;lt;ref&amp;gt;{{cite web|title=github.com|url=https://github.com/michelleheh/Game-Solitaire#:~:text=Libraries%20Used|publisher=github.com|access-date=2025-11-28}}&amp;lt;/ref&amp;gt;, jolloin ne eivät sovi vaatimukseen “ilman ulkoisia kirjastoja”.&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki: Yksitiedostoinen ratkaisu ====&lt;br /&gt;
&lt;br /&gt;
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ä.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Klondike Solitaire&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
body { font-family: sans-serif; background: #0b5eac; color: white; }&lt;br /&gt;
#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; }&lt;br /&gt;
#stock.empty { background: #333; color: #888; }&lt;br /&gt;
#waste { margin: 10px; width: 100px; min-height: 140px; background: green; border: 2px solid #333; border-radius: 5px; }&lt;br /&gt;
#foundations { margin: 10px; }&lt;br /&gt;
.foundation-container { display: inline-block; margin: 0 5px; vertical-align: top; }&lt;br /&gt;
.foundation { width: 100px; height: 140px; background: darkgreen; border: 2px solid #333; border-radius: 5px; }&lt;br /&gt;
#tableaus { margin: 10px; }&lt;br /&gt;
.tableau { display: inline-block; margin: 0 5px; vertical-align: top; background: green; border: 2px solid #333; border-radius: 5px; }&lt;br /&gt;
.tableau div { min-height: 140px; padding: 5px; }&lt;br /&gt;
.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; }&lt;br /&gt;
.card.red { color: red; }&lt;br /&gt;
.selected { box-shadow: 0 0 10px yellow; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Klondike Solitaire&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;stock&amp;quot; onclick=&amp;quot;drawCard()&amp;quot;&amp;gt;Stock&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;waste&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;foundations&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;Foundations:&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;foundation-container&amp;quot; onclick=&amp;quot;dropInFoundation(0, event)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;foundation0&amp;quot; class=&amp;quot;foundation&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;foundation-container&amp;quot; onclick=&amp;quot;dropInFoundation(1, event)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;foundation1&amp;quot; class=&amp;quot;foundation&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;foundation-container&amp;quot; onclick=&amp;quot;dropInFoundation(2, event)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;foundation2&amp;quot; class=&amp;quot;foundation&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;foundation-container&amp;quot; onclick=&amp;quot;dropInFoundation(3, event)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;foundation3&amp;quot; class=&amp;quot;foundation&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;tableaus&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;Tableau:&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;tableau&amp;quot; onclick=&amp;quot;dropInTableau(0)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;col0&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;tableau&amp;quot; onclick=&amp;quot;dropInTableau(1)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;col1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;tableau&amp;quot; onclick=&amp;quot;dropInTableau(2)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;col2&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;tableau&amp;quot; onclick=&amp;quot;dropInTableau(3)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;col3&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;tableau&amp;quot; onclick=&amp;quot;dropInTableau(4)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;col4&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;tableau&amp;quot; onclick=&amp;quot;dropInTableau(5)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;col5&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;tableau&amp;quot; onclick=&amp;quot;dropInTableau(6)&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;col6&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
// Pelin tietorakenteet&lt;br /&gt;
var foundation = [[],[],[],[]];&lt;br /&gt;
var tableau = [[],[],[],[],[],[],[]];&lt;br /&gt;
var stock = [], waste = [], selectedCard = null;&lt;br /&gt;
&lt;br /&gt;
// Alustus: luodaan korttipakka ja jaetaan&lt;br /&gt;
function init() {&lt;br /&gt;
    var suits = [&amp;#039;♣&amp;#039;,&amp;#039;♦&amp;#039;,&amp;#039;♥&amp;#039;,&amp;#039;♠&amp;#039;], deck = [];&lt;br /&gt;
    for (var s=0; s&amp;lt;4; s++) {&lt;br /&gt;
        for (var r=1; r&amp;lt;=13; r++) {&lt;br /&gt;
            var color = (suits[s]==&amp;#039;♥&amp;#039;||suits[s]==&amp;#039;♦&amp;#039;)?&amp;#039;red&amp;#039;:&amp;#039;black&amp;#039;;&lt;br /&gt;
            deck.push({suit:suits[s], rank:r, color:color});&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // sekoitus (Fisher–Yates)&lt;br /&gt;
    for (var i=deck.length-1; i&amp;gt;0; i--) {&lt;br /&gt;
        var j = Math.floor(Math.random()*(i+1));&lt;br /&gt;
        var tmp=deck[i]; deck[i]=deck[j]; deck[j]=tmp;&lt;br /&gt;
    }&lt;br /&gt;
    // jaetaan pöydälle: i:äässäin i+1 korttia&lt;br /&gt;
    for (var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
        for (var j=0; j&amp;lt;=i; j++) {&lt;br /&gt;
            tableau[i].push(deck.pop());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    stock = deck.splice(0); // loput pakkaan&lt;br /&gt;
    updateUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Päivitetään käyttöliittymä tauluilta&lt;br /&gt;
function updateUI() {&lt;br /&gt;
    // Päivitä stock-pakka&lt;br /&gt;
    var stockDiv = document.getElementById(&amp;#039;stock&amp;#039;);&lt;br /&gt;
    if (stock.length&amp;gt;0) {&lt;br /&gt;
        stockDiv.textContent = &amp;#039;Stock (&amp;#039;+stock.length+&amp;#039;)&amp;#039;;&lt;br /&gt;
        stockDiv.className = &amp;#039;&amp;#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
        stockDiv.textContent = &amp;#039;Stock (0)&amp;#039;;&lt;br /&gt;
        stockDiv.className = &amp;#039;empty&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    // Päivitä waste (vain päällimmäinen kortti näkyviin)&lt;br /&gt;
    var wasteDiv = document.getElementById(&amp;#039;waste&amp;#039;);&lt;br /&gt;
    wasteDiv.innerHTML = &amp;#039;&amp;#039;;&lt;br /&gt;
    if (waste.length&amp;gt;0) {&lt;br /&gt;
        wasteDiv.appendChild(createCardDiv(waste[waste.length-1]));&lt;br /&gt;
    }&lt;br /&gt;
    // Päivitä foundations&lt;br /&gt;
    for (var f=0; f&amp;lt;4; f++) {&lt;br /&gt;
        var fd = document.getElementById(&amp;#039;foundation&amp;#039;+f);&lt;br /&gt;
        fd.innerHTML = &amp;#039;&amp;#039;;&lt;br /&gt;
        if (foundation[f].length&amp;gt;0) {&lt;br /&gt;
            fd.appendChild(createCardDiv(foundation[f].slice(-1)[0]));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Päivitä tableau-pakat&lt;br /&gt;
    for (var t=0; t&amp;lt;7; t++) {&lt;br /&gt;
        var col = document.getElementById(&amp;#039;col&amp;#039;+t);&lt;br /&gt;
        col.innerHTML = &amp;#039;&amp;#039;;&lt;br /&gt;
        for (var c=0; c&amp;lt;tableau[t].length; c++) {&lt;br /&gt;
            col.appendChild(createCardDiv(tableau[t][c]));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Luo yksittäisen kortin HTML-elementin&lt;br /&gt;
function createCardDiv(card) {&lt;br /&gt;
    var div = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
    div.className = &amp;#039;card &amp;#039; + card.color;&lt;br /&gt;
    var rankNames = [null,&amp;#039;A&amp;#039;,&amp;#039;2&amp;#039;,&amp;#039;3&amp;#039;,&amp;#039;4&amp;#039;,&amp;#039;5&amp;#039;,&amp;#039;6&amp;#039;,&amp;#039;7&amp;#039;,&amp;#039;8&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;10&amp;#039;,&amp;#039;J&amp;#039;,&amp;#039;Q&amp;#039;,&amp;#039;K&amp;#039;];&lt;br /&gt;
    div.textContent = rankNames[card.rank] + card.suit;&lt;br /&gt;
    div.card = card;&lt;br /&gt;
    div.onclick = function(evt) { selectCard(this); evt.stopPropagation(); };&lt;br /&gt;
    return div;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Kortin nostaminen stock-pakasta (klikkaamalla)&lt;br /&gt;
function drawCard() {&lt;br /&gt;
    if (stock.length === 0) {&lt;br /&gt;
        // jos pakka tyhjä, palautetaan waste uudeksi pakaksi&lt;br /&gt;
        while (waste.length&amp;gt;0) stock.push(waste.pop());&lt;br /&gt;
    } else {&lt;br /&gt;
        waste.push(stock.pop());&lt;br /&gt;
    }&lt;br /&gt;
    if (selectedCard) { selectedCard.classList.remove(&amp;#039;selected&amp;#039;); selectedCard=null; }&lt;br /&gt;
    updateUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Kortin valinta siirtoa varten&lt;br /&gt;
function selectCard(elem) {&lt;br /&gt;
    if (!selectedCard) {&lt;br /&gt;
        // valitaan vain waste-päällinen tai tableau-kortti&lt;br /&gt;
        var pid = elem.parentElement.id;&lt;br /&gt;
        if (pid===&amp;#039;waste&amp;#039; || pid.startsWith(&amp;#039;col&amp;#039;)) {&lt;br /&gt;
            selectedCard = elem;&lt;br /&gt;
            elem.classList.add(&amp;#039;selected&amp;#039;);&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        // jo valittu kortti -&amp;gt; yritetään siirtää valittuun kohtaan&lt;br /&gt;
        var pid = elem.parentElement.id;&lt;br /&gt;
        if (pid.startsWith(&amp;#039;col&amp;#039;)) {&lt;br /&gt;
            dropInTableau(parseInt(pid.replace(&amp;#039;col&amp;#039;,&amp;#039;&amp;#039;)));&lt;br /&gt;
        } else if (pid.startsWith(&amp;#039;foundation&amp;#039;)) {&lt;br /&gt;
            var f = parseInt(pid.replace(&amp;#039;foundation&amp;#039;,&amp;#039;&amp;#039;));&lt;br /&gt;
            dropInFoundation(f, event);&lt;br /&gt;
        }&lt;br /&gt;
        if (selectedCard) { selectedCard.classList.remove(&amp;#039;selected&amp;#039;); selectedCard=null; }&lt;br /&gt;
        updateUI();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Siirto lasinaluseen (tyhjään tai päällimmäisen kortin päälle)&lt;br /&gt;
function dropInFoundation(index, evt) {&lt;br /&gt;
    // tapahtuu, kun klikataan tyhjää alusta-aluetta&lt;br /&gt;
    if (evt.target.id.startsWith(&amp;#039;foundation&amp;#039;)) {&lt;br /&gt;
        if (!selectedCard) return;&lt;br /&gt;
        // jos tyhjä: vaatii Ässän&lt;br /&gt;
        if (foundation[index].length===0 &amp;amp;&amp;amp; selectedCard.card.rank===1) {&lt;br /&gt;
            removeSelectedCard(); foundation[index].push(selectedCard.card);&lt;br /&gt;
        }&lt;br /&gt;
        selectedCard.classList.remove(&amp;#039;selected&amp;#039;); selectedCard=null;&lt;br /&gt;
        updateUI();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Siirto tableau-pinoon&lt;br /&gt;
function dropInTableau(index) {&lt;br /&gt;
    if (!selectedCard) return;&lt;br /&gt;
    var card = selectedCard.card;&lt;br /&gt;
    removeSelectedCard();&lt;br /&gt;
    var dest = tableau[index];&lt;br /&gt;
    if (dest.length===0) {&lt;br /&gt;
        // tyhjään vain kuningas&lt;br /&gt;
        if (card.rank===13) dest.push(card);&lt;br /&gt;
        else undoReturn(card);&lt;br /&gt;
    } else {&lt;br /&gt;
        var top = dest[dest.length-1];&lt;br /&gt;
        // vuorovärisyys ja numero ylin+1&lt;br /&gt;
        if (top.color!==card.color &amp;amp;&amp;amp; top.rank===card.rank+1) {&lt;br /&gt;
            dest.push(card);&lt;br /&gt;
        } else {&lt;br /&gt;
            undoReturn(card);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    selectedCard.classList.remove(&amp;#039;selected&amp;#039;); selectedCard=null;&lt;br /&gt;
    updateUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Poistaa valitun kortin alkuperäisestä paikasta&lt;br /&gt;
function removeSelectedCard() {&lt;br /&gt;
    var card = selectedCard.card;&lt;br /&gt;
    if (waste[waste.length-1]===card) {&lt;br /&gt;
        waste.pop();&lt;br /&gt;
    } else {&lt;br /&gt;
        for (var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
            var idx = tableau[i].indexOf(card);&lt;br /&gt;
            if (idx&amp;gt;=0) { tableau[i].splice(idx,1); break; }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Palautus, jos siirto epäonnistuu (yksinkertaistus)&lt;br /&gt;
function undoReturn(card) {&lt;br /&gt;
    // yksinkertainen: laitetaan kortti loppuun ensimmäiseen tableau-kasaan&lt;br /&gt;
    for (var i=0;i&amp;lt;7;i++) {&lt;br /&gt;
        if (tableau[i].length&amp;lt;=i) { tableau[i].push(card); break; }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = init;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Lähteet: Esimerkkejä puhtaista HTML/CSS/JS-pasiansseista löytyy mm. GitHubistagithub.com&amp;lt;ref&amp;gt;{{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}}&amp;lt;/ref&amp;gt; ja dev.to-blogisarjoistadev.to&amp;lt;ref&amp;gt;{{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}}&amp;lt;/ref&amp;gt;. Eräät toteutukset (kuten GitHubin Game-Solitaire) käyttävät jQueryägithub.com&amp;lt;ref&amp;gt;{{cite web|title=github.com|url=https://github.com/michelleheh/Game-Solitaire#:~:text=Libraries%20Used|publisher=github.com|access-date=2025-11-28}}&amp;lt;/ref&amp;gt;, mutta yllä oleva ratkaisu on rakennettu nimenomaan ilman ulkoisia kirjastoja. Lisäksi SourceCodester-sivu kuvaa perusklondiken toteutusta JavaScriptilläsourcecodester.com&amp;lt;ref&amp;gt;{{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}}&amp;lt;/ref&amp;gt;, mikä vahvistaa, että tällainen täysin omakätinen ratkaisu on mahdollista. Kaikki yllä oleva toteutus on paikallista ja toimii myös offline-tilassa.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ChatGPT Shares]]&lt;br /&gt;
[[Category:openai]]&lt;/div&gt;</summary>
		<author><name>Lukegao</name></author>
	</entry>
</feed>