TicTacToe:

If a user tries to Cheat, let him know that we know^^

git-svn-id: http://svn.igniterealtime.org/svn/repos/spark/trunk@12499 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Wolf Posdorfer
2011-06-16 14:13:58 +00:00
committed by wolf.posdorfer
parent 7875fb8071
commit 8beb84f0c6
6 changed files with 175 additions and 6 deletions

View File

@ -24,7 +24,9 @@ import org.jivesoftware.spark.SparkManager;
import javax.swing.Timer; import javax.swing.Timer;
import javax.swing.JFrame; import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Point; import java.awt.Point;
import java.awt.Toolkit;
import java.awt.Window; import java.awt.Window;
import java.awt.Frame; import java.awt.Frame;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@ -41,6 +43,7 @@ public class ShakeWindow {
private Point naturalLocation; private Point naturalLocation;
private long startTime; private long startTime;
private Timer shakeTimer; private Timer shakeTimer;
private Timer moveTimer;
private final double TWO_PI = Math.PI * 2.0; private final double TWO_PI = Math.PI * 2.0;
private boolean added = false; private boolean added = false;
@ -105,6 +108,47 @@ public class ShakeWindow {
SparkManager.getNativeManager().stopFlashing(window); SparkManager.getNativeManager().stopFlashing(window);
} }
/**
* punishes the User by moving the Chatwindow around for 10 seconds
*/
public void startRandomMovement(final int seconds)
{
if(window instanceof JFrame){
JFrame f = (JFrame)window;
f.setState(Frame.NORMAL);
f.setVisible(true);
}
SparkManager.getNativeManager().flashWindow(window);
final long startTime = System.currentTimeMillis()/1000L;
moveTimer = new Timer(5, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
double x = Math.random()*10000 % d.getWidth();
double y = Math.random()*10000 % d.getHeight();
int xx = Math.round(Math.round(x));
int yy = Math.round(Math.round(y));
window.setLocation(xx,yy);
window.repaint();
long now = System.currentTimeMillis()/1000L;
long diff = now-startTime;
System.out.println(diff);
if(diff > seconds)
{
moveTimer.stop();
}
}
});
moveTimer.start();
}
} }

View File

@ -357,7 +357,14 @@ public class ChatRoomImpl extends ChatRoom {
return true; return true;
} }
/**
* Returns the Bare-Participant JID
*
* <b> user@server.com </b> <br>
* for retrieving the full Jid use ChatRoomImpl.getJID()
*
* @return
*/
public String getParticipantJID() { public String getParticipantJID() {
return participantJID; return participantJID;
} }

View File

@ -204,4 +204,15 @@ public class GameBoard {
return null; return null;
} }
/**
* Checks if the palced move is Valid
* @param x
* @param y
* @return
*/
public boolean isValidMove(Mark markplaced, int x , int y)
{
return _board[x][y] == 0 && _currentPlayer == markplaced.getValue();
}
} }

View File

@ -47,6 +47,7 @@ import org.jivesoftware.spark.ui.ChatRoomListener;
import org.jivesoftware.spark.ui.ChatRoomListenerAdapter; import org.jivesoftware.spark.ui.ChatRoomListenerAdapter;
import org.jivesoftware.spark.ui.rooms.ChatRoomImpl; import org.jivesoftware.spark.ui.rooms.ChatRoomImpl;
import tic.tac.toe.packet.GameOfferPacket; import tic.tac.toe.packet.GameOfferPacket;
import tic.tac.toe.packet.InvalidMove;
import tic.tac.toe.packet.MovePacket; import tic.tac.toe.packet.MovePacket;
import tic.tac.toe.ui.GamePanel; import tic.tac.toe.ui.GamePanel;
@ -77,6 +78,7 @@ public class TicTacToePlugin implements Plugin {
ProviderManager.getInstance().addIQProvider(GameOfferPacket.ELEMENT_NAME, GameOfferPacket.NAMESPACE,GameOfferPacket.class); ProviderManager.getInstance().addIQProvider(GameOfferPacket.ELEMENT_NAME, GameOfferPacket.NAMESPACE,GameOfferPacket.class);
ProviderManager.getInstance().addExtensionProvider(MovePacket.ELEMENT_NAME, MovePacket.NAMESPACE, MovePacket.class); ProviderManager.getInstance().addExtensionProvider(MovePacket.ELEMENT_NAME, MovePacket.NAMESPACE, MovePacket.class);
ProviderManager.getInstance().addExtensionProvider(InvalidMove.ELEMENT_NAME, InvalidMove.NAMESPACE, InvalidMove.class);
// Add IQ listener to listen for incoming game invitations. // Add IQ listener to listen for incoming game invitations.
_gameOfferListener = new PacketListener() { _gameOfferListener = new PacketListener() {
@ -166,6 +168,14 @@ public class TicTacToePlugin implements Plugin {
}); });
} }
@Override
public void chatRoomClosed(ChatRoom room) {
if (room instanceof ChatRoomImpl) {
ChatRoomImpl cri = (ChatRoomImpl) room;
_currentInvitations.remove(cri.getParticipantJID());
}
}
}; };

View File

@ -0,0 +1,63 @@
package tic.tac.toe.packet;
import org.jivesoftware.smack.packet.PacketExtension;
public class InvalidMove implements PacketExtension {
public static final String ELEMENT_NAME = "ttt-invalid";
public static final String NAMESPACE = "tictactoe";
private int _gameID;
private int _posx;
private int _posy;
@Override
public String getElementName() {
return ELEMENT_NAME;
}
@Override
public String getNamespace() {
return NAMESPACE;
}
public int getGameID() {
return _gameID;
}
public void setGameID(int gameID) {
_gameID = gameID;
}
public int getPositionX() {
return _posx;
}
public int getPositionY() {
return _posy;
}
public void setPositionX(int x) {
_posx = x;
}
public void setPositionY(int y) {
_posy = y;
}
@Override
public String toXML() {
StringBuffer buf = new StringBuffer();
buf.append("<" + ELEMENT_NAME + " xmlns=\"" + NAMESPACE + "\">");
buf.append("<gameID>").append(_gameID).append("</gameID>");
buf.append("<positionX>").append(_posx).append("</positionX>");
buf.append("<positionY>").append(_posy).append("</positionY>");
buf.append("</" + ELEMENT_NAME + ">");
return buf.toString();
}
}

View File

@ -21,20 +21,21 @@ package tic.tac.toe.ui;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JPanel; import javax.swing.JPanel;
import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.filter.PacketExtensionFilter; import org.jivesoftware.smack.filter.PacketExtensionFilter;
import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.ui.ChatRoom;
import org.jivesoftware.spark.ui.ShakeWindow; import org.jivesoftware.spark.ui.ShakeWindow;
import tic.tac.toe.GameBoard; import tic.tac.toe.GameBoard;
import tic.tac.toe.Mark; import tic.tac.toe.Mark;
import tic.tac.toe.TTTRes; import tic.tac.toe.TTTRes;
import tic.tac.toe.packet.InvalidMove;
import tic.tac.toe.packet.MovePacket; import tic.tac.toe.packet.MovePacket;
/** /**
@ -95,13 +96,48 @@ public class GamePanel extends JPanel {
MovePacket.ELEMENT_NAME, MovePacket.NAMESPACE); MovePacket.ELEMENT_NAME, MovePacket.NAMESPACE);
if (move.getGameID() == _gameID) { if (move.getGameID() == _gameID) {
if(_gameboard.isValidMove(getYourMark() ,move.getPositionX(), move.getPositionY()))
{
_gameboardpanel.placeMark(getYourMark(), _gameboardpanel.placeMark(getYourMark(),
move.getPositionX(), move.getPositionY()); move.getPositionX(), move.getPositionY());
}
else
{
InvalidMove inval = new InvalidMove();
inval.setGameID(move.getGameID());
inval.setPositionX(move.getPositionX());
inval.setPositionY(move.getPositionY());
Message message =new Message(_opponent);
message.addExtension(inval);
_connection.sendPacket(message);
ChatRoom cr = SparkManager.getChatManager().getChatRoom(StringUtils.parseBareAddress(_opponent));
cr.getTranscriptWindow().insertCustomText(_opponent+"seems to be cheating\n"+
"He tried placing a wrong Move", true, false, Color.red);
}
} }
} }
}, new PacketExtensionFilter(MovePacket.ELEMENT_NAME, }, new PacketExtensionFilter(MovePacket.ELEMENT_NAME,
MovePacket.NAMESPACE)); MovePacket.NAMESPACE));
_connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
//InvalidMove im = (InvalidMove)packet.getExtension(InvalidMove.ELEMENT_NAME, InvalidMove.NAMESPACE);
ChatRoom cr = SparkManager.getChatManager().getChatRoom(StringUtils.parseBareAddress(_opponent));
cr.getTranscriptWindow().insertCustomText("You seem to be Cheating\n"+
"You placed a wrong Move", true, false, Color.red);
ShakeWindow sw = new ShakeWindow(_frame);
sw.startRandomMovement(10);
}
}, new PacketExtensionFilter(InvalidMove.ELEMENT_NAME,
InvalidMove.NAMESPACE));
} }
@ -145,8 +181,6 @@ public class GamePanel extends JPanel {
if (_gameboard.getWinner() == getMyMark().getValue()) { if (_gameboard.getWinner() == getMyMark().getValue()) {
remove(_playerdisplay); remove(_playerdisplay);
add(new GameEndsUI(TTTRes.getString("ttt.win"), Color.GREEN), BorderLayout.SOUTH); add(new GameEndsUI(TTTRes.getString("ttt.win"), Color.GREEN), BorderLayout.SOUTH);