Created
December 25, 2011 00:12
-
-
Save TannerRogalsky/1518545 to your computer and use it in GitHub Desktop.
Old Hunt the Wumpuse IRC bot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.jibble.pircbot.*; | |
import java.util.Random; | |
import java.util.ArrayList; | |
public class MyBot extends PircBot { | |
public String channel; // The name of the primary channel. | |
public ArrayList map; // The map data. 0 = empty, 1 = wumpus, 2 = shaft, 3 = bats, 4 = player. | |
public String player; // The player's nickname. | |
public boolean gameInProgress; // Whether or not there is a game in progress. | |
public boolean moving, shooting; // Whether the player is moving or shooting, respectively. | |
public int arrows; // How many arrows the player has left. | |
public MyBot(String myChannel) { | |
this.setName("WumpusBot"); | |
this.setLogin("WeTheWumpi"); | |
channel = myChannel; | |
gameInProgress = false; | |
moving = false; | |
shooting = false; | |
} | |
public void onConnect() { | |
sendMessage(channel, "Greetings, " + channel + "."); | |
} | |
public void onMessage(String channel, String sender, | |
String login, String hostname, String message) { | |
message = message.toLowerCase().trim(); | |
if ((message.equalsIgnoreCase("!quit")) && (hostname.equals ("private-A895A092.home.cgocable.net"))) | |
disconnect(); | |
else if ((message.equalsIgnoreCase("!wumpus")) && (!gameInProgress) || (message.equalsIgnoreCase("!start")) && (!gameInProgress)){ | |
sendMessage (channel, "Oh noes!"); | |
player = sender; | |
arrows = 5; | |
gameInProgress = true; | |
generateMap (20); | |
sendMessage (channel, "You'll still have to find me, " + sender + "! The game starts NOW!"); | |
actionText (getPlayerRoom()); | |
} else if ((message.charAt(0) == 'm') && (sender.equals (player))){ | |
int moveTo = getDigits(message); | |
int moveFrom = getPlayerRoom(); | |
if (isValidTunnel(getTunnels(moveFrom), moveTo)){ | |
if (map.get(moveTo).equals(1)){ | |
sendMessage (channel, "Muahaha! The Wumpus got ya!"); | |
endGame("The game is over. You lose."); | |
}else if (map.get(moveTo).equals(2)){ | |
sendMessage (channel, "You fell down a shaft. ;_;"); | |
endGame("The game is over. You lose."); | |
}else if (map.get(moveTo).equals(3)){ | |
sendMessage (channel, "Zap! Elsewhereville for you!"); | |
map.set (moveFrom, 0); | |
addObject (4); | |
actionText (getPlayerRoom()); | |
} else { | |
map.set (moveTo, 4); | |
map.set (moveFrom, 0); | |
moving = false; | |
actionText (moveTo); | |
} | |
}else { | |
sendMessage (channel, "That is not a valid room."); | |
} | |
} else if((message.charAt(0) == 's') && (sender.equals (player))){ | |
int shootTo = getDigits(message); | |
if (isValidTunnel(getTunnels(getPlayerRoom()), shootTo)){ | |
if (shootTo == getWumpusRoom ()){ | |
sendMessage (channel, "Noooo! You got me!"); | |
endGame("The game is over. You win."); | |
} else { | |
shooting = false; | |
map.set(getWumpusRoom(), 0); | |
addObject(1); | |
sendMessage (channel, "You missed the Wumpus."); | |
arrows--; | |
sendMessage (channel, "You have " + arrows + " arrows left."); | |
if (arrows == 0) endGame("The game is over. You lose."); | |
else actionText (getPlayerRoom()); | |
} | |
}else{ | |
sendMessage (channel, "That is not a valid room."); | |
} | |
} else if ((message.equalsIgnoreCase ("!end")) && (sender.equals (player)) | |
|| (message.equalsIgnoreCase ("!end")) && (hostname.equals ("private-A895A092.home.cgocable.net")) && (gameInProgress)) { | |
sendMessage (channel, "Well I can't hunt myself, now, can I?"); | |
gameInProgress = false; | |
player = ""; | |
sendMessage (channel, "The game is over!"); | |
} | |
} | |
public void onDisconnect() { | |
System.exit (0); | |
} | |
public void onKick(String channel, String kickerNick, String kickerLogin, | |
String kickerHostname, String recipientNick, String reason) { | |
if (recipientNick.equals (getNick())){ | |
joinChannel (channel); | |
sendMessage (channel, "Bite me, " + kickerNick + "."); | |
} | |
} | |
// Generates a random map. | |
public void generateMap (int mapSize) { | |
map = new ArrayList (mapSize); | |
for (int i = 0 ; i < mapSize ; i++) | |
map.add (0); | |
addObject (1); | |
addObject (4); | |
addObject (2); | |
addObject (2); | |
addObject (3); | |
addObject (3); | |
} | |
// Adds objects to the map. | |
public void addObject (int objectType){ | |
Random r = new Random (); | |
int space = r.nextInt (20); | |
while (!map.get(space).equals (0)) | |
space = r.nextInt (20); | |
map.set (space, objectType); | |
} | |
// Returns the room that the player is in. | |
public int getPlayerRoom () { | |
for (int i = 0; i < map.size(); i++){ | |
if (map.get(i).equals(4)) | |
return i; | |
} | |
return -1; | |
} | |
// Returns the room that the Wumpus is in. | |
public int getWumpusRoom () { | |
for (int i = 0; i < map.size(); i++){ | |
if (map.get(i).equals(1)) | |
return i; | |
} | |
return -1; | |
} | |
// Returns a list of tunnels from a given room. | |
public ArrayList getTunnels (int room){ | |
ArrayList tunnels = new ArrayList(); | |
if (room - 5 >= 0) | |
tunnels.add (room - 5); | |
if ((room != 4) && (room != 9) && (room != 14) && (room != 19)) | |
tunnels.add (room + 1); | |
if ((room != 0) && (room != 5) && (room != 10) && (room != 15)) | |
tunnels.add (room - 1); | |
if (room + 5 < 20) | |
tunnels.add (room + 5); | |
return tunnels; | |
} | |
// Returns whether or not there is a hazard in an adjoining room. | |
public boolean isObjectClose (int object){ | |
int playerRoom = getPlayerRoom(); | |
boolean[] trues = new boolean[4]; | |
if (playerRoom - 5 >= 0) | |
trues[0] = map.get(playerRoom - 5).equals(object); | |
if ((playerRoom != 4) && (playerRoom != 9) && (playerRoom != 14) && (playerRoom != 19)) | |
trues[1] = map.get(playerRoom + 1).equals(object); | |
if ((playerRoom != 0) && (playerRoom != 5) && (playerRoom != 10) && (playerRoom != 15)) | |
trues[2] = map.get(playerRoom - 1).equals(object); | |
if (playerRoom + 5 < 20) | |
trues[3] = map.get(playerRoom + 5).equals(object); | |
return ((trues[0]) || (trues[1]) || (trues[2]) || (trues[3])); | |
} | |
// Displays the majority of the game text. | |
public void actionText (int playerRoom){ | |
sendMessage (channel, "********************"); | |
if (isObjectClose(2)){sendMessage (channel, "You feel a draught.");} | |
if (isObjectClose(3)){sendMessage (channel, "Bats nearby.");} | |
if (isObjectClose(1)){sendMessage (channel, "You can smell the Wumpus!");} | |
sendMessage (channel, "You are in room " + playerRoom + "."); | |
sendMessage (channel, "Tunnels lead to rooms " + getTunnels(playerRoom).toString()); | |
sendMessage (channel, "Move or shoot? (M or S)"); | |
} | |
// Returns whether the chosen tunnel is valid or not. | |
public boolean isValidTunnel (ArrayList tunnels, int moveTo){ | |
int x = 0; | |
for (int i = 0; i < tunnels.size(); i++){ | |
if ((int)Integer.parseInt(tunnels.get(i).toString()) == moveTo){ | |
x++; | |
} | |
} | |
return x == 1; | |
} | |
// Parses the digits from a message. | |
public int getDigits (String text){ | |
char[] chars; | |
chars = text.toCharArray(); | |
text = ""; | |
for (int i = 0; i < chars.length; i++){ | |
if (Character.isDigit(chars[i])){ | |
text += chars[i]; | |
} | |
} | |
return (int)Integer.parseInt(text); | |
} | |
// Resets the game vars and displays a message. | |
public void endGame (String text){ | |
gameInProgress = false; | |
moving = false; | |
shooting = false; | |
player = ""; | |
sendMessage (channel, text); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment