This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

Help to modify game stone-paper-scissors

Requests for complete scripts or modifications/fixes for scripts you didn't write. Response not guaranteed, and no thread bumping!
Post Reply
j
juanamores
Master
Posts: 317
Joined: Sun Mar 15, 2015 9:59 am

Help to modify game stone-paper-scissors

Post by juanamores »

I found this game of stone-paper-scissors and want to improve it ...
How I can do to saved the scores for each user who plays on each channel and, at the same time if one of the users win 5 times end the game?

Code: Select all

####################################################
# Author : TALES 24-08-2003                        #
# File name: ssp.tcl                               #
# version script : v1                              #
# Script info : This is a little game for channel  #
#               hope you like the game.            #
#               cmd like: !choose scissor          #
#                         !choose stone            #
#                         !choose paper            #
####################################################
#         if you got any questions you             #
#         can find me @ irc.chatcity.nl            #
#         http://www.cb3rob.net/~tales/            #
####################################################
#     this script is made for eggdrop 1.6.13       #
#      but should work on al 1.6.* versions        #
#    use of this script is for your own risk!      #
####################################################
# Credits : Fr33man_, Ace^                         #
####################################################

bind pub - !choose msg_ssp

set ssp_list {
 "scissor"
 "stone"
 "paper"
}

proc msg_ssp {nick uhost hand chan rest} {
  global botnick ssp_list
  set ssp [lindex $ssp_list [rand [llength $ssp_list]]]
  set cmd [string tolower [lindex $rest 0]]
  if { ($cmd == $ssp) } {
     putserv "PRIVMSG $chan :You have \0037$cmd\003 and i have \0037$ssp\003 game \00312-draw-\003" 
     return 0
     }
  if {$cmd == "stone"} {
    if {$ssp == "paper"} {
       putserv "PRIVMSG $chan :You have \0037Stone\003 and i have \0037Paper\003 you \0034-lose-\003" 
       return 0
       }
    if {$ssp == "scissor"} {
       putserv "PRIVMSG $chan :You have \0037Stone\003 and i have \0037Scissor\003 you \0033-won-\003" 
       return 0
       }
      }
  if {$cmd == "paper"} {
    if {$ssp == "stone"} { 
       putserv "PRIVMSG $chan :You have \0037Paper\003 and i have \0037Stone\003 you \0033-won-\003" 
       return 0
       }
    if {$ssp == "scissor"} { 
       putserv "PRIVMSG $chan :You have \0037Paper\003 and i have \0037Scissor\003 you \0034-lose-\003" 
       return 0
       }
      }
  if {$cmd == "scissor"} {
    if {$ssp == "stone"} { 
       putserv "PRIVMSG $chan :You have \0037Scissor\003 and i have \0037Stone\003 you \0034-lose-\003" 
       return 0
       }
    if {$ssp == "paper"} { 
       putserv "PRIVMSG $chan :You have \0037Scissor\003 and i have \0037Paper\003 you have \0033-won-\003" 
       return 0
       }
      }
}

putlog "ssp.tcl v1 made by TALES loaded succesfully."
If you do not understand my ideas is because I can not think in English, I help me with Google Translate. I only speak Spanish. Bear with me. Thanks :)
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

Code: Select all

namespace eval ssp {

	variable maxScore 5
	variable ssp [list "scissor" "stone" "paper"]

	bind pub - !choose [namespace current]::choose 
	bind pub o|o !reset [namespace current]::reset

	proc choose {nick uhost hand chan text} {
		variable ssp
		variable diceScore
		set random [lindex $ssp [rand [llength $ssp]]]
		if {[scan $text {%s} pick] != 1} {
			putserv "PRIVMSG $chan :To play the game choose one from \"[join $random]\" and make your choose like: !choose $random"
			return
		}
		set pick [string tolower $pick]
		set won 0
		if {[string equal $random $pick]} {
			putserv "PRIVMSG $chan :You have \0037$pick\003 and i have \0037$random\003 game \00312-draw-\003"
		} else {
			switch -- $pick {
				"stone" {
					if {[string equal $random "paper"]} {
						putserv "PRIVMSG $chan :You have \0037Stone\003 and i have \0037Paper\003 you \0034-lose-\003"
					} elseif {$random eq "scissor"} {
						putserv "PRIVMSG $chan :You have \0037Stone\003 and i have \0037Scissor\003 you \0033-won-\003"
						incr won
					}
				}
				"paper" {
					if {[string equal $random "scissor"]} {
						putserv "PRIVMSG $chan :You have \0037Paper\003 and i have \0037Scissor\003 you \0034-lose-\003"
					} elseif {$random eq "stone"} {
						putserv "PRIVMSG $chan :You have \0037Paper\003 and i have \0037Stone\003 you \0033-won-\003"
						incr won
					}
				}
				"scissor" {
					if {[string equal $random "stone"]} {
						putserv "PRIVMSG $chan :You have \0037Scissor\003 and i have \0037Stone\003 you \0034-lose-\003"
					} elseif {$random eq "paper"} {
						putserv "PRIVMSG $chan :You have \0037Scissor\003 and i have \0037Paper\003 you have \0033-won-\003"
						incr won
					}
				}
				default {
					putserv "PRIVMSG $chan :Sorry, your pick is not valid. You must choose one from: [join $ssp]"
				}
			}
		}
		if {$won} {
			set pos [getPos $chan $nick]
			set score [expr $pos != -1 ? [getScore $chan $nick] : 0]
			set newScore [incr score]
			if {$pos != -1} {
				set diceScore($chan) [lreplace $diceScore($chan) $pos $pos [list $nick $newScore]]
			} else {
				lappend diceScore($chan) [list $nick 1]
			}
		}
		if {[checkScore $chan]} {
			array unset diceScore $chan
			putserv "PRIVMSG $chan :Congrats to $nick! He won this round!"
		}
		
	}
	
	proc reset {nick uhost hand chan text} {
		variable diceScore
		array unset diceScore $chan
	}
	
	proc checkScore {chan} {
		variable diceScore
		variable maxScore
		set x 0
		if {[info exists diceScore($chan)]} {
			foreach {player score} [join $diceScore($chan)] {
				if {$score < $maxScore} continue
				incr x
				break
			}
		}
		return $x
	}
	
	proc getPos {chan nick} {
		set pos -1
		set match 0
		variable diceScore
		if {[info exists diceScore($chan)]} {
			foreach {player score} [join $diceScore($chan)] {
				incr pos
				if {![string equal -nocase $player $nick]} continue
				incr match
				break
			}
		}
		return [expr $match ? "$pos" : "-1"]
	}
	
	proc getScore {chan nick} {
		set x 0
		variable diceScore
		if {[info exists diceScore($chan)]} {
			foreach {player score} [join $diceScore($chan)] {
				if {![string equal -nocase $player $nick]} continue
				incr x $score
				break
			}
		}
		return $x
	}
}
<cez> !choose bla
<@bot> Sorry, your pick is not valid. You must choose one from: scissor stone paper
<cez> !choose stone
<@bot> You have Stone and i have Scissor you -won-
<cez> !choose stone
<@bot> You have stone and i have stone game -draw-
<cez> !choose stone
<@bot> You have Stone and i have Scissor you -won-
<cez> !choose stone
<@bot> You have Stone and i have Scissor you -won-
<cez> !choose stone
<@bot> You have Stone and i have Paper you -lose-
<cez> !choose stone
<@bot> You have Stone and i have Scissor you -won-
<cez> !choose stone
<@bot> You have Stone and i have Paper you -lose-
<cez> !choose stone
<@bot> You have Stone and i have Scissor you -won-
<@bot> Congrats to cez! He won this round!
This should be extended to monitor nick change, kick, part and quit and also do some resets every 30 minutes, 1 hour or whatever. I added a !reset in case something goes wrong, but you can remove it.
Once the game is over, the king and the pawn go back in the same box.
j
juanamores
Master
Posts: 317
Joined: Sun Mar 15, 2015 9:59 am

Post by juanamores »

Work perfectly!!! :)
Thank you caesar !

Then I 'll see if I can add something in order to that a nick can not play until his turn comes .
Sometimes , they play more than once out of turn.
Example:
If nicks A, B , C , D and E playing..
After playing A, you should expect to play B and then C ... and so on...
If you do not understand my ideas is because I can not think in English, I help me with Google Translate. I only speak Spanish. Bear with me. Thanks :)
Post Reply