Rock Paper Scissors
Basic Stamp 2 vs Propeller, rock paper scissors style. Both are generating random numbers assigned to rock, paper and scissors. The BS2 uses a CdS photo-resistor and capacitor to seed its random function. The Propeller uses Real Random object to induce and measure PLL jitter, which changes with temperature. The outcome of game is effected by both ambient light, temps, and some luck, probably.
The BS2 side listens via half-duplex serial for the Propeller to tell it to play a round. When told the BS2 samples the RC circuit and seeds a random number. The output of that number corresponds with a numerical value for rock, paper or scissors which it then sends back to the Propeller.
After the Propeller collects the outcome of the BS2s turn it generates its own random number. The propeller compares the BS2s result with its own, and scores the round accordingly.
For serial, Stamp pin 15 is connected in to Propeller pin 0 using a 2.2k in series and a 4.7k tied to 3.3v to pull it high. I used the Simple Serial OBEX object and SEROUT BS2 command.
And now, let the games begin!
[video=youtube_share;o0TqaFko5Us]
BS2:
Propeller:
The BS2 side listens via half-duplex serial for the Propeller to tell it to play a round. When told the BS2 samples the RC circuit and seeds a random number. The output of that number corresponds with a numerical value for rock, paper or scissors which it then sends back to the Propeller.
After the Propeller collects the outcome of the BS2s turn it generates its own random number. The propeller compares the BS2s result with its own, and scores the round accordingly.
For serial, Stamp pin 15 is connected in to Propeller pin 0 using a 2.2k in series and a 4.7k tied to 3.3v to pull it high. I used the Simple Serial OBEX object and SEROUT BS2 command.
And now, let the games begin!
[video=youtube_share;o0TqaFko5Us]
BS2:
' {$STAMP BS2} ' {$PBASIC 2.5} 'BS2 Player Program 'Cons RC PIN 0 btx CON 15 baud CON $54 timeout CON 3000 'VARs command VAR Word result VAR Byte DO SERIN btx, baud, timeout, fail, [command] 'receive from propeller PAUSE 20 IF command = 4 THEN GOSUB Run LOOP Fail: RETURN Run: HIGH RC ' charge the cap PAUSE 1 ' for 1 ms RCTIME RC, 1, result ' measure RC discharge time PAUSE 50 RANDOM result ' generate random number PAUSE 1000 IF result => 0 AND result < 50 THEN GOSUB rock IF result => 50 AND result < 100 THEN GOSUB paper IF result => 100 AND result < 150 THEN GOSUB scissors IF result => 150 AND result < 200 THEN GOSUB rock IF result => 200 AND result < 250 THEN GOSUB paper IF result => 250 AND result < 300 THEN GOSUB scissors RETURN rock: SEROUT btx, baud, [1] 'send 1 to prop PAUSE 1000 HIGH 3 PAUSE 500 LOW 3 RETURN paper: 'send 2 to prop SEROUT btx, baud, [2] PAUSE 1000 HIGH 4 PAUSE 500 LOW 4 RETURN scissors: 'send 3 to prop SEROUT btx, baud, [3] PAUSE 1000 HIGH 5 PAUSE 500 LOW 5 RETURN
Propeller:
{{ }} CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 EMICsIN = 14 'EMIC II Serial In EMICsOUT = 15 'EMIC II Serial Out VAR byte rrr word number byte BS2round byte PropRound byte BS2score byte Propscore OBJ pst : "Parallax Serial Terminal" rr : "RealRandom" Serial : "FullDuplexSerial" bs2 : "Simple_Serial" lcd : "SparkFun_serial_lcd" PUB start lcd.init(1,9600,2,20) lcd.displayOn lcd.cursor(0) lcd.backlight(true) lcd.clrln(1) lcd.clrln(0) lcd.str(string("STAMP PROP")) dira [16] := 1 'Rock LEDS dira [17] := 1 'Paper dira [18] := 1 'Scissors bs2score := 0 propscore := 0 rr.start 'start RealRandom pst.Start(9600) 'start PST '---Init EMIC II--- serial.Start(EMICsOUT, EMICsIN, %0000, 9_600) 'Start serial port, normal mode, 9600bps serial.TX(pst#NL) 'Send a CR in case the system is already up repeat until serial.RxCheck == ":" 'When the Emic 2 has initialized and is ready, it will send a single ':' character, so wait here until we receive it waitcnt(clkfreq / 100 + cnt) 'Delay 10mS serial.RxFlush 'Flush the receive buffer serial.Str(String("N0", pst#NL)) 'voice *try n4 repeat until serial.RxCheck == ":" serial.Str(String("V18", pst#NL)) 'volume 18 max repeat until serial.RxCheck == ":" serial.Str(String("W300", pst#NL)) 'words per minute repeat until serial.RxCheck == ":" serial.TX("S") serial.Str(string("\/\/\/\/\/\/ reboot ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" begin program PUB Program propround := 0 bs2round := 0 startgame repeat listen PUB StartGame BS2.init(-1, 0, 9600) 'start serial send BS2.tx(4) waitcnt(clkfreq*1+cnt) PUB Listen | com BS2.init(0, -1, 9600) 'start serial rx repeat com := BS2.rx if com == 1 ' rock BS2round := 1 bs2rock main if com == 2 ' paper BS2round := 2 bs2paper main if com == 3 ' scissor BS2round := 3 bs2scissors main PUB Score if bs2round == propround 'tie tie if bs2round == 1 and propround == 2 'rock vs paper WIN PropScore := Propscore + 1 propwins if bs2round == 1 and propround == 3 'rock vs scissors LOSE BS2Score := BS2Score + 1 bs2wins if bs2round == 2 and propround == 1 'paper vs rock LOSE BS2Score := BS2Score + 1 bs2wins if bs2round == 2 and propround == 3 'paper vs scissors WIN PropScore := Propscore + 1 propwins if bs2round == 3 and propround == 1 'scissors vs rock WIN PropScore := Propscore + 1 propwins if bs2round == 3 and propround == 2 'scissors vs paper LOSE BS2Score := BS2Score + 1 bs2wins Pst.Str(string(" BS2Score: ")) pst.dec(bs2score) Pst.Str(string(" Prop Score: ")) pst.dec(propscore) lcd.gotoxy(0, 1) lcd.dec(bs2score) lcd.gotoxy(9, 1) lcd.dec(propscore) program PUB tie serial.TX("S") serial.Str(string("\/\/ Tie ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" waitcnt(clkfreq*1+cnt) PUB bs2wins serial.TX("S") serial.Str(string("\/\/ Stamp Wins ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" waitcnt(clkfreq*1+cnt) PUB propwins serial.TX("S") serial.Str(string("\/\/\/ Propeller Wins ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" waitcnt(clkfreq*1+cnt) PUB bs2Rock serial.TX("S") serial.Str(string("\/\/\/ Stamp Rock ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" PUB bs2Paper serial.TX("S") serial.Str(string("\/\/\/ Stamp Paper ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" PUB bs2Scissors serial.TX("S") serial.Str(string("\/\/\/ Stamp Scissors ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" PUB Begin serial.TX("S") serial.Str(string("\/\/\/ Basic Stamp Two Versus Propeller One ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" waitcnt(clkfreq/500+cnt) serial.TX("S") serial.Str(string("\/\/\/ Rock Paper Scissors ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" waitcnt(clkfreq/500+cnt) serial.TX("S") serial.Str(string("\/\/\/ Let's begin ")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" PUB main rrr := rr.random getnum PUB getnum waitcnt(clkfreq * 1 + cnt) rrr := rr.random IF rrr < 50 rock IF rrr => 50 AND rrr < 100 paper IF rrr => 100 AND rrr < 150 scissors IF rrr => 150 AND rrr < 200 rock IF rrr => 200 AND rrr < 250 paper IF rrr => 250 AND rrr < 500 scissors PUB Rock serial.TX("S") serial.Str(string("\/\/\/ Prop Rock")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" outa [16] := 1 waitcnt(clkfreq/2+cnt) outa [16] := 0 propround := 1 score PUB Paper serial.TX("S") serial.Str(string("\/\/\/ Prop Paper")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" outa [17] := 1 waitcnt(clkfreq/2+cnt) outa [17] := 0 propround := 2 score PUB Scissors serial.TX("S") serial.Str(string("\/\/\/ Prop Scissors")) serial.TX(pst#NL) repeat until serial.RxCheck == ":" outa [18] := 1 waitcnt(clkfreq/2+cnt) outa [18] := 0 propround := 3 score
Comments
Edit: And then in round 2 it was exactly the opposite! Interesting results! I started to think the Propeller was programmed to take a dive in round 2.
Edit 2: I showed this to my wife and she commented that to impress her it would have to play Rock, Paper, Scissors, Lizard, Spock. :blank:
Rock, Paper, Scissors, Lizard, Spock. Hahaha, the resident Dr Cooper here said the same thing.
I think that a contest could be made of the topic "dueling rock/paper/scissors microcontrollers game".
Maybe you found the right contest to finally solve the Prop vs Arduino debate!