Hey zusammen,
ich habe mich an einem kleinen Memory-Spiel versucht, und hätte gerne einmal Feedback dazu.
Ich habe versucht so gut es geht das MVC Prinzip zu beachten und einfach mal mich mit dem Oberserver Pattern zu beschäftigen.
Über jeden Hinweis bzw. über jede Kritik wäre ich dankbar
Entweder hier:
https://github.com/spencerreidhere/JavaFx
oder hier:
Vielen Dank!
spencerreidhere
ich habe mich an einem kleinen Memory-Spiel versucht, und hätte gerne einmal Feedback dazu.
Ich habe versucht so gut es geht das MVC Prinzip zu beachten und einfach mal mich mit dem Oberserver Pattern zu beschäftigen.
Über jeden Hinweis bzw. über jede Kritik wäre ich dankbar
Entweder hier:
https://github.com/spencerreidhere/JavaFx
oder hier:
Code:
package application;
import controller.MemoryController;
import gui.MemoryBoard;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
primaryStage.setTitle("Memory --v0.1SNAPSHOT");
final BorderPane root = new BorderPane();
final Scene scene = new Scene(root, 801, 838);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
new MemoryBoard(root, new MemoryController());
primaryStage.setScene(scene);
primaryStage.show();
} catch (final Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Code:
package controller;
import java.util.Observable;
import gui.Card;
public class MemoryController extends Observable {
private Card firstCard;
private Card secondCard;
private boolean checkTime;
public MemoryController() {
}
public Card getFirstCard() {
return firstCard;
}
public void setFirstCard(Card firstCard) {
this.firstCard = firstCard;
}
public Card getSecondCard() {
return secondCard;
}
public void setSecondCard(Card secondCard) {
this.secondCard = secondCard;
}
public void check() {
setChanged();
notifyObservers();
}
public boolean isCheckTime() {
return checkTime;
}
public void setCheckTime(boolean checkTime) {
this.checkTime = checkTime;
}
}
Code:
package gui;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import controller.MemoryController;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
public class MemoryBoard implements Observer {
private final Card[][] boardCards = new Card[4][4];
private final Pane pane = new Pane();
private final MemoryController memoryController;
private final BorderPane borderPane;
public MemoryBoard(final BorderPane borderPane, final MemoryController memoryController) {
this.borderPane = borderPane;
this.memoryController = memoryController;
memoryController.addObserver(this);
addTop();
addCenter();
}
private void addTop() {
final HBox hBox = new HBox();
hBox.setPadding(new Insets(5));
hBox.setSpacing(10);
hBox.setStyle("-fx-background-color: #336699;");
final Button button = new Button("Neues Spiel");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
for (final Card[] cards : boardCards) {
for (final Card card : cards) {
card.setValue("");
}
}
}
});
hBox.getChildren().add(button);
borderPane.setTop(hBox);
}
private void addCenter() {
final List<Integer> memoryIds = Arrays.asList(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8);
Collections.shuffle(memoryIds);
Integer memoryId = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
final Card card = new Card(memoryIds.get(memoryId), memoryController, this);
memoryId++;
card.setTranslateX(j * 200);
card.setTranslateY(i * 200);
pane.getChildren().add(card);
boardCards[j][i] = card;
}
}
borderPane.setCenter(pane);
}
protected void disable(final boolean disable) {
for (final Card[] cards : boardCards) {
for (final Card card : cards) {
card.setDisable(disable);
}
}
}
@Override
public void update(Observable o, Object arg) {
if (memoryController.getFirstCard().getValue().equals(memoryController.getSecondCard().getValue())) {
memoryController.getFirstCard().setFound();
memoryController.getSecondCard().setFound();
} else {
memoryController.getFirstCard().setValue("");
memoryController.getSecondCard().setValue("");
}
}
}
Code:
package gui;
import controller.MemoryController;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.geometry.Pos;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.util.Duration;
public class Card extends StackPane {
private final Text text = new Text();
private final Rectangle border;
public Card(final Integer memoryId, MemoryController controller, final MemoryBoard memoryBoard) {
border = new Rectangle(200, 200);
border.setFill(null);
border.setStroke(Color.BLACK);
text.setFont(Font.font(72));
setAlignment(Pos.CENTER);
getChildren().addAll(border);
getChildren().addAll(text);
setOnMouseClicked(event -> {
text.setText("M " + memoryId);
if (!controller.isCheckTime()) {
controller.setFirstCard(this);
controller.setCheckTime(true);
} else {
memoryBoard.disable(true);
// wait 0,5 second
final Timeline tl = new Timeline(new KeyFrame(Duration.millis(500), e -> {
controller.setSecondCard(this);
controller.check();
controller.setCheckTime(false);
memoryBoard.disable(false);
}));
tl.setCycleCount(1);
tl.play();
}
});
}
public String getValue() {
return text.getText();
}
public void setValue(final String text) {
this.text.setText(text);
}
public void setFound() {
border.setFill(Color.GREENYELLOW);
}
}
Vielen Dank!
spencerreidhere