PK$Z37META-INF/MANIFEST.MFMLK-. K-*ϳR03MuI,.RHM)/.OMHaS#T\^.^.PKOqMNPK 27edu/PK 27 edu/oswego/PK 27edu/oswego/hci/PK 27edu/oswego/hci/hci520/PK 27 edu/oswego/hci/hci520/tictactoe/PK %27V@4edu/oswego/hci/hci520/tictactoe/Program$Player.class1_.edu/oswego/hci/hci520/tictactoe/Program$Playerjava/lang/Object symbolURLLjava/net/URL;nameLjava/lang/String;rLjava/util/Random;historyLjava/util/Stack; Signature&Ljava/util/Stack;this$0)Ledu/oswego/hci/hci520/tictactoe/Program;>(Ledu/oswego/hci/hci520/tictactoe/Program;Ljava/lang/String;)VCode    ()V  UFP   getClass()Ljava/lang/Class;"res/ufp_blk.gif $&%java/lang/Class '( getResource"(Ljava/lang/String;)Ljava/net/URL; * ,Klingon.res/klingon_blk.png0java/util/Random / 3 5java/util/Stack 4 8 LineNumberTableLocalVariableTablethis0Ledu/oswego/hci/hci520/tictactoe/Program$Player;move()I /@ ABnextInt(I)I DFE'edu/oswego/hci/hci520/tictactoe/Program GHfield1[Ledu/oswego/hci/hci520/tictactoe/Program$Player; J => LNMjava/lang/Integer OPvalueOf(I)Ljava/lang/Integer; 4R STpush&(Ljava/lang/Object;)Ljava/lang/Object; fieldPositionIgetName()Ljava/lang/String; getSymbolURL()Ljava/net/URL; SourceFile Program.java InnerClassesPlayer!   K*+**,,**!#),+**-#)*/Y12*4Y679,% &'!(4*?+:K;<K=>~6*2 ?<*C2 *I<*C*S*7KQW95 8:>(?4B:6;< ,UVWX/*9I: ;<YZ/*)9O: ;<[\] D^PK %270. -edu/oswego/hci/hci520/tictactoe/Program.class1|'edu/oswego/hci/hci520/tictactoe/Programjava/lang/Objectufp0Ledu/oswego/hci/hci520/tictactoe/Program$Player;klingon lastPlayerfield1[Ledu/oswego/hci/hci520/tictactoe/Program$Player;statusLjava/lang/String;gameOverZ$assertionsDisabled()VCode java/lang/Class desiredAssertionStatus()Z  LineNumberTableLocalVariableTable  !.edu/oswego/hci/hci520/tictactoe/Program$Player # %java/lang/AssertionError $ ( *java/lang/String,#Execute "Play" to start a new game. ). /(Ljava/lang/String;)V 1 3UFP 5 6>(Ledu/oswego/hci/hci520/tictactoe/Program;Ljava/lang/String;)V 8 :Klingon < this)Ledu/oswego/hci/hci520/tictactoe/Program;iI checkWinner2()Ledu/oswego/hci/hci520/tictactoe/Program$Player; D EFequals(Ljava/lang/Object;)ZHjava/lang/StringBuilderJThe winner is: G. M NOgetName()Ljava/lang/String; GQ RSappend-(Ljava/lang/String;)Ljava/lang/StringBuilder; GU VOtoString playIteration3(I)Ledu/oswego/hci/hci520/tictactoe/Program$Player;Z"java/lang/IllegalArgumentException\0Game iteration step cannot be smaller than zero. Y._The Game is tied. a bcmove()IeUFP took position Gg Rh(I)Ljava/lang/StringBuilder; j lKlingon took position n ABstep takenPositionmain([Ljava/lang/String;)Vt#edu/oswego/hci/hci520/tictactoe/GUI sargs[Ljava/lang/String; SourceFile Program.java InnerClassesPlayer!   1d** "<*"2 $Y&*"*'*)Y+-0* Y*247* Y*94;"ac d5e:fGiUjckd=>&?@ABR*"2*"2*"2*"2*"2*"2*"2*"2*"2C*"2*"2CM*"2*"2C*"2*"2C(*"2*"2C>*"2*"2C+*GYIK*"2LPT0*'*"2*"2a*"2X*"2N*"2*"2C*"2*"2C~+*GYIK*"2LPT0*'*"2*"2*"2*"2*"2*"2u*"2*"2C*"2*"2C(*"2*"2C>*"2*"2C+*GYIK*"2LPT0*'*"2*"2a*"2X*"2O*"2*"2C=*"2*"2C+*GYIK*"2LPT0*'*"2*"2i*"2_*"2U*"2*"2CA*"2*"2C-*GYIK*"2LPT0*'*"2vtAuevwyz{}~27>m:?Fd =>WX *" YY[]*" *^0p4*7`=*GYdKfT0*"*7S**7i1*;`=*GYkKfT0*"*;S**;i*m: &(.6JT_g{*=>o@6)p@g+p@ qr5su  vwxyz  {PK %27:-^,edu/oswego/hci/hci520/tictactoe/Program.java/* * Program.java * Author: B. Tenbergen [ http://www.tenbergen.org | nanoprobe19@gmx.net ] * Date: 2007-09-11 */ package edu.oswego.hci.hci520.tictactoe; import java.util.Random; import java.util.Stack; import java.net.URL; /** * This class contains the program logic of a very simple TicTacToe game. * @author B. Tenbergen [ http://www.tenbergen.org | nanoprobe19@gmx.net ] * @version 2007-09-11 * @since 2007-09-11 */ public class Program { /** * Some inner class representing a player. Players make their own moves * and have a name as well as a symbol. * @author B. Tenbergen [ http://www.tenbergen.org | nanoprobe19@gmx.net ] * @version 2007-09-11 * @since 2007-09-11 */ protected class Player { private URL symbolURL; private String name; private Random r; protected Stack history; /** * Creates a new Player with a given name. * @param name The name of the player. */ public Player(String name) { this.name = name; if (name == "UFP") symbolURL = getClass().getResource("res/ufp_blk.gif"); if (name == "Klingon") symbolURL = getClass().getResource("res/klingon_blk.png"); r = new Random(); history = new Stack(); } /** * Let's the player make a move in a free field. * This step is repeated recursively if a randomly * chosen field is already taken. * @return The field in which the was chosen by the player. */ public int move() { int fieldPosition = r.nextInt(9); //if the randomly chosen field position is already taken... if (field[fieldPosition] != null) { //play again fieldPosition = move(); } //else, put your symbol in the field position else { field[fieldPosition] = this; history.push(fieldPosition); } return fieldPosition; } /** * Just gets the name of this player. * @return The name of this player. */ public String getName() { return this.name; } /** * Gets the URL to the symbol of this player. * @return The URL of the symbol of this player. */ public URL getSymbolURL() { return this.symbolURL; } } //we need two players and a reference to the player that has last moved private Player ufp; private Player klingon; protected Player lastPlayer; //we need a play field... protected Player[] field; //...some game status indicator... protected String status; //...and a flag that tells us when the game is over. protected boolean gameOver; /** * Sets up a new game by initializing the field, the players * and the game state variables. */ public Program() { //initialize the play field and game status this.field = new Player[9]; for (int i = 0; i < field.length; i++) assert field[i] != null; this.gameOver = false; this.status = new String("Execute \"Play\" to start a new game."); //initialize two players this.ufp = new Player("UFP"); this.klingon = new Player("Klingon"); } /** * This helper method checks if a winner has been found. * If a winner is found, the game state is changed occordingly * and the winner is returned. * @return The winner of the game or null if the game is tied or not over yet. */ private Player checkWinner() { if (field[0] == null || field[1] == null || field[2] == null || field[3] == null || field[4] == null || field[6] == null || field[8] == null) {} else if (field[0].equals(field[1]) && field[0].equals(field[2]) || field[0].equals(field[3]) && field[0].equals(field[6]) || field[0].equals(field[4]) && field[0].equals(field[8]) ) { status = "The winner is: " + field[0].getName(); gameOver = true; return field[0]; } if (field[1] == null || field[4] == null || field[7] == null) {} else if (field[1].equals(field[4]) & field[1].equals(field[7])) { status = "The winner is: " + field[1].getName(); gameOver = true; return field[1]; } if (field[2] == null || field[4] == null || field[6] == null || field[5] == null || field[8] == null) {} else if (field[2].equals(field[4]) && field[2].equals(field[6]) || field[2].equals(field[5]) && field[2].equals(field[8]) ) { status = "The winner is: " + field[2].getName(); gameOver = true; return field[2]; } if (field[3] == null || field[4] == null || field[5] == null) {} else if (field[3].equals(field[4]) && field[3].equals(field[5])) { status = "The winner is: " + field[3].getName(); gameOver = true; return field[3]; } if (field[6] == null || field[7] == null || field[8] == null) {} else if (field[6].equals(field[7]) && field[6].equals(field[8])) { status = "The winner is: " + field[6].getName(); gameOver = true; return field[6]; } return null; } /** * Plays one iteration of the game. A game iteration is one * of the 9 possible moves during the game. * @param step 0 <= step <= field.length must hold true. * @return The winner of the game or null if tied or not over yet. * @throws IllegalArgumentException if 0 <= step <= field.length does not hold. */ public Player playIteration(int step) { if (step < 0 || field.length < step) throw new IllegalArgumentException("Game iteration step cannot be smaller than zero."); if (step == field.length) { this.status = "The Game is tied."; return null; } int takenPosition; //ufp moves every even iteration... if (step % 2 == 0) { takenPosition = ufp.move(); this.status = "UFP took position " + takenPosition; field[takenPosition] = ufp; lastPlayer = ufp; } //...klingon moves ever odd. else { takenPosition = klingon.move(); this.status = "Klingon took position " + takenPosition; field[takenPosition] = klingon; lastPlayer = klingon; } return checkWinner(); } /** * Creates a GUI that will run the game. * @param args */ public static void main(String[] args) { new GUI(); } }PK Y37E+edu/oswego/hci/hci520/tictactoe/GUI$1.class15%edu/oswego/hci/hci520/tictactoe/GUI$1java/lang/Objectjava/awt/event/ActionListenerthis$0%Ledu/oswego/hci/hci520/tictactoe/GUI;((Ledu/oswego/hci/hci520/tictactoe/GUI;)VCode    ()VLineNumberTableLocalVariableTablethis'Ledu/oswego/hci/hci520/tictactoe/GUI$1;actionPerformed(Ljava/awt/event/ActionEvent;)V #edu/oswego/hci/hci520/tictactoe/GUI access$4<(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/JButton;  javax/swing/JButton !" setEnabled(Z)V $ %access$5 ' ()access$3:(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/Timer; +-,javax/swing/Timer .starteLjava/awt/event/ActionEvent; SourceFileGUI.java InnerClassesEnclosingMethod0  8 *+ * O   a!* * #* &*Q RS T!!/0123 4PK Y37 H--+edu/oswego/hci/hci520/tictactoe/GUI$2.class1a%edu/oswego/hci/hci520/tictactoe/GUI$2java/lang/Objectjava/awt/event/ActionListenerthis$0%Ledu/oswego/hci/hci520/tictactoe/GUI;((Ledu/oswego/hci/hci520/tictactoe/GUI;)VCode    ()VLineNumberTableLocalVariableTablethis'Ledu/oswego/hci/hci520/tictactoe/GUI$2;actionPerformed(Ljava/awt/event/ActionEvent;)V'edu/oswego/hci/hci520/tictactoe/Program  #edu/oswego/hci/hci520/tictactoe/GUI access$6Q(Ledu/oswego/hci/hci520/tictactoe/GUI;Ledu/oswego/hci/hci520/tictactoe/Program;)V ! "# iterationI % &'winner0Ledu/oswego/hci/hci520/tictactoe/Program$Player; ) *+access$1<(Ledu/oswego/hci/hci520/tictactoe/GUI;)[Ljavax/swing/JLabel;-javax/swing/ImageIcon / 01getClass()Ljava/lang/Class;3 res/empty.jpg 576java/lang/Class 89 getResource"(Ljava/lang/String;)Ljava/net/URL; ,; <(Ljava/net/URL;)V >@?javax/swing/JLabel ABsetIcon(Ljavax/swing/Icon;)VDjavax/swing/TimerF1edu/oswego/hci/hci520/tictactoe/GUI$IterationPlay EH CJ K#(ILjava/awt/event/ActionListener;)V M NOaccess$7;(Ledu/oswego/hci/hci520/tictactoe/GUI;Ljavax/swing/Timer;)V Q RSaccess$5<(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/JButton; UWVjavax/swing/JButton XY setEnabled(Z)VeLjava/awt/event/ActionEvent;i SourceFileGUI.java InnerClassesEnclosingMethod0  8 *+ * W   v* Y*  * $="* (2,Y*.24:=* (* CYEY* GIL* PT& YZ[]#^?]N`jaub vvZ[ .\#]^_ `PK Y378]7edu/oswego/hci/hci520/tictactoe/GUI$IterationPlay.class1|1edu/oswego/hci/hci520/tictactoe/GUI$IterationPlayjava/lang/Objectjava/awt/event/ActionListenerthis$0%Ledu/oswego/hci/hci520/tictactoe/GUI;((Ledu/oswego/hci/hci520/tictactoe/GUI;)VCode    ()VLineNumberTableLocalVariableTablethis3Ledu/oswego/hci/hci520/tictactoe/GUI$IterationPlay;actionPerformed(Ljava/awt/event/ActionEvent;)V #edu/oswego/hci/hci520/tictactoe/GUI  iterationI   access$0P(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ledu/oswego/hci/hci520/tictactoe/Program; "$#'edu/oswego/hci/hci520/tictactoe/Program %&field1[Ledu/oswego/hci/hci520/tictactoe/Program$Player; ( )*winner0Ledu/oswego/hci/hci520/tictactoe/Program$Player; ", -. playIteration3(I)Ledu/oswego/hci/hci520/tictactoe/Program$Player; 0 12access$1<(Ledu/oswego/hci/hci520/tictactoe/GUI;)[Ljavax/swing/JLabel; "4 5* lastPlayer 798.edu/oswego/hci/hci520/tictactoe/Program$Player :;historyLjava/util/Stack; =?>java/util/Stack @Apeek()Ljava/lang/Object;Cjava/lang/Integer BE FGintValue()IIjavax/swing/ImageIcon 7K LM getSymbolURL()Ljava/net/URL; HO P(Ljava/net/URL;)V RTSjavax/swing/JLabel UVsetIcon(Ljavax/swing/Icon;)V X YZaccess$2;(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/JLabel; "\ ]^statusLjava/lang/String; R` absetText(Ljava/lang/String;)V d efaccess$3:(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/Timer; hjijavax/swing/Timer kstop m noaccess$4<(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/JButton; qsrjavax/swing/JButton tu setEnabled(Z)VeLjava/awt/event/ActionEvent; SourceFileGUI.java InnerClasses IterationPlay!  4 *+ *   * * !* '* * * +'* * !8* /* 36<BD2HY* 3JNQ* W* [_* Y`* cg* lp& 7Lvwxyz {PK Y37gg)edu/oswego/hci/hci520/tictactoe/GUI.class1#edu/oswego/hci/hci520/tictactoe/GUIjavax/swing/JFrame controlPanelLjavax/swing/JPanel; playFieldicons[Ljavax/swing/JLabel;startLjavax/swing/JButton;resetstatusLjavax/swing/JLabel;p)Ledu/oswego/hci/hci520/tictactoe/Program;timerLjavax/swing/Timer; iterationIwinner0Ledu/oswego/hci/hci520/tictactoe/Program$Player;()VCode      !'edu/oswego/hci/hci520/tictactoe/Program  $ &javax/swing/Timer(1edu/oswego/hci/hci520/tictactoe/GUI$IterationPlay '* +((Ledu/oswego/hci/hci520/tictactoe/GUI;)V %- .#(ILjava/awt/event/ActionListener;)V 0 2javax/swing/JPanel4java/awt/GridLayout 36 7(II)V 19 :(Ljava/awt/LayoutManager;)V <  > ?@field1[Ledu/oswego/hci/hci520/tictactoe/Program$Player;Bjavax/swing/JLabel D  Fjavax/swing/ImageIcon HJIjava/lang/Object KLgetClass()Ljava/lang/Class;N res/empty.jpg PRQjava/lang/Class ST getResource"(Ljava/lang/String;)Ljava/net/URL; EV W(Ljava/net/URL;)V AY Z(Ljavax/swing/Icon;)V 1\ ]^add*(Ljava/awt/Component;)Ljava/awt/Component; `bajava/awt/Color cdBLACKLjava/awt/Color; 1f gh setBackground(Ljava/awt/Color;)Vjjava/awt/FlowLayout il m(III)V o qUse Play! to start. As t(Ljava/lang/String;)V v xjavax/swing/JButtonzPlay! ws } %edu/oswego/hci/hci520/tictactoe/GUI$1 ~* w addActionListener"(Ljava/awt/event/ActionListener;)VReset  %edu/oswego/hci/hci520/tictactoe/GUI$2 *  : setLayout \ Tic Tac Toe  tsetTitle  7setSize  setLocationRelativeTo(Ljava/awt/Component;)V  setDefaultCloseOperation(I)V   setVisible(Z)VLineNumberTableLocalVariableTablethis%Ledu/oswego/hci/hci520/tictactoe/GUI;iaccess$0P(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ledu/oswego/hci/hci520/tictactoe/Program;access$1<(Ledu/oswego/hci/hci520/tictactoe/GUI;)[Ljavax/swing/JLabel;access$2;(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/JLabel;access$3:(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/Timer;access$4<(Ledu/oswego/hci/hci520/tictactoe/GUI;)Ljavax/swing/JButton;access$5access$6Q(Ledu/oswego/hci/hci520/tictactoe/GUI;Ledu/oswego/hci/hci520/tictactoe/Program;)Vaccess$7;(Ledu/oswego/hci/hci520/tictactoe/GUI;Ljavax/swing/Timer;)V SourceFileGUI.java InnerClasses IterationPlay!      Y**** Y"#*%Y'Y*),/*1Y3Y58;**#=AC<1*CAYEY*GMOUXS*;*C2[W*C*;_e*1YiY  k8n*AYpru*wYy{|*|~Y**wY{*Y**n*|[W*n*[W*n*u[W*iY k**nW**;W**@E***z7- /9=/@CARCWDtECHLMNOVWfg hk'n0o9r?sItNuSwXxYT:%*#)%*C!%*u&%*/+%*%%*|$&*+#)&*+/+'~PK Y37Kqq(edu/oswego/hci/hci520/tictactoe/GUI.java/* * GUI.java * Author: B. Tenbergen [ http://www.tenbergen.org | nanoprobe19@gmx.net ] * Date: 2007-09-11 */ package edu.oswego.hci.hci520.tictactoe; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.ImageIcon; import javax.swing.Timer; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; /** * A very simple GUI class to an even simpler TicTacToe Game. * @author B. Tenbergen [ http://www.tenbergen.org | nanoprobe19@gmx.net ] * @version 2007-09-11 * @since 2007-09-11 */ public class GUI extends JFrame {// implements ActionListener { //this panel will contain the game controls and the status label private JPanel controlPanel; //this panel will contain the player symbols private JPanel playField; //an array of labels in which the player icons will be places private JLabel[] icons; //the game controls private JButton start; private JButton reset; private JLabel status; //a reference to a TicTacToe game instance private Program p; //some timer object private Timer timer; //the current game iteration protected int iteration = 0; //the winner of the game protected Program.Player winner = null; /** * Creates a new GUI by constructing the game control buttons, adding * actionlisteners to them, and adding a status label and putting both * into the control label. * Also, this constructor creates a blank game field and a new program reference. */ public GUI() { //something to play with ;-) p = new Program(); //create a timer that will play an iteration every second //needed to ensure proper updating of the GUI timer = new Timer(1000, new IterationPlay()); //the playfield is a 3x3 matrix. therefore, gridlayout is ideal. playField = new JPanel(new GridLayout(3, 3)); icons = new JLabel[p.field.length]; //initialize a blank playfield using the blank image icon. for (int i = 0; i < icons.length; i++) { icons[i] = new JLabel(new ImageIcon(getClass().getResource("res/empty.jpg"))); playField.add(icons[i]); } //the icons are all black, so make the rest black too. playField.setBackground(Color.BLACK); //create the control panel. FlowLayout is good enough since it will only take //three components in a row. controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10)); status = new JLabel("Use Play! to start."); //the status label start = new JButton("Play!"); //the play button start.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { reset.setEnabled(false); start.setEnabled(false); //when clicked, disable the start button timer.start(); //start a timer which will execute the game } }); reset = new JButton("Reset"); //the reset button reset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { p = new Program(); //when clicked, prepare a new game iteration = 0; winner = null; for (int i = 0; i < icons.length; i++) { icons[i].setIcon(new ImageIcon(getClass().getResource("res/empty.jpg"))); } //and reset the playfield. timer = new Timer(1000, new IterationPlay()); //reset the timer start.setEnabled(true); //don't forget the enable the start button ;-) } }); //add all game controls controlPanel.add(start); controlPanel.add(reset); controlPanel.add(status); //set the layout for the entire GUI. FlowLayout works just fine. setLayout(new FlowLayout(FlowLayout.LEFT, 5, 10)); //add both panels add(controlPanel); add(playField); //set title, size, location and default close behaviour setTitle("Tic Tac Toe"); setSize(320, 325); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //show the whole Spiel setVisible(true); } /** * This class implements an event handler for the timer object * that will play one iteration of the game when the timer * triggers a timeout event. * @author B. Tenbergen [ http://www.tenbergen.org | nanoprobe19@gmx.net ] * @version 2007-09-18 * @since 2007-09-18 */ protected class IterationPlay implements ActionListener { public void actionPerformed(ActionEvent e) { if (iteration <= p.field.length && winner == null) { winner = p.playIteration(iteration); //play one iteration if (iteration < p.field.length) { //set the icon of the field the last player has picked icons[p.lastPlayer.history.peek()].setIcon(new ImageIcon(p.lastPlayer.getSymbolURL())); } //update the game status status.setText(p.status); iteration++; } else { timer.stop(); reset.setEnabled(true); } } } }PK +7$edu/oswego/hci/hci520/tictactoe/res/PK +7}-edu/oswego/hci/hci520/tictactoe/res/empty.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222Kd" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((PK 1+773edu/oswego/hci/hci520/tictactoe/res/klingon_blk.pngPNG  IHDR>KLasRGBgAMA a cHRMz&u0`:pQ<aIDAThC횱OI  ](&((Q^>蝏\V,-A;j\#Օ:n+Ǡ緦F#g6S4cf}ss31|RMk \̼;{?3E];;;BIrXӀnnn~ppz6.:yni3noo G8.z= t,-tJfrX"I8ɵ˩fv H[O¼zddo<a ji4 :ut[ŧ֥P w`dʔ]X2Ō諫K'EY ڄNtQIZ *Qj֊bPOUku~=. 6Wvwwwپ:N{yZj0?xveeAc<`Q 7B| :nDg3A3iĺQu;Mf$ɢ-Wlw\9MER&uA8iSs'6% g4,=z~i 6W^A 2Kc._FN?XbPHīggH^\e(LPiQ:p#=M93$йQ "G|t΁nM vA!H[q}ʆEI.^:CCE1oZ78um؁+?zDS0ؼcP6GH'6M۩"tw(J[M4 ZnVB/?f ơ}=n" U֝g f^Vإ9?aIENDB`PK +7ig /edu/oswego/hci/hci520/tictactoe/res/ufp_blk.gifGIF89adK3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f!,dKQH*\ȰÇQUŋREȱ)QHm#Uy\R`IZJLş?T9#5E?#&)(`vPII}V*NE}V홳L4BF9D ҂(i<)ث׉)*ʩRSJE兟VS0O(@MGKuhSƗ8{F3DX<[hZ5Oq垍Z؞y٨_(JJ)!y]Yid`PLk٪oޤT8zp颋UgU?V5&SARMIWa%9m|qUe( L)[^rvnjVGiQ`5"Q+w E[ҭބ(*Tm_rpAwɅ.uZc"Qŀ9WuZ^E*g *V.diqjT"p ٤B)YFjTu|˒j4c;Q3N7c(RXFR%s^(^+6$ yCU<ն'9 !5oe+ay tF&="W,GR$;K,rD({e/; B߄rr{qфTaAd* tủmab(+'F>Y8OyF*hp J_A7$a6Y3L4 l} UEYJ N?ĂC쒵e$8st0p2_bA)B[VCLm  hw>AY!^*k57ta !JF!Y&W::jӉϊ/vH'5&[qU(HCz4,m%q_{1Id .=LB֚Ҫ!L QFꇖt{/]́FkZk6nͤzK icV۬S:yiar~S7u"X2 CW;8f0ES"Q1%rG(Hϐ~ߧ#+Gd $q]mW~EiU\iP))QQ>a 8/&hECS˃,Q M0a kaqA,”km(p1?_fk]@1 qa8%a2 ~{akUi8(cyK3L8A~6Nem~HsGӊaw?865uQ;50N.B$؍= 7 ~p!(dW.8"h =x=;PK$Z37OqMNMETA-INF/MANIFEST.MFPK 27edu/PK 27 edu/oswego/PK 27edu/oswego/hci/PK 27 edu/oswego/hci/hci520/PK 27 ?edu/oswego/hci/hci520/tictactoe/PK %27V@4}edu/oswego/hci/hci520/tictactoe/Program$Player.classPK %270. -edu/oswego/hci/hci520/tictactoe/Program.classPK %27:-^,aedu/oswego/hci/hci520/tictactoe/Program.javaPK Y37E+-edu/oswego/hci/hci520/tictactoe/GUI$1.classPK Y37 H--+1edu/oswego/hci/hci520/tictactoe/GUI$2.classPK Y378]7s9edu/oswego/hci/hci520/tictactoe/GUI$IterationPlay.classPK Y37gg)Bedu/oswego/hci/hci520/tictactoe/GUI.classPK Y37Kqq(6Qedu/oswego/hci/hci520/tictactoe/GUI.javaPK +7$dedu/oswego/hci/hci520/tictactoe/res/PK +7}-/eedu/oswego/hci/hci520/tictactoe/res/empty.jpgPK 1+773yhedu/oswego/hci/hci520/tictactoe/res/klingon_blk.pngPK +7ig /oedu/oswego/hci/hci520/tictactoe/res/ufp_blk.gifPK}