answer = ascii_uppercase[randint(0, 25)]; gameNum = gameNum + 1; Display.gameMsg('For you, this is game #'+str(gameNum)+'.'); # Begin the game while tries < maxTries: guess = Display.cooked_input('> Guess a letter, '+name+': '); if(guess in ascii_letters): if(guess.upper() == answer): Display.gameMsg("You've guessed correctly! (Total", (tries + 1), "turns)"); answer = -1; break; else: print Display.errorWrapper() + "Incorrect! Your guess was", distanceAlgorithm(ascii_uppercase, guess.upper(), answer, 4.0, 40); else: Display.errorMsg("That's not a letter,", name+". You've lost two turns for that!"); maxTries = maxTries - 2; report = maxTries - (tries + 1); Display.gameMsg("You have", (report if report > 0 else 'no'), "tries remaining."); tries = tries + 1; if(answer == -1): Display.playerMsg('Good job!'); else: Display.errorMsg("You failed", name+"."); Display.errorMsg("The correct answer was " + answer + "."); state = Display.cooked_input('> Try again? (y/n) ');
def MAR_battle(opponent, first): print ''; global conn1, heartbeat, loggedIn, userdict, userpowers, ascii_uppercase; if(not conn1 or not loggedIn or not heartbeat or not userdict or not userpowers or not ascii_uppercase): MAR_exit(3); # Letters need re-reversing for some reason. Bad python scoping system is bad and horrible. # ascii_uppercase = ascii_uppercase[::-1]; # Finish setting up our environment actionQueue = {'username':userdict['username'], 'specialdata':{}, 'userdata':{ 'guess':None, 'miniTurns':0, 'remainingTurns':27, 'maxTurns':28, 'letterNum':1, 'answer':None, 'answerStatus1':None, 'answerStatus2':None, 'skipped': False, 'victory': False }}; # Structure the user's powers into a workable menu object powerStructure = [('guess', -1), ('skip', -2)]; for power in userpowers.keys(): powerStructure.insert(0, (str(power).lower(), str(power))); powerStructure = OrderedDict(powerStructure); # Begin the game while(actionQueue['userdata']['remainingTurns'] > 0 and not actionQueue['userdata']['victory']): if(actionQueue['userdata']['letterNum'] <= 4 and not actionQueue['userdata']['victory']): # We're up! if(first): if(not actionQueue['userdata']['skipped']): # Set up our environment if(actionQueue['userdata']['answer'] == None): actionQueue['userdata']['answer'] = ascii_uppercase[randint(0, 25)]; Display.gameMsg('--> For you, this is letter '+str(actionQueue['userdata']['letterNum'])+' of 4.'); Display.gameMsg('[To use your specials, type the special\'s name and press "enter."]'); Display.gameMsg('[To guess, type "guess" followed by your letter guess.]'); Display.gameMsg('[To skip your turn, type "skip."]'); Display.gameMsg('[You have 60 seconds until your turn is automatically skipped]'); # Prompt for selection of powers or guess (60 second time limit) sleeptime = time.clock(); i = Display.menu(powerStructure, initMsg='Your move:', prefix='- ', time_limit=60, limit_phrase='skip'); # User wants to guess normally if(i == -1): if(actionQueue['userdata']['guess'] != None and actionQueue['userdata']['answerStatus2'] != ''): Display.gameMsg('-> You previous guess was:', actionQueue['userdata']['guess'], '('+actionQueue['userdata']['answerStatus2'][:-1].lower()+')'); actionQueue['userdata']['guess'] = Display.timed_input('> Guess a letter, '+actionQueue['username']+': ', 'skip', 60 - (time.clock() - sleeptime)); if(actionQueue['userdata']['guess'] == 'skip'): actionQueue['userdata']['skipped'] = True; elif(actionQueue['userdata']['guess'] in ascii_letters): if(actionQueue['userdata']['guess'].upper() == actionQueue['userdata']['answer']): actionQueue['userdata']['miniTurns'] = actionQueue['userdata']['miniTurns'] + 1; Display.gameMsg("You've guessed correctly! (Total", actionQueue['userdata']['miniTurns'], "turns)"); actionQueue['userdata']['letterNum'] = actionQueue['userdata']['letterNum'] + 1; if(actionQueue['userdata']['letterNum'] <= 4 and not actionQueue['userdata']['victory']): MessageBeep(beep); time.sleep(0.1); MessageBeep(beep); actionQueue['userdata']['answerStatus1'] = actionQueue['username']+" guessed correctly and is onto the next letter! (Letter "+str(actionQueue['userdata']['letterNum'])+" of 4)"; actionQueue['userdata']['answerStatus2'] = ''; actionQueue['userdata']['miniTurns'] = 0; actionQueue['userdata']['answer'] = None; else: actionQueue['userdata']['victory'] = True; finalEvaluation(actionQueue, opponent); break; else: dist = distanceAlgorithm(ascii_uppercase, actionQueue['userdata']['guess'].upper(), actionQueue['userdata']['answer'], 4.0, 40); actionQueue['userdata']['answerStatus1'] = actionQueue['username']+' guessed incorrectly!'; actionQueue['userdata']['answerStatus2'] = "Guess was "+dist; print Display.errorWrapper() + "Incorrect! Your guess was", dist; else: Display.errorMsg("That's not a letter,", actionQueue['username']+". You've lost two turns for that!"); actionQueue['userdata']['answerStatus1'] = actionQueue['username']+' entered an invalid response and was penalized!\n What a fool!'; actionQueue['userdata']['answerStatus2'] = 'Guess was invalid.'; actionQueue['userdata']['remainingTurns'] = actionQueue['userdata']['remainingTurns'] - 2; actionQueue['userdata']['miniTurns'] = actionQueue['userdata']['miniTurns'] + 1; # User wants to skip their turn elif(i == -2): actionQueue['userdata']['skipped'] = True; actionQueue['userdata']['guess'] = actionQueue['userdata']['answerStatus1'] = None; actionQueue['userdata']['answerStatus2'] = ''; actionQueue['userdata']['miniTurns'] = actionQueue['userdata']['miniTurns'] + 1; # A power was chosen, attempt to add it to the specialdata array else: Display.errorMsg('Specials don\'t work yet. Sorry!'); actionQueue['userdata']['skipped'] = True; actionQueue['userdata']['guess'] = actionQueue['userdata']['answerStatus1'] = None; actionQueue['userdata']['answerStatus2'] = ''; actionQueue['userdata']['miniTurns'] = actionQueue['userdata']['miniTurns'] + 1; # actionQueue['specialdata'] = activatePower(userpowers[i], actionQueue['specialdata']); # Evaluate specialdata array & victory conditions actionQueue = evaluateQueue(actionQueue); Display.gameMsg('Turn ended!'); Display.gameMsg("You have", (actionQueue['userdata']['remainingTurns'] if actionQueue['userdata']['remainingTurns'] > 0 else 'no'), "turns remaining."); Display.gameMsg("Synchronizing with server..."); conn1.params = {"u":u, "p":p, "python":1, "type":"upd", "SID":SID, 'data':actionQueue}; response = conn1.request(); # print 'resp:', response if(response == '$UpdateFailed'): Display.errorMsg('Internal Error: server failed to update properly! Report this!'); if(response == '$LookupError'): Display.errorMsg('Internal Error: server-user lookup error! Report this!'); else: actionQueue, doBreak = checkForCommands(response, actionQueue, opponent); if(doBreak): break; actionQueue['userdata']['remainingTurns'] = actionQueue['userdata']['remainingTurns'] - 1; actionQueue['userdata']['miniTurns'] = actionQueue['userdata']['miniTurns'] + 1; actionQueue['userdata']['skipped'] = False; # They're up! (wait for 60[+10] seconds) else: Display.gameMsg('Waiting on', opponent+' (~60 seconds until timeout)...'); response = block_on_challenge('$NoData', {"u":u, "p":p, "python":1, "type":"bat4", "SID":SID, 'opponent':opponent}, at_end=0, stall_time=70); if(is_JSON(response)): if(response['userdata']['victory'] or response['userdata']['letterNum'] > 4): print 'incorrect loss action:', response actionQueue['userdata']['victory'] = False; finalEvaluation(actionQueue, opponent); break; else: if(response['userdata']['answerStatus1']): if(response['userdata']['answerStatus1'].find('guessed correctly and is onto')+1): MessageBeep(MB_OK); time.sleep(0.1); MessageBeep(MB_OK); Display.gameMsg('->', response['userdata']['answerStatus1']); else: Display.gameMsg('->', opponent, 'skipped his turn?! Foolish!'); evaluateQueue(response, False); Display.sysMsg('Opponent\'s turn ended. Your move!'); elif(response == False): # Send the "is alive ne?" packet Display.gameMsg('No response from opponent, clearing victory conditions...'); conn1.params = {"u":u, "p":p, "python":1, "type":"upd", "SID":SID, 'data':'$Alive:'+opponent}; conn1.request(); response = block_on_challenge('$NoData', {"u":u, "p":p, "python":1, "type":"bat4", "SID":SID, 'opponent':opponent, "ignore":'$Alive:'+opponent}, at_end=0, stall_time=10, eval_response=False); if(response == '$Yes'): Display.gameMsg('Opponent\'s turn was skipped.'); conn1.params = {"u":u, "p":p, "python":1, "type":"upd", "SID":SID, 'data':'$Skip:'+actionQueue['username']}; conn1.request(); time.sleep(3); elif(response == False or response[0] == '{'): Display.gameMsg('Opponent has disconnected from the server. You win by default.'); actionQueue['userdata']['victory'] = True; finalEvaluation(actionQueue, opponent); break; else: actionQueue, doBreak = checkForCommands(response, actionQueue, opponent); if(doBreak): break; else: actionQueue, doBreak = checkForCommands(response, actionQueue, opponent); if(doBreak): break; #Change up the order first = not first; else: actionQueue['userdata']['victory'] = True; finalEvaluation(actionQueue, opponent); break; else: if(not actionQueue['userdata']['victory']): finalEvaluation(actionQueue, opponent); Display.sysMsg('Cleaning up room...'); conn1.params = {"u":u, "p":p, "python":1, "type":"kil", "SID":SID}; conn1.request(); Display.sysMsg('Room cleaned successfully.'); Display.gameMsg('Returning to main menu...'); heartbeat.pauseFlag = False; conn1.makeNulls = False;
while state == "y": tries = 0 maxTries = 7 answer = ascii_uppercase[randint(0, 25)] gameNum = gameNum + 1 Display.gameMsg("For you, this is game #" + str(gameNum) + ".") while tries < maxTries: guess = Display.cooked_input("Guess a letter, " + name + ": ") if guess in ascii_letters: if guess.upper() == answer: Display.gameMsg("You've guessed correctly! (Total", (tries + 1), "turns)") answer = -1 break else: print Display.errorWrapper() + "Incorrect! Your guess was", # Small distance algorithm (by Xunnamius of Dark Gray) # If the syntax is weird, it's because it has been engineered it to be extensible and reusable. # TODO: May make this into an object later. # Target array, element1, element2 target = (ascii_uppercase, guess.upper(), answer) # These percents modify the mangitude of the distance detection. # The first percent denotes slight distance while the second one denotes the distinction # between moderate and far distance. # The higher the percents, the biggerer their respective margins-of-error will be. modifiers = (4.0, 40) length = len(target[0])