I&#39;m still not sure you&#39;re thinking about this the right way. Maybe it would help to see a working version (although not a *good* working version).<br>This e-mail is a literate haskell program, copy everything from the next line till the EOF into nim.lhs and run it.<br>
----<br>Import the modules we need.<br><br>&gt; import Control.Monad<br>&gt; import System.Random<br><br>Define the types we&#39;re going to be using.<br><br>&gt; data PileName = A | B | C deriving (Show, Eq, Read)<br>&gt; type State = [Int]<br>
&gt; type Move = (PileName, Int)<br><br>initNim setups a new random game State.<br><br>&gt; initNim :: IO State<br>&gt; initNim = replicateM 3 $ randomRIO (1,10)<br><br>doMove takes a Move, and a initial State<br>and returns the updated game State after the Move.<br>
<br>&gt; doMove :: Move -&gt; State -&gt; State<br>&gt; doMove (A,x) xs = zipWith (-) xs [x,0,0]<br>&gt; doMove (B,x) xs = zipWith (-) xs [0,x,0]<br>&gt; doMove (C,x) xs = zipWith (-) xs [0,0,x]<br><br>getMove returns the next Move.<br>
<br>&gt; getMove :: IO Move<br>&gt; getMove = do<br>&gt;     putStrLn &quot;Which pile A, B, or C?&quot;<br>&gt;     x &lt;- readLn<br>&gt;     putStrLn &quot;How many stones?&quot;<br>&gt;     y &lt;- readLn<br>&gt;     return (x,y)<br>
<br>checkWin takes a State and returns whether the game<br>has been won or not.<br><br>&gt; checkWin :: State -&gt; Bool<br>&gt; checkWin [1,0,0] = True<br>&gt; checkWin [0,1,0] = True<br>&gt; checkWin [0,0,1] = True<br>&gt; checkWin _       = False<br>
<br>doRound takes the current game State, performs one<br>round of play, and returns the updated State.<br><br>&gt; doRound :: State -&gt; IO State<br>&gt; doRound oldState = do<br>&gt;     putStrLn . show $ oldState<br>&gt;     move &lt;- getMove<br>
&gt;     let newState = doMove move oldState<br>&gt;     return newState<br><br>untilM is a little helper function. To understand<br>what it does take a look at the until function<br>defined in Prelude. untilM does the same thing<br>
but inside of a Monad (in this case IO). The<br>short version is that it runs the second function<br>it&#39;s given until the first function returns True.<br><br>&gt; untilM :: (Mona m) =&gt; (a -&gt; Bool) -&gt; (a -&gt; m a) -&gt; a -&gt; m a<br>
&gt; untilM p f x | p x = return x | otherwise = f x &gt;&gt;= untilM p f<br><br>The main ties everything together by initializing<br>the starting state, and then kicking off the<br>doRound loop (via untilM).<br><br>&gt; main :: IO ()<br>
&gt; main = do<br>&gt;     state &lt;- initNim<br>&gt;     untilM checkWin doRound state<br>&gt;     putStrLn &quot;You win!&quot;<br><br>Areas for improvement include the following:<br><br>No error checking on user input, if you enter an invalid pile or <br>
something that isn&#39;t a number (or is more then the number<br>of stones in the pile) bad things happen (hint: lookup try<br>catch and exception handling tutorials)<br><br>The checkWin function, the doMove, and the doRound<br>
function don&#39;t do any sort of check to make sure the number<br>of stones removed can actually be removed (that is, none<br>of the piles go negative), nor is there a check done for<br>if *all* stones get removed.<br><br>
It might be educational to change the type of State from<br>[Int] to (Int, [Int]) with the first value being the number of the<br>player who&#39;s turn it is. Adjust the various functions to<br>accept the new type of State and to update it appropriately.<br>
<br>----<br>EOF<br><br clear="all">-R. Kyle Murphy<br>-- <br>Curiosity was framed, Ignorance killed the cat.<br>
<br><br><div class="gmail_quote">On Tue, Oct 27, 2009 at 08:39, John Moore <span dir="ltr">&lt;<a href="mailto:john.moore54@gmail.com">john.moore54@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>Hi getting there with nimprogram well have it working in different areas.</div>
<div> </div>
<div>The last part is where the most trouble is</div>
<div>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">import Control.Monad </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">import System.Random </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">initNim :: IO [Int]</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">initNim = replicateM 3 $ randomRIO (1,10)--- This get the random numbers</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">data PileName = A | B | C deriving (Show, Eq, Read)</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">typeOfMove :: (PileName, Int) -&gt; [Int] -&gt; [Int]</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">typeOfMove (A, x) xs = zipWith (-) xs [x,0,0]</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">typeOfMove (B, x) xs = zipWith (-) xs [0,x,0]</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">typeOfMove (C, x) xs = zipWith (-) xs [0,0,x]</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">main :: IO ()</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">main = do</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>    </span>putStrLn &quot;Which pile A, B, or C ?&quot;</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>    </span>x &lt;- readLn</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>    </span>putStrLn &quot;How many stones?&quot;</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>    </span>y &lt;- readLn</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span> </span><span>   </span>let z = typeOfMove (x,y) [9,9,9]-- cannot get the random numbers here</font></span></p>


<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>    </span>putStrLn . show $ z</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> <u><font style="background-color: rgb(255, 255, 0);">This is where the main problem is I &#39;m trying to run the game?</font></u></font></span></p>


<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">play nim = do</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>  </span>z &lt;- getLine</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>             </span>newAnswer &lt;- return (diff z)</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">if newAnswer == [0,0,1]||[0,1,0]||[1,0,0]</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>                 </span>then putStrn &quot;You win&quot;</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"><span>                 </span>else play nim newAnswer</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">diff z ws hs =[ if z==w then w else h]-- trying to return different list here</font></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"></font></span> </p><font color="#888888">
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman"></font></span> </p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-size: 14pt;"><font face="Times New Roman">John</font></span></p></font></div>
<br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br>