From 64ab0d1841811431c3df4e4ccfae35f550315134 Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Wed, 9 Nov 2022 12:32:58 +0100 Subject: [PATCH 01/55] Client for practice and friend mode --- .gitignore | 42 ++++ .idea/.gitignore | 8 + .idea/gradle.xml | 16 ++ .idea/misc.xml | 8 + build.gradle | 19 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 ++++++++++++++++++ gradlew.bat | 89 +++++++ settings.gradle | 2 + src/main/java/org/example/Main.java | 22 ++ .../example/controller/AlertController.java | 35 +++ .../controller/FriendlyModeController.java | 74 ++++++ .../example/controller/LoginController.java | 30 +++ .../controller/MatchCreatorController.java | 43 ++++ .../example/controller/ModeController.java | 61 +++++ .../controller/QuestionController.java | 79 ++++++ .../example/controller/ResultsController.java | 22 ++ .../example/controller/RoomController.java | 101 ++++++++ .../example/controller/WindowController.java | 26 ++ .../java/org/example/interfaces/Messages.java | 10 + src/main/java/org/example/model/Match.java | 142 +++++++++++ .../java/org/example/model/MatchChecker.java | 71 ++++++ src/main/java/org/example/model/Message.java | 56 +++++ src/main/java/org/example/model/Player.java | 79 ++++++ src/main/java/org/example/model/Question.java | 28 +++ src/main/java/org/example/model/Score.java | 44 ++++ src/main/java/org/example/utils/Sender.java | 67 +++++ src/main/java/org/example/utils/Utility.java | 8 + src/main/java/org/example/view/AlertView.java | 60 +++++ .../org/example/view/FriendlyModeView.java | 88 +++++++ src/main/java/org/example/view/LoginView.java | 33 +++ .../org/example/view/MatchCreatorView.java | 42 ++++ src/main/java/org/example/view/ModeView.java | 56 +++++ .../java/org/example/view/QuestionView.java | 42 ++++ .../java/org/example/view/ResultsView.java | 59 +++++ src/main/java/org/example/view/RoomView.java | 65 +++++ .../java/org/example/view/WindowView.java | 31 +++ 38 files changed, 1897 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/org/example/Main.java create mode 100644 src/main/java/org/example/controller/AlertController.java create mode 100644 src/main/java/org/example/controller/FriendlyModeController.java create mode 100644 src/main/java/org/example/controller/LoginController.java create mode 100644 src/main/java/org/example/controller/MatchCreatorController.java create mode 100644 src/main/java/org/example/controller/ModeController.java create mode 100644 src/main/java/org/example/controller/QuestionController.java create mode 100644 src/main/java/org/example/controller/ResultsController.java create mode 100644 src/main/java/org/example/controller/RoomController.java create mode 100644 src/main/java/org/example/controller/WindowController.java create mode 100644 src/main/java/org/example/interfaces/Messages.java create mode 100644 src/main/java/org/example/model/Match.java create mode 100644 src/main/java/org/example/model/MatchChecker.java create mode 100644 src/main/java/org/example/model/Message.java create mode 100644 src/main/java/org/example/model/Player.java create mode 100644 src/main/java/org/example/model/Question.java create mode 100644 src/main/java/org/example/model/Score.java create mode 100644 src/main/java/org/example/utils/Sender.java create mode 100644 src/main/java/org/example/utils/Utility.java create mode 100644 src/main/java/org/example/view/AlertView.java create mode 100644 src/main/java/org/example/view/FriendlyModeView.java create mode 100644 src/main/java/org/example/view/LoginView.java create mode 100644 src/main/java/org/example/view/MatchCreatorView.java create mode 100644 src/main/java/org/example/view/ModeView.java create mode 100644 src/main/java/org/example/view/QuestionView.java create mode 100644 src/main/java/org/example/view/ResultsView.java create mode 100644 src/main/java/org/example/view/RoomView.java create mode 100644 src/main/java/org/example/view/WindowView.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ba1ec5c --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3e79c5f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..3cae2d7 --- /dev/null +++ b/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..41dfb87 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..dd1a777 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'client' + diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java new file mode 100644 index 0000000..d016d2f --- /dev/null +++ b/src/main/java/org/example/Main.java @@ -0,0 +1,22 @@ +package org.example; + +import org.example.utils.Sender; +import org.example.view.WindowView; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.Socket; + +public class Main { + private static final int PORT = 9000; + private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + + public static void main(String[] args) { + try{ + Socket socket = new Socket("localhost", PORT); + WindowView w = new WindowView(new Sender(socket)); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/example/controller/AlertController.java b/src/main/java/org/example/controller/AlertController.java new file mode 100644 index 0000000..319dfe9 --- /dev/null +++ b/src/main/java/org/example/controller/AlertController.java @@ -0,0 +1,35 @@ +package org.example.controller; + +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.model.Question; +import org.example.utils.Sender; +import org.example.view.ModeView; +import org.example.view.QuestionView; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class AlertController { + public AlertController(JFrame frame, JPanel alert, String name, String type, JButton buttonYes, JButton buttonNo, Sender sender, MatchChecker mm){ + buttonYes.addActionListener(e -> { + Message response = sender.sendAndRead(new Message(name, "RESUME",type)); + if(response != null && response.getMessage() != null && response.getEvent().equals("GAME")){ + mm.setType("practice"); + mm.setGoingOn(true); + mm.setQuestion((Question) response.getMessage()); + System.out.println(mm); + frame.remove(alert); + frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm).getPanel()); + frame.validate(); + } + }); + buttonNo.addActionListener(e -> { + sender.send(new Message(name, "REMOVE")); + frame.remove(alert); + frame.add(new ModeView(frame,name,sender, mm).getPanel()); + frame.validate(); + }); + } +} diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java new file mode 100644 index 0000000..9fe0d86 --- /dev/null +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -0,0 +1,74 @@ +package org.example.controller; + +import org.example.model.Match; +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.utils.Sender; +import org.example.view.MatchCreatorView; +import org.example.view.ModeView; +import org.example.view.RoomView; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +public class FriendlyModeController { + + public FriendlyModeController(JFrame frame, JPanel panel, ArrayList matches, JButton create, JButton back, JPanel content, String name, Sender sender, MatchChecker mm, Timer t){ + + TimerTask tt = new TimerTask() { + @Override + public void run() { + Message responsef = sender.sendAndRead(new Message<>(name, "START","friendly")); + if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() instanceof ArrayList){ + ArrayList newMatches = (ArrayList) responsef.getMessage(); + content.removeAll(); + content.setLayout(new GridLayout((newMatches.size()),1)); + for(Match m : newMatches){ + JPanel content2 = new JPanel(); + content2.setLayout(new GridLayout(5,1)); + JLabel l1 = new JLabel("Match: "+m.getName()); + content2.add(l1); + JLabel l2 = new JLabel("Host: "+m.getHost()); + content2.add(l2); + JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); + content2.add(l3); + JButton enter = new JButton("Enter"); + content2.add(enter); + enter.addActionListener(e -> { + Message response = sender.sendAndRead(new Message<>(name, "GET_IN",m.getName())); + if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ + t.cancel(); + Match mGet = (Match) response.getMessage(); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); + frame.validate(); + } + }); + JSeparator js = new JSeparator(); + content2.add(js); + content.add(content2); + content2.setVisible(true); + } + content.setVisible(true); + frame.revalidate(); + frame.repaint(); + } + }; + }; + t.scheduleAtFixedRate(tt,2000,2000); + + create.addActionListener(e -> { + frame.remove(panel); + frame.add(new MatchCreatorView(frame, name, matches, sender, mm,t).getPanel()); + frame.validate(); + }); + back.addActionListener(e -> { + frame.remove(panel); + frame.add(new ModeView(frame, name, sender, mm, t).getPanel()); + frame.validate(); + }); + } +} diff --git a/src/main/java/org/example/controller/LoginController.java b/src/main/java/org/example/controller/LoginController.java new file mode 100644 index 0000000..23df345 --- /dev/null +++ b/src/main/java/org/example/controller/LoginController.java @@ -0,0 +1,30 @@ +package org.example.controller; + +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.utils.Sender; +import org.example.view.AlertView; +import org.example.view.ModeView; + +import javax.swing.*; + +public class LoginController { + public LoginController(JFrame frame, JPanel login, JButton jb, JTextField nameJ, Sender sender, MatchChecker mm){ + jb.addActionListener(e -> { + String name = nameJ.getText(); + if(name != null && name.length() > 0){ + mm.setName(name); + Message response = sender.sendAndRead(new Message(name, "NAME")); + if(response.getMessage() != null && response.getMessage() instanceof String){ + frame.remove(login); + frame.add(new AlertView(frame,name, (String) response.getMessage(),sender, mm).getPanel()); + frame.validate(); + }else{ + frame.remove(login); + frame.add(new ModeView(frame,name,sender, mm).getPanel()); + frame.validate(); + } + } + }); + } +} diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java new file mode 100644 index 0000000..bd444f1 --- /dev/null +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -0,0 +1,43 @@ +package org.example.controller; + +import org.example.model.Match; +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.model.Player; +import org.example.utils.Sender; +import org.example.view.FriendlyModeView; +import org.example.view.RoomView; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.Timer; + +public class MatchCreatorController { + public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, ArrayList matches, Sender sender, MatchChecker mm, Timer t){ + t.cancel(); + create.addActionListener(e -> { + String nameM = nameMatch.getText(); + if(nameM != null && nameM.length() > 0){ + Message response = sender.sendAndRead(new Message(name, "NAME_CHECKER",nameM)); + if(response.getMessage() != null && response.getMessage().equals("Y")){ + JOptionPane.showMessageDialog(frame,"Game match already used!","Warning!",JOptionPane.WARNING_MESSAGE); + }else{ + Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM)); + if(response2.getMessage() != null){ + Match match = (Match) response2.getMessage(); + mm.setType("friendly"); + mm.setGoingOn(true); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches,match, sender, mm).getPanel()); + frame.validate(); + } + } + } + }); + back.addActionListener(e -> { + frame.remove(panel); + frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); + frame.validate(); + }); + } +} diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java new file mode 100644 index 0000000..e279da6 --- /dev/null +++ b/src/main/java/org/example/controller/ModeController.java @@ -0,0 +1,61 @@ +package org.example.controller; + +import org.example.model.Match; +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.model.Question; +import org.example.utils.Sender; +import org.example.view.FriendlyModeView; +import org.example.view.QuestionView; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.Timer; + +public class ModeController { + public ModeController(JFrame frame, JPanel mode, JButton jb, JRadioButton[] list, String name, Sender sender, MatchChecker mm){ + this.controller(frame,mode,jb,list,name,sender,mm); + } + public ModeController(JFrame frame, JPanel mode, JButton jb, JRadioButton[] list, String name, Sender sender, MatchChecker mm, Timer t){ + t.cancel(); + this.controller(frame,mode,jb,list,name,sender,mm); + } + private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] list, String name, Sender sender, MatchChecker mm){ + jb.addActionListener(e -> { + String value = null; + for(JRadioButton el : list){ + if(el.isSelected()) + value = el.getText(); + } + switch (value.toLowerCase()){ + case "practice mode": + String[] options = {"Yes","No"}; + int result = JOptionPane.showOptionDialog(frame , "A game will start soon.\n Do you want to start it now?", "Question", + JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, + null, options, options[0]); + if(result == 0){ + mm.setType("practice"); + mm.setGoingOn(true); + Message response = sender.sendAndRead(new Message<>(name, "START","practice")); + Question q = (Question) response.getMessage(); + frame.remove(mode); + frame.add(new QuestionView(frame,name,q,sender, mm).getPanel()); + frame.validate(); + } + break; + case "friendly mode": + mm.setType("friendly"); + Message responsef = sender.sendAndRead(new Message<>(name, "START","friendly")); + if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() != null && responsef.getMessage() instanceof ArrayList){ + ArrayList matches = (ArrayList) responsef.getMessage(); + frame.remove(mode); + frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); + frame.validate(); + } + break; + case "tournament mode": + break; + } + }); + } +} diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java new file mode 100644 index 0000000..7053905 --- /dev/null +++ b/src/main/java/org/example/controller/QuestionController.java @@ -0,0 +1,79 @@ +package org.example.controller; + +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.model.Question; +import org.example.model.Score; +import org.example.utils.Sender; +import org.example.view.QuestionView; +import org.example.view.ResultsView; + +import javax.swing.*; +import java.util.Timer; +import java.util.TimerTask; + +public class QuestionController { + public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm){ + jb.addActionListener(e -> { + if(answer.getText() != null && answer.getText().length() > 0){ //TODO: DOVREI TOGLIERE TUTTI GLI SPAZI VUOTI E CONFRONTARE LA STRINGA SOLO A QUEL PUNTO + String text = answer.getText(); + q.checkAnswer(text); + Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); + switch (response.getEvent().toLowerCase()){ + case "game": + System.out.println(mm); + frame.remove(question); + Question newQuestion = (Question) response.getMessage(); + frame.add(new QuestionView(frame,name,newQuestion,sender, mm).getPanel()); + frame.validate(); + break; + case "end": + System.out.println(mm); + switch (mm.getType()){ + case "practice": + mm.setGoingOn(false); + mm.setType(null); + mm.setMatch(null); + frame.remove(question); + Score score = (Score) response.getMessage(); + frame.add(new ResultsView(frame,name,score,sender, mm,false).getPanel()); + frame.validate(); + break; + case "friendly": + System.out.println("Sono qui"); + //mm.setGoingOn(false); + //mm.setType(null); + frame.remove(question); + Score score2 = (Score) response.getMessage(); + JPanel waiting = new ResultsView(frame,name,score2,sender, mm,true).getPanel(); + frame.add(waiting); + frame.validate(); + Timer t = new Timer(); + TimerTask tt = new TimerTask() { + @Override + public void run() { + Message check = sender.sendAndRead(new Message<>(name, "IS_END", mm.getMatch())); + if(check != null && check.getMessage() != null && check.getMessage() instanceof String){ + if(check.getMessage().equals("Y")){ + t.cancel(); + mm.setGoingOn(false); + mm.setType(null); + mm.setMatch(null); + frame.remove(waiting); + frame.add(new ResultsView(frame,name,score2,sender, mm,false).getPanel()); + frame.validate(); + } + } + } + }; + t.scheduleAtFixedRate(tt,1000,1000); + //TODO: DOVREI CONTROLLARE CHE TUTTI ABBIANO TERMINATO, QUINDI FACCIO UN POLLING, SE HANNO TERMINATO + //TODO: MOSTRO LA VIEW DEI RISULTATI E SETTO MM.SETGOINGON A FALSE E SETTYPE A NULL + + break; + } + } + } + }); + } +} diff --git a/src/main/java/org/example/controller/ResultsController.java b/src/main/java/org/example/controller/ResultsController.java new file mode 100644 index 0000000..1f2a9d4 --- /dev/null +++ b/src/main/java/org/example/controller/ResultsController.java @@ -0,0 +1,22 @@ +package org.example.controller; + +import org.example.model.MatchChecker; +import org.example.utils.Sender; +import org.example.view.ModeView; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ResultsController { + public ResultsController(JFrame frame, JPanel results, JButton jb, String name, Sender sender, MatchChecker mm){ + jb.addActionListener(e -> { + frame.remove(results); + frame.add(new ModeView(frame,name,sender, mm).getPanel()); + frame.validate(); + }); + /*jb.addActionListener(e -> { + + });*/ + } +} diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java new file mode 100644 index 0000000..d09f214 --- /dev/null +++ b/src/main/java/org/example/controller/RoomController.java @@ -0,0 +1,101 @@ +package org.example.controller; + +import org.example.model.*; +import org.example.utils.Sender; +import org.example.view.FriendlyModeView; +import org.example.view.QuestionView; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +public class RoomController { + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t){ + if(!match.getHost().name.equals(name)){ + back.setText("Exit"); + } + TimerTask tt = new TimerTask() { + @Override + public void run() { + Message responsef = sender.sendAndRead(new Message<>(name, "UPDATE_PLAYERS",match.getName())); + if(responsef != null && responsef.getMessage() != null && responsef.getEvent().equals("UPDATE_PLAYERS") && responsef.getMessage() instanceof Match){ + Match mmm = (Match) responsef.getMessage(); + if(mmm.getPlayers().size() > 0){ + if(!mmm.isAvailable()){ + t.cancel(); + Message responseD = sender.sendAndRead(new Message<>(name, "DROP_QUESTION",match.getName())); + if(responseD != null && responseD.getMessage() != null && responseD.getMessage() instanceof Question){ + mm.setGoingOn(true); + mm.setMatch(match.getName()); + frame.remove(panel); + frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm).getPanel()); + frame.validate(); + } + }else{ + content.removeAll(); + content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); + int i = 1; + printerCicle(match,i,content); + content.setVisible(true); + frame.revalidate(); + frame.repaint(); + } + }else{ + t.cancel(); + frame.remove(panel); + frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); + frame.validate(); + } + }else{ + t.cancel(); + frame.remove(panel); + frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); + frame.validate(); + + } + } + }; + t.scheduleAtFixedRate(tt,10,500); + + back.addActionListener(e -> { + if(match.getHost().name.equals(name)){ + Message response = sender.sendAndRead(new Message(name, "MATCH_REMOVER",match.getName())); + if(response != null && response.getMessage() != null && response.getEvent().equals("MATCH_REMOVER") && response.getMessage().equals("ok")){ + t.cancel(); + frame.remove(panel); + frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); + frame.validate(); + } + }else{ + t.cancel(); + sender.send(new Message(name, "REMOVE_PLAYER",match.getName())); + frame.remove(panel); + frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); + frame.validate(); + } + }); + if(start != null){ + start.addActionListener(e -> { + sender.send(new Message(name, "FRIENDLY_START",match.getName())); + }); + } + } + + private void printerCicle(Match match, int i, JPanel content){ + for(Player p : match.getPlayers()){ + JPanel contentPl = new JPanel(); + JLabel el1 = new JLabel(i+". Name: "); + el1.setFont(new Font(el1.getFont().getFontName(),Font.BOLD,el1.getFont().getSize())); + contentPl.add(el1); + JLabel el2 = new JLabel(p.name); + contentPl.add(el2); + JSeparator sp = new JSeparator(); + contentPl.add(sp); + i++; + contentPl.setVisible(true); + content.add(contentPl); + } + } +} diff --git a/src/main/java/org/example/controller/WindowController.java b/src/main/java/org/example/controller/WindowController.java new file mode 100644 index 0000000..d80e363 --- /dev/null +++ b/src/main/java/org/example/controller/WindowController.java @@ -0,0 +1,26 @@ +package org.example.controller; + +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.utils.Sender; + +import javax.swing.*; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +public class WindowController { + + public WindowController(JFrame frame, MatchChecker mm, Sender sender){ + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if(mm.isGoingOn()){ + sender.send(new Message(mm.getName(),"END", mm)); + }else{ + System.out.println(mm.getName()); + sender.send(new Message(mm.getName(),"END")); + } + sender.close(); + } + }); + } +} diff --git a/src/main/java/org/example/interfaces/Messages.java b/src/main/java/org/example/interfaces/Messages.java new file mode 100644 index 0000000..469c1bc --- /dev/null +++ b/src/main/java/org/example/interfaces/Messages.java @@ -0,0 +1,10 @@ +package org.example.interfaces; + +public interface Messages { + public Z getOwner(); + public K getEvent(); + public Y getMessage(); + public void setEvent(K event); + public void setMessage(Y message); + +} diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java new file mode 100644 index 0000000..a4f526e --- /dev/null +++ b/src/main/java/org/example/model/Match.java @@ -0,0 +1,142 @@ +package org.example.model; + +import org.example.utils.Utility; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Objects; + +public class Match implements Serializable { + private ArrayList players; + private boolean available; //Tells if the match can be join by other users + private String type; //Practice/Tournament/Friendly + public int id; + private String name; + + private Player host; + private final int SIZE = 4; + public Match(){ + this.players = new ArrayList<>(); + this.available = false ; + this.type = null; + this.id = Utility.randomIDGenerator(10000); + this.name = ""+this.id; + this.host = null; + } + public Match(String type, Player host){ + this.players = new ArrayList<>(); + this.available = false ; + this.type = type; + this.id = Utility.randomIDGenerator(10000); + this.name = ""+this.id; + this.host = host; + } + public Match(String type, String name, Player host){ + this.players = new ArrayList<>(); + this.available = false ; + this.type = type; + this.id = Utility.randomIDGenerator(10000); + this.name = name; + this.host = host; + } + + public synchronized ArrayList getPlayers() { + return players; + } + + public synchronized void setPlayers(ArrayList players) { + this.players = players; + } + + public synchronized boolean isAvailable() { + return available; + } + + public synchronized void setAvailable(boolean available) { + this.available = available; + } + + public synchronized String getType() { + return type; + } + + public synchronized void setType(String type) { + this.type = type; + } + + public synchronized String getName() { + return name; + } + + public synchronized void setName(String name) { + this.name = name; + } + + public synchronized Player getHost() { + return host; + } + + public synchronized void setHost(Player host) { + this.host = host; + } + + public synchronized void addPlayer(Player p){ + if(players.size() < SIZE) + players.add(p); + } + + public synchronized void removePlayer(Player p){ + if(players.size() > 0) + players.remove(p); + } + public synchronized String returnListOfPlayers(){ + String list = ""; + for(Player el : players){ + list = list+"\n"+el.toString(); + } + return list; + } + + public synchronized boolean containsUser(Player p){ + for(Player pp : players){ + if(pp.equals(p)) + return true; + } + return false; + } + + public synchronized Player getPlayer(Player p){ + for(Player pp : players){ + if(pp.equals(p)) + return pp; + } + return null; + } + + public synchronized Player getPlayer(String p){ + for(Player pp : players){ + if(pp.name.equals(p)) + return pp; + } + return null; + } + @Override + public String toString() { + return "Match{" + + "players=" + players + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Match match = (Match) o; + return (id == match.id) || (name.equals(match.name)); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/org/example/model/MatchChecker.java b/src/main/java/org/example/model/MatchChecker.java new file mode 100644 index 0000000..9df3036 --- /dev/null +++ b/src/main/java/org/example/model/MatchChecker.java @@ -0,0 +1,71 @@ +package org.example.model; + +import java.io.Serializable; + +public class MatchChecker implements Serializable { + private String name; //Name of who was doing the match + + private boolean isGoingOn; + private String type; + private Question question; + private String match; //Name of the match + + public MatchChecker(){ + this.isGoingOn = false; + this.question = null; + this.type = null; + this.match = null; + this.name = null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isGoingOn() { + return isGoingOn; + } + + public void setGoingOn(boolean goingOn) { + isGoingOn = goingOn; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getMatch() { + return match; + } + + public void setMatch(String match) { + this.match = match; + } + + public Question getQuestion() { + return question; + } + + public void setQuestion(Question question) { + this.question = question; + } + + @Override + public String toString() { + return "MatchChecker{" + + "name='" + name + '\'' + + ", isGoingOn=" + isGoingOn + + ", type='" + type + '\'' + + ", question=" + question + + ", match=" + match + + '}'; + } +} diff --git a/src/main/java/org/example/model/Message.java b/src/main/java/org/example/model/Message.java new file mode 100644 index 0000000..19a5cf8 --- /dev/null +++ b/src/main/java/org/example/model/Message.java @@ -0,0 +1,56 @@ +package org.example.model; + +import org.example.interfaces.Messages; + +import java.io.Serializable; + +public class Message implements Messages, Serializable { + private String owner; + private String event; + private K message; + public Message(String owner){ + this.owner = owner; + this.event = "QUIT"; + this.message = null; + } + public Message(String owner, String event){ + this.owner = owner; + this.event = event; + this.message = null; + } + public Message(String owner, String event, K message){ + this.owner = owner; + this.event = event; + this.message = message; + } + public String getOwner(){ + return this.owner; + } + + public String getEvent(){ + return this.event; + } + + @Override + public K getMessage() { + return this.message; + } + + public void setEvent(String event){ + this.event = event; + } + + @Override + public void setMessage(K message) { + this.message = message; + } + + @Override + public String toString() { + return "Message{" + + "owner='" + owner + '\'' + + ", event='" + event + '\'' + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/src/main/java/org/example/model/Player.java b/src/main/java/org/example/model/Player.java new file mode 100644 index 0000000..3c6e36c --- /dev/null +++ b/src/main/java/org/example/model/Player.java @@ -0,0 +1,79 @@ +package org.example.model; + +import org.example.utils.Utility; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Objects; + +public class Player implements Serializable { + + public String name; + public ArrayList questions; + public Score score; + private int id; + public Player(){ + this.name = null; + this.questions = new ArrayList<>(); + this.score = null; + this.id = Utility.randomIDGenerator(10000); + } + public Player(String name){ + this.name = name; + this.questions = new ArrayList<>(); + this.score = new Score(this.name); + this.id = Utility.randomIDGenerator(10000); + } + public void setName(String name){ + this.name = name; + this.score = new Score(this.name); + } + + public void clearQuestions(){ + questions.clear(); + } + public void addQuestion(Question q){ + questions.add(q); + } + + public Question pickQuestion(){ + int length = questions.size()-1; + int random_int = (int)Math.floor(Math.random()*(length+1)); + Question q = questions.get(random_int); + questions.remove(random_int); + return q; + } + public Question popQuestion(){ + Question q = questions.get(0); + questions.remove(0); + return q; + } + public boolean hasQuestion(){ + return (this.questions.size() > 0); + } + + public int getId(){ + return this.id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Player player = (Player) o; + return name.equals(player.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + + @Override + public String toString() { + return "Player{" + + "name='" + name + '\'' + + ", id=" + id + + '}'; + } +} diff --git a/src/main/java/org/example/model/Question.java b/src/main/java/org/example/model/Question.java new file mode 100644 index 0000000..c11e4ac --- /dev/null +++ b/src/main/java/org/example/model/Question.java @@ -0,0 +1,28 @@ +package org.example.model; + +import java.io.Serializable; + +public class Question implements Serializable { + public String quest, answer, given; + public boolean correct; + public Question(String quest, String answer){ + this.quest = quest; + this.answer = answer; + this.correct = false; + this.given = null; + } + + public final boolean checkAnswer(String answer){ + String newString = answer.toLowerCase().replaceAll("\\s+",""); + if(newString.equals(this.answer)){ + this.correct = true; + } + this.given = answer; + return this.correct; + } + + @Override + public String toString() { + return this.quest; + } +} diff --git a/src/main/java/org/example/model/Score.java b/src/main/java/org/example/model/Score.java new file mode 100644 index 0000000..4385a13 --- /dev/null +++ b/src/main/java/org/example/model/Score.java @@ -0,0 +1,44 @@ +package org.example.model; + +import java.io.Serializable; +import java.util.ArrayList; + +public class Score implements Serializable { + public ArrayList questions; + public String name; + public Score(String name){ + this.name = name; + questions = new ArrayList<>(); + } + public int getNumberOfCorrectAnswers(){ + int i = 0; + for(Question q : questions){ + if(q.correct) + i++; + } + return i; + } + public int getNumberOfUnCorrectAnswers(){ + int i = 0; + for(Question q : questions){ + if(!q.correct) + i++; + } + return i; + } + public void merge(Score s){ + this.questions.addAll(s.questions); + } + public void addQuestion(Question q){ + if(q != null) + this.questions.add(q); + } + @Override + public String toString() { + String answer = "**REPORT**\nName: "+this.name; + for(Question q : questions){ + answer = answer+"\n"+q.quest+"\nGiven: "+q.given+"\nExpected: "+q.answer+"\nIs correct?: "+q.correct+"\n******"; + } + return answer; + } +} diff --git a/src/main/java/org/example/utils/Sender.java b/src/main/java/org/example/utils/Sender.java new file mode 100644 index 0000000..a9c1f19 --- /dev/null +++ b/src/main/java/org/example/utils/Sender.java @@ -0,0 +1,67 @@ +package org.example.utils; + +import org.example.model.Message; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.Socket; + +public class Sender { + public ObjectOutputStream out; + public ObjectInputStream in; + public Socket socket; + + public Sender(Socket socket){ + try { + this.socket = socket; + this.out = new ObjectOutputStream(socket.getOutputStream()); + this.in = new ObjectInputStream(socket.getInputStream()); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public Message sendAndRead(Message message){ + Object result; + try{ + this.out.writeObject(message); + this.out.flush(); + this.out.reset(); + result = this.in.readObject(); + Message result2; + if(result != null){ + result2 = (Message) result; + System.out.println("Incoming message: "+result2); + return result2; + } + + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } + + public void send(Message message){ + try{ + this.out.writeObject(message); + this.out.flush(); + this.out.reset(); + }catch(Exception e){ + e.printStackTrace(); + } + } + public void close(){ + System.out.println("Closing the connection with the server!"); + try { + this.socket.close(); + in.close(); + out.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + } +} diff --git a/src/main/java/org/example/utils/Utility.java b/src/main/java/org/example/utils/Utility.java new file mode 100644 index 0000000..03a424e --- /dev/null +++ b/src/main/java/org/example/utils/Utility.java @@ -0,0 +1,8 @@ +package org.example.utils; + +public abstract class Utility { + public static int randomIDGenerator(int max){ + return ((int)Math.floor(Math.random()*(max+1))); + } + +} diff --git a/src/main/java/org/example/view/AlertView.java b/src/main/java/org/example/view/AlertView.java new file mode 100644 index 0000000..071df6d --- /dev/null +++ b/src/main/java/org/example/view/AlertView.java @@ -0,0 +1,60 @@ +package org.example.view; + +import org.example.controller.AlertController; +import org.example.controller.LoginController; +import org.example.model.MatchChecker; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; + +public class AlertView { + private JPanel alert; + public AlertView(JFrame frame, String name, String type, Sender sender, MatchChecker mm){ + alert = new JPanel(); + alert.setBorder(new EmptyBorder(25,25,25,25)); + alert.setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + + JLabel attentionLabel = new JLabel("Warning!"); + Font font = attentionLabel.getFont(); + attentionLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 0; + alert.add(attentionLabel, c); + + JLabel attentionLabel2 = new JLabel("A previous not finished match of type "+type+" is found"); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 1; + alert.add(attentionLabel2, c); + + JLabel attentionLabel3 = new JLabel("Do you want to resume it?"); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 2; + alert.add(attentionLabel3, c); + + JButton buttonYes = new JButton("Yes"); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = 3; + alert.add(buttonYes, c); + + JButton buttonNo = new JButton("No"); + c.gridx = 1; + c.gridy = 3; + alert.add(buttonNo, c); + + AlertController lc = new AlertController(frame, alert, name, type, buttonYes, buttonNo, sender, mm); + + alert.setVisible(true); + } + + public JPanel getPanel(){ + return this.alert; + } + +} diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java new file mode 100644 index 0000000..d0586da --- /dev/null +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -0,0 +1,88 @@ +package org.example.view; + +import org.example.controller.FriendlyModeController; +import org.example.model.Match; +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; +import java.util.concurrent.ConcurrentHashMap; + +public class FriendlyModeView { + private JPanel panel; + public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ + Timer t = new Timer(); + panel = new JPanel(); + panel.setBorder(new EmptyBorder(25,25,25,25)); + panel.setLayout(new GridLayout(7,1)); + + JLabel title = new JLabel("Friendly mode"); + Font font = title.getFont(); + title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + panel.add(title); + + JLabel description = new JLabel("Select a match or create a new one."); + panel.add(description); + + JScrollPane scrollable = new JScrollPane(); + scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + JPanel content = new JPanel(); + content.setLayout(new GridLayout((matches.size()),1)); + for(Match m : matches){ + JPanel content2 = new JPanel(); + content2.setLayout(new GridLayout(5,1)); + JLabel l1 = new JLabel("Match: "+m.getName()); + content2.add(l1); + JLabel l2 = new JLabel("Host: "+m.getHost()); + content2.add(l2); + JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); + content2.add(l3); + JButton enter = new JButton("Enter"); + enter.addActionListener(e -> { + Message response = sender.sendAndRead(new Message(name, "GET_IN",m.getName())); + if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ + t.cancel(); + Match mGet = (Match) response.getMessage(); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); + frame.validate(); + } + }); + content2.add(enter); + JSeparator js = new JSeparator(); + content2.add(js); + content.add(content2); + content2.setVisible(true); + } + content.setVisible(true); + scrollable.setViewportView(content); + + panel.add(scrollable); + JLabel or = new JLabel("or"); + panel.add(or); + JButton button = new JButton("Create a new match"); + panel.add(button); + JSeparator sp = new JSeparator(); + panel.add(sp); + JButton back = new JButton("Go Back"); + panel.add(back); + + FriendlyModeController fmc = new FriendlyModeController(frame, panel, matches, button, back, content, name, sender, mm, t); + + content.setVisible(true); + panel.setVisible(true); + } + + public JPanel getPanel(){ + return this.panel; + } +} diff --git a/src/main/java/org/example/view/LoginView.java b/src/main/java/org/example/view/LoginView.java new file mode 100644 index 0000000..4f2358e --- /dev/null +++ b/src/main/java/org/example/view/LoginView.java @@ -0,0 +1,33 @@ +package org.example.view; + +import org.example.controller.LoginController; +import org.example.model.MatchChecker; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; + +public class LoginView { + private JPanel login; + public LoginView(JFrame frame, Sender sender, MatchChecker mm){ + login = new JPanel(); + login.setLayout(new GridLayout(4,1)); + login.setBorder(new EmptyBorder(25,25,25,25)); + JLabel loginLabel = new JLabel("LOG IN"); + Font font = loginLabel.getFont(); + loginLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + login.add(loginLabel); + login.add(new JLabel("Enter your username")); + JTextField nameJ = new JTextField(20); + login.add(nameJ); + JButton loginButton = new JButton("Log In"); + login.add(loginButton); + LoginController lc = new LoginController(frame, login, loginButton, nameJ,sender, mm); + + login.setVisible(true); + } + public JPanel getPanel(){ + return this.login; + } +} diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java new file mode 100644 index 0000000..53e4f03 --- /dev/null +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -0,0 +1,42 @@ +package org.example.view; + +import org.example.controller.MatchCreatorController; +import org.example.model.Match; +import org.example.model.MatchChecker; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.util.ArrayList; +import java.util.Timer; + +public class MatchCreatorView { + private JPanel panel; + public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm, Timer t){ + panel = new JPanel(); + panel.setBorder(new EmptyBorder(25,25,25,25)); + panel.setLayout(new GridLayout(5,1)); + JLabel title = new JLabel("Create a new match"); + Font font = title.getFont(); + title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + panel.add(title); + JLabel description = new JLabel("Name of the match: "); + panel.add(description); + JTextField nameMatch = new JTextField(20); + panel.add(nameMatch); + JButton create = new JButton("Create"); + panel.add(create); + + JButton back = new JButton("Go back"); + panel.add(back); + + MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,matches, sender, mm, t); + + panel.setVisible(true); + + } + public JPanel getPanel(){ + return this.panel; + } +} diff --git a/src/main/java/org/example/view/ModeView.java b/src/main/java/org/example/view/ModeView.java new file mode 100644 index 0000000..73b8435 --- /dev/null +++ b/src/main/java/org/example/view/ModeView.java @@ -0,0 +1,56 @@ +package org.example.view; + +import org.example.controller.ModeController; +import org.example.model.MatchChecker; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.util.Timer; + +public class ModeView { + private JPanel mode; + public ModeView(JFrame frame, String name, Sender sender, MatchChecker mm){ + print(frame,name,sender,mm); + } + public ModeView(JFrame frame, String name, Sender sender, MatchChecker mm, Timer t){ + t.cancel(); + print(frame,name,sender,mm); + } + + private void print(JFrame frame, String name, Sender sender, MatchChecker mm){ + mode = new JPanel(); + mode.setLayout(new GridLayout(6,1)); + + mode.setBorder(new EmptyBorder(25,25,25,25)); + + JLabel modeLabel1 = new JLabel("Choose your game mode"); + Font font = modeLabel1.getFont(); + modeLabel1.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + mode.add(modeLabel1); + + JLabel modeLabel2 = new JLabel("Welcome "+name+"! Select the mode you want to play."); + mode.add(modeLabel2); + + JRadioButton[] list = new JRadioButton[]{ + new JRadioButton("Practice Mode", true), + new JRadioButton("Friendly Mode"), + new JRadioButton("Tournament Mode")}; + ButtonGroup group = new ButtonGroup(); + for(JRadioButton el : list){ + group.add(el); + mode.add(el); + } + JButton select = new JButton("Select"); + + mode.add(select); + + + ModeController mc = new ModeController(frame,mode,select,list,name,sender, mm); + mode.setVisible(true); + } + public JPanel getPanel(){ + return this.mode; + } +} diff --git a/src/main/java/org/example/view/QuestionView.java b/src/main/java/org/example/view/QuestionView.java new file mode 100644 index 0000000..0503844 --- /dev/null +++ b/src/main/java/org/example/view/QuestionView.java @@ -0,0 +1,42 @@ +package org.example.view; + +import org.example.controller.QuestionController; +import org.example.model.MatchChecker; +import org.example.model.Question; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; + +public class QuestionView { + JPanel question; + public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm){ + question = new JPanel(); + question.setLayout(new GridLayout(4,1)); + question.setBorder(new EmptyBorder(25,25,25,25)); + + JLabel questionLabel = new JLabel("Question: "); + question.add(questionLabel); + + JLabel questionLabel2 = new JLabel(q.quest); + Font font = questionLabel2.getFont(); + questionLabel2.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + question.add(questionLabel2); + + + JTextField result = new JTextField(20); + question.add(result); + + JButton sendButton = new JButton("Send answer"); + question.add(sendButton); + + QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm); + mm.setQuestion(q); + question.setVisible(true); + } + + public JPanel getPanel(){ + return question; + } +} diff --git a/src/main/java/org/example/view/ResultsView.java b/src/main/java/org/example/view/ResultsView.java new file mode 100644 index 0000000..f9d5c34 --- /dev/null +++ b/src/main/java/org/example/view/ResultsView.java @@ -0,0 +1,59 @@ +package org.example.view; + +import org.example.controller.ResultsController; +import org.example.model.MatchChecker; +import org.example.model.Question; +import org.example.model.Score; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; + +public class ResultsView { + private JPanel results; + public ResultsView(JFrame frame, String name, Score score, Sender sender, MatchChecker mm, boolean casistic){ + results = new JPanel(); + if(!casistic){ + int size = score.questions.size(); + results.setLayout(new GridLayout(3,1)); + results.setBorder(new EmptyBorder(25,25,25,25)); + JLabel scoreLabel = new JLabel("RESULTS"); + results.add(scoreLabel); + Font font = scoreLabel.getFont(); + scoreLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + JScrollPane scrollable = new JScrollPane(); + scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + int i = 1; + JPanel content = new JPanel(); + content.setLayout(new GridLayout(size*5,1)); + for(Question q : score.questions){ + JLabel el1 = new JLabel(i+". Question: "+q.quest); + el1.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + content.add(el1); + JLabel el2 = new JLabel("Expected: "+q.answer); + content.add(el2); + JLabel el3 = new JLabel("Given: "+q.given); + content.add(el3); + JLabel el4 = new JLabel("Is correct?: "+q.correct); + content.add(el4); + JSeparator sp = new JSeparator(); + content.add(sp); + i++; + } + scrollable.setViewportView(content); + results.add(scrollable); + JButton button = new JButton("Return to home"); + ResultsController rc = new ResultsController(frame,results,button,name,sender, mm); + results.add(button); + }else{ + results.setLayout(new GridLayout(1,1)); + JLabel waiting = new JLabel("Waiting for the other players"); + results.add(waiting); + } + results.setVisible(true); + } + public JPanel getPanel(){ + return this.results; + } +} diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java new file mode 100644 index 0000000..eef3319 --- /dev/null +++ b/src/main/java/org/example/view/RoomView.java @@ -0,0 +1,65 @@ +package org.example.view; + +import org.example.controller.RoomController; +import org.example.model.Match; +import org.example.model.MatchChecker; +import org.example.model.Player; +import org.example.utils.Sender; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.Timer; + +public class RoomView { + private JPanel panel; + public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm){ + Timer t = new Timer(); + panel = new JPanel(); + if(match.getHost().name.equals(name)) { + panel.setLayout(new GridLayout(5,1)); + }else{ + panel.setLayout(new GridLayout(4,1)); + } + + JLabel matchName = new JLabel(match.getName()); + Font font = matchName.getFont(); + matchName.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + panel.add(matchName); + JLabel title = new JLabel("Players"); + panel.add(title); + JPanel content = new JPanel(); + JScrollPane scrollable = new JScrollPane(); + scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + content.setLayout(new GridLayout(match.getPlayers().size(),1)); + int i = 1; + for(Player p : match.getPlayers()){ + JPanel contentPl = new JPanel(); + JLabel el1 = new JLabel(i+". Name: "); + el1.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + contentPl.add(el1); + JLabel el2 = new JLabel(p.name); + contentPl.add(el2); + JSeparator sp = new JSeparator(); + contentPl.add(sp); + i++; + contentPl.setVisible(true); + content.add(contentPl); + } + scrollable.setViewportView(content); + panel.add(scrollable); + JButton start = null; + if(match.getHost().name.equals(name)){ + start = new JButton("Start match"); + panel.add(start); + } + JButton close = new JButton("Close match"); + panel.add(close); + + RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t); + panel.setVisible(true); + } + public JPanel getPanel(){ + return this.panel; + } +} diff --git a/src/main/java/org/example/view/WindowView.java b/src/main/java/org/example/view/WindowView.java new file mode 100644 index 0000000..c541585 --- /dev/null +++ b/src/main/java/org/example/view/WindowView.java @@ -0,0 +1,31 @@ +package org.example.view; + +import org.example.controller.WindowController; +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.utils.Sender; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +public class WindowView { + public WindowView(Sender sender){ + JFrame frame = new JFrame(); + frame.setTitle("Play game!"); + frame.setSize(new Dimension(600,500)); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + MatchChecker mm = new MatchChecker(); + + LoginView login = new LoginView(frame,sender,mm); + frame.add(login.getPanel()); + + WindowController wc = new WindowController(frame,mm,sender); + + frame.setVisible(true); + } +} + +//TODO: L'APP NON SI CHIUDE NELLA PAGINA DI LOGIN \ No newline at end of file From c4ceee8f5dcd92c422729eeae3ff9d78445ddcd7 Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Wed, 9 Nov 2022 23:36:01 +0100 Subject: [PATCH 02/55] Fix --- .idea/gradle.xml | 1 + .idea/misc.xml | 2 +- .idea/vcs.xml | 6 ++++++ build.gradle | 1 + src/main/java/org/example/Main.java | 2 +- .../org/example/controller/FriendlyModeController.java | 8 +++++--- .../org/example/controller/MatchCreatorController.java | 3 +-- src/main/java/org/example/controller/ModeController.java | 5 +---- src/main/java/org/example/controller/RoomController.java | 2 +- src/main/java/org/example/utils/Sender.java | 6 ++---- src/main/java/org/example/view/FriendlyModeView.java | 4 ++-- src/main/java/org/example/view/MatchCreatorView.java | 4 ++-- src/main/java/org/example/view/ModeView.java | 4 ---- 13 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 .idea/vcs.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml index ba1ec5c..611e7c8 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 3cae2d7..0245176 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' + implementation 'com.google.code.gson:gson:2.10' } test { diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index d016d2f..d8764b9 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -13,7 +13,7 @@ public class Main { public static void main(String[] args) { try{ - Socket socket = new Socket("localhost", PORT); + Socket socket = new Socket("192.168.1.12", PORT); WindowView w = new WindowView(new Sender(socket)); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 9fe0d86..3e76083 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -58,16 +58,18 @@ public void run() { } }; }; - t.scheduleAtFixedRate(tt,2000,2000); + t.scheduleAtFixedRate(tt,2000, 10000); create.addActionListener(e -> { + t.cancel(); frame.remove(panel); - frame.add(new MatchCreatorView(frame, name, matches, sender, mm,t).getPanel()); + frame.add(new MatchCreatorView(frame, name, matches, sender, mm).getPanel()); frame.validate(); }); back.addActionListener(e -> { + t.cancel(); frame.remove(panel); - frame.add(new ModeView(frame, name, sender, mm, t).getPanel()); + frame.add(new ModeView(frame, name, sender, mm).getPanel()); frame.validate(); }); } diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index bd444f1..c63b668 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -13,8 +13,7 @@ import java.util.Timer; public class MatchCreatorController { - public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, ArrayList matches, Sender sender, MatchChecker mm, Timer t){ - t.cancel(); + public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, ArrayList matches, Sender sender, MatchChecker mm){ create.addActionListener(e -> { String nameM = nameMatch.getText(); if(nameM != null && nameM.length() > 0){ diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index e279da6..8edaabb 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -16,10 +16,7 @@ public class ModeController { public ModeController(JFrame frame, JPanel mode, JButton jb, JRadioButton[] list, String name, Sender sender, MatchChecker mm){ this.controller(frame,mode,jb,list,name,sender,mm); } - public ModeController(JFrame frame, JPanel mode, JButton jb, JRadioButton[] list, String name, Sender sender, MatchChecker mm, Timer t){ - t.cancel(); - this.controller(frame,mode,jb,list,name,sender,mm); - } + private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] list, String name, Sender sender, MatchChecker mm){ jb.addActionListener(e -> { String value = null; diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index d09f214..7e8e6ca 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -37,7 +37,7 @@ public void run() { content.removeAll(); content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); int i = 1; - printerCicle(match,i,content); + printerCicle(mmm,i,content); content.setVisible(true); frame.revalidate(); frame.repaint(); diff --git a/src/main/java/org/example/utils/Sender.java b/src/main/java/org/example/utils/Sender.java index a9c1f19..71dd643 100644 --- a/src/main/java/org/example/utils/Sender.java +++ b/src/main/java/org/example/utils/Sender.java @@ -1,10 +1,9 @@ package org.example.utils; +import com.google.gson.Gson; import org.example.model.Message; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; +import java.io.*; import java.net.Socket; public class Sender { @@ -37,7 +36,6 @@ public Message sendAndRead(Message message){ System.out.println("Incoming message: "+result2); return result2; } - }catch(Exception e){ e.printStackTrace(); } diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index d0586da..0a2d61e 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -37,7 +37,7 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); JPanel content = new JPanel(); content.setLayout(new GridLayout((matches.size()),1)); - for(Match m : matches){ + /*for(Match m : matches){ JPanel content2 = new JPanel(); content2.setLayout(new GridLayout(5,1)); JLabel l1 = new JLabel("Match: "+m.getName()); @@ -62,7 +62,7 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen content2.add(js); content.add(content2); content2.setVisible(true); - } + }*/ content.setVisible(true); scrollable.setViewportView(content); diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index 53e4f03..be50563 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -13,7 +13,7 @@ public class MatchCreatorView { private JPanel panel; - public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm, Timer t){ + public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ panel = new JPanel(); panel.setBorder(new EmptyBorder(25,25,25,25)); panel.setLayout(new GridLayout(5,1)); @@ -31,7 +31,7 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen JButton back = new JButton("Go back"); panel.add(back); - MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,matches, sender, mm, t); + MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,matches, sender, mm); panel.setVisible(true); diff --git a/src/main/java/org/example/view/ModeView.java b/src/main/java/org/example/view/ModeView.java index 73b8435..13aebe3 100644 --- a/src/main/java/org/example/view/ModeView.java +++ b/src/main/java/org/example/view/ModeView.java @@ -14,10 +14,6 @@ public class ModeView { public ModeView(JFrame frame, String name, Sender sender, MatchChecker mm){ print(frame,name,sender,mm); } - public ModeView(JFrame frame, String name, Sender sender, MatchChecker mm, Timer t){ - t.cancel(); - print(frame,name,sender,mm); - } private void print(JFrame frame, String name, Sender sender, MatchChecker mm){ mode = new JPanel(); From 56ab09e40b26f3020bfad0645cc149d77cd2e3f2 Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Thu, 10 Nov 2022 17:13:55 +0100 Subject: [PATCH 03/55] Fix --- build.gradle | 1 - .../controller/FriendlyModeController.java | 84 +++++++++---------- .../controller/QuestionController.java | 10 +-- src/main/java/org/example/model/Match.java | 13 ++- src/main/java/org/example/model/Message.java | 1 + src/main/java/org/example/model/Player.java | 14 +++- src/main/java/org/example/model/Score.java | 10 +-- src/main/java/org/example/utils/Sender.java | 2 - .../org/example/view/FriendlyModeView.java | 33 +------- .../java/org/example/view/ResultsView.java | 50 ++++++++++- 10 files changed, 123 insertions(+), 95 deletions(-) diff --git a/build.gradle b/build.gradle index 0245176..3cae2d7 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,6 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' - implementation 'com.google.code.gson:gson:2.10' } test { diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 3e76083..93ac4b0 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -10,64 +10,56 @@ import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Timer; -import java.util.TimerTask; public class FriendlyModeController { - public FriendlyModeController(JFrame frame, JPanel panel, ArrayList matches, JButton create, JButton back, JPanel content, String name, Sender sender, MatchChecker mm, Timer t){ - - TimerTask tt = new TimerTask() { - @Override - public void run() { - Message responsef = sender.sendAndRead(new Message<>(name, "START","friendly")); - if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() instanceof ArrayList){ - ArrayList newMatches = (ArrayList) responsef.getMessage(); - content.removeAll(); - content.setLayout(new GridLayout((newMatches.size()),1)); - for(Match m : newMatches){ - JPanel content2 = new JPanel(); - content2.setLayout(new GridLayout(5,1)); - JLabel l1 = new JLabel("Match: "+m.getName()); - content2.add(l1); - JLabel l2 = new JLabel("Host: "+m.getHost()); - content2.add(l2); - JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); - content2.add(l3); - JButton enter = new JButton("Enter"); - content2.add(enter); - enter.addActionListener(e -> { - Message response = sender.sendAndRead(new Message<>(name, "GET_IN",m.getName())); - if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ - t.cancel(); - Match mGet = (Match) response.getMessage(); - frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); - frame.validate(); - } - }); - JSeparator js = new JSeparator(); - content2.add(js); - content.add(content2); - content2.setVisible(true); - } - content.setVisible(true); - frame.revalidate(); - frame.repaint(); + public FriendlyModeController(JFrame frame, JPanel panel, ArrayList matches, JButton create, JButton back, JButton reload, JPanel content, String name, Sender sender, MatchChecker mm){ + reload.addActionListener(e -> { + Message responsef = sender.sendAndRead(new Message<>(name, "START","friendly")); + if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() instanceof ArrayList){ + ArrayList newMatches = (ArrayList) responsef.getMessage(); + content.removeAll(); + content.setLayout(new GridLayout((newMatches.size()),1)); + for(Match m : newMatches){ + JPanel content2 = new JPanel(); + content2.setLayout(new GridLayout(5,1)); + JLabel l1 = new JLabel("Match: "+m.getName()); + content2.add(l1); + JLabel l2 = new JLabel("Host: "+m.getHost()); + content2.add(l2); + JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); + content2.add(l3); + JButton enter = new JButton("Enter"); + content2.add(enter); + enter.addActionListener(e2 -> { + Message response = sender.sendAndRead(new Message<>(name, "GET_IN",m.getName())); + if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ + Match mGet = (Match) response.getMessage(); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); + frame.validate(); + } + }); + JSeparator js = new JSeparator(); + content2.add(js); + content.add(content2); + content2.setVisible(true); } - }; - }; - t.scheduleAtFixedRate(tt,2000, 10000); - + content.setVisible(true); + frame.revalidate(); + frame.repaint(); + } + }); create.addActionListener(e -> { - t.cancel(); frame.remove(panel); frame.add(new MatchCreatorView(frame, name, matches, sender, mm).getPanel()); frame.validate(); }); back.addActionListener(e -> { - t.cancel(); frame.remove(panel); frame.add(new ModeView(frame, name, sender, mm).getPanel()); frame.validate(); diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index 7053905..7e19463 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -9,6 +9,7 @@ import org.example.view.ResultsView; import javax.swing.*; +import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; @@ -40,9 +41,6 @@ public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField frame.validate(); break; case "friendly": - System.out.println("Sono qui"); - //mm.setGoingOn(false); - //mm.setType(null); frame.remove(question); Score score2 = (Score) response.getMessage(); JPanel waiting = new ResultsView(frame,name,score2,sender, mm,true).getPanel(); @@ -53,14 +51,14 @@ public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField @Override public void run() { Message check = sender.sendAndRead(new Message<>(name, "IS_END", mm.getMatch())); - if(check != null && check.getMessage() != null && check.getMessage() instanceof String){ - if(check.getMessage().equals("Y")){ + if(check != null && check.getMessage() != null){ + if(check.getMessage() instanceof ArrayList){ t.cancel(); mm.setGoingOn(false); mm.setType(null); mm.setMatch(null); frame.remove(waiting); - frame.add(new ResultsView(frame,name,score2,sender, mm,false).getPanel()); + frame.add(new ResultsView(frame,name,(ArrayList) check.getMessage(),sender, mm,false).getPanel()); frame.validate(); } } diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java index a4f526e..ad1a6f0 100644 --- a/src/main/java/org/example/model/Match.java +++ b/src/main/java/org/example/model/Match.java @@ -14,7 +14,7 @@ public class Match implements Serializable { private String name; private Player host; - private final int SIZE = 4; + private int size; public Match(){ this.players = new ArrayList<>(); this.available = false ; @@ -22,6 +22,7 @@ public Match(){ this.id = Utility.randomIDGenerator(10000); this.name = ""+this.id; this.host = null; + this.size = 0; } public Match(String type, Player host){ this.players = new ArrayList<>(); @@ -30,14 +31,20 @@ public Match(String type, Player host){ this.id = Utility.randomIDGenerator(10000); this.name = ""+this.id; this.host = host; + this.size = 4; //DEFAULT SIZE } - public Match(String type, String name, Player host){ + public Match(String type, String name, Player host, int size){ this.players = new ArrayList<>(); this.available = false ; this.type = type; this.id = Utility.randomIDGenerator(10000); this.name = name; this.host = host; + this.size = size; + } + + public synchronized int getSize() { + return size; } public synchronized ArrayList getPlayers() { @@ -81,7 +88,7 @@ public synchronized void setHost(Player host) { } public synchronized void addPlayer(Player p){ - if(players.size() < SIZE) + if(players.size() < this.size) players.add(p); } diff --git a/src/main/java/org/example/model/Message.java b/src/main/java/org/example/model/Message.java index 19a5cf8..b9861dc 100644 --- a/src/main/java/org/example/model/Message.java +++ b/src/main/java/org/example/model/Message.java @@ -5,6 +5,7 @@ import java.io.Serializable; public class Message implements Messages, Serializable { + private static final long serialVersionUID = 1L; private String owner; private String event; private K message; diff --git a/src/main/java/org/example/model/Player.java b/src/main/java/org/example/model/Player.java index 3c6e36c..70a9f23 100644 --- a/src/main/java/org/example/model/Player.java +++ b/src/main/java/org/example/model/Player.java @@ -10,6 +10,7 @@ public class Player implements Serializable { public String name; public ArrayList questions; + public boolean hasFinished; public Score score; private int id; public Player(){ @@ -17,13 +18,24 @@ public Player(){ this.questions = new ArrayList<>(); this.score = null; this.id = Utility.randomIDGenerator(10000); + this.hasFinished = false; } public Player(String name){ this.name = name; this.questions = new ArrayList<>(); this.score = new Score(this.name); this.id = Utility.randomIDGenerator(10000); + this.hasFinished = false; } + + public boolean isHasFinished() { + return hasFinished; + } + + public void setHasFinished(boolean hasFinished) { + this.hasFinished = hasFinished; + } + public void setName(String name){ this.name = name; this.score = new Score(this.name); @@ -76,4 +88,4 @@ public String toString() { ", id=" + id + '}'; } -} +} \ No newline at end of file diff --git a/src/main/java/org/example/model/Score.java b/src/main/java/org/example/model/Score.java index 4385a13..9408da8 100644 --- a/src/main/java/org/example/model/Score.java +++ b/src/main/java/org/example/model/Score.java @@ -33,12 +33,12 @@ public void addQuestion(Question q){ if(q != null) this.questions.add(q); } + @Override public String toString() { - String answer = "**REPORT**\nName: "+this.name; - for(Question q : questions){ - answer = answer+"\n"+q.quest+"\nGiven: "+q.given+"\nExpected: "+q.answer+"\nIs correct?: "+q.correct+"\n******"; - } - return answer; + return "Score{" + + "questions=" + questions + + ", name='" + name + '\'' + + '}'; } } diff --git a/src/main/java/org/example/utils/Sender.java b/src/main/java/org/example/utils/Sender.java index 71dd643..8eff3b2 100644 --- a/src/main/java/org/example/utils/Sender.java +++ b/src/main/java/org/example/utils/Sender.java @@ -1,6 +1,4 @@ package org.example.utils; - -import com.google.gson.Gson; import org.example.model.Message; import java.io.*; diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index 0a2d61e..c23741c 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -20,10 +20,9 @@ public class FriendlyModeView { private JPanel panel; public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ - Timer t = new Timer(); panel = new JPanel(); panel.setBorder(new EmptyBorder(25,25,25,25)); - panel.setLayout(new GridLayout(7,1)); + panel.setLayout(new GridLayout(8,1)); JLabel title = new JLabel("Friendly mode"); Font font = title.getFont(); @@ -37,36 +36,12 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); JPanel content = new JPanel(); content.setLayout(new GridLayout((matches.size()),1)); - /*for(Match m : matches){ - JPanel content2 = new JPanel(); - content2.setLayout(new GridLayout(5,1)); - JLabel l1 = new JLabel("Match: "+m.getName()); - content2.add(l1); - JLabel l2 = new JLabel("Host: "+m.getHost()); - content2.add(l2); - JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); - content2.add(l3); - JButton enter = new JButton("Enter"); - enter.addActionListener(e -> { - Message response = sender.sendAndRead(new Message(name, "GET_IN",m.getName())); - if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ - t.cancel(); - Match mGet = (Match) response.getMessage(); - frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); - frame.validate(); - } - }); - content2.add(enter); - JSeparator js = new JSeparator(); - content2.add(js); - content.add(content2); - content2.setVisible(true); - }*/ content.setVisible(true); scrollable.setViewportView(content); panel.add(scrollable); + JButton reload = new JButton("Reload"); + panel.add(reload); JLabel or = new JLabel("or"); panel.add(or); JButton button = new JButton("Create a new match"); @@ -76,7 +51,7 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen JButton back = new JButton("Go Back"); panel.add(back); - FriendlyModeController fmc = new FriendlyModeController(frame, panel, matches, button, back, content, name, sender, mm, t); + FriendlyModeController fmc = new FriendlyModeController(frame, panel, matches, button, back, reload, content, name, sender, mm); content.setVisible(true); panel.setVisible(true); diff --git a/src/main/java/org/example/view/ResultsView.java b/src/main/java/org/example/view/ResultsView.java index f9d5c34..7bf5f01 100644 --- a/src/main/java/org/example/view/ResultsView.java +++ b/src/main/java/org/example/view/ResultsView.java @@ -9,7 +9,7 @@ import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; - +import java.util.ArrayList; public class ResultsView { private JPanel results; public ResultsView(JFrame frame, String name, Score score, Sender sender, MatchChecker mm, boolean casistic){ @@ -53,7 +53,53 @@ public ResultsView(JFrame frame, String name, Score score, Sender sender, MatchC } results.setVisible(true); } + public ResultsView(JFrame frame, String name, ArrayList scores, Sender sender, MatchChecker mm, boolean casistic){ + results = new JPanel(); + if(!casistic){ + results.setLayout(new GridLayout(3,1)); + results.setBorder(new EmptyBorder(25,25,25,25)); + JLabel scoreLabel = new JLabel("RESULTS"); + results.add(scoreLabel); + Font font = scoreLabel.getFont(); + scoreLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + JScrollPane scrollable = new JScrollPane(); + scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + JPanel content = new JPanel(); + content.setLayout(new GridLayout(scores.size(),1)); + for(Score score : scores){ + JPanel content2 = new JPanel(); + content2.setLayout(new GridLayout(score.questions.size()*5,1)); + JLabel namePlayer = new JLabel(score.name); + namePlayer.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + content2.add(namePlayer); + for(Question q : score.questions){ + JLabel el1 = new JLabel("Question: "+q.quest); + el1.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + content2.add(el1); + JLabel el2 = new JLabel("Expected: "+q.answer); + content2.add(el2); + JLabel el3 = new JLabel("Given: "+q.given); + content2.add(el3); + JLabel el4 = new JLabel("Is correct?: "+q.correct); + content2.add(el4); + } + JSeparator sp = new JSeparator(); + content2.add(sp); + content.add(content2); + } + scrollable.setViewportView(content); + results.add(scrollable); + JButton button = new JButton("Return to home"); + ResultsController rc = new ResultsController(frame,results,button,name,sender, mm); + results.add(button); + }else{ + results.setLayout(new GridLayout(1,1)); + JLabel waiting = new JLabel("Waiting for the other players"); + results.add(waiting); + } + results.setVisible(true); + } public JPanel getPanel(){ return this.results; } -} +} \ No newline at end of file From 0d4389e4e1b1abd0da39f5dc2ed696bf9896408c Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Thu, 10 Nov 2022 17:49:56 +0100 Subject: [PATCH 04/55] fix --- .../org/example/controller/MatchCreatorController.java | 10 ++++++---- src/main/java/org/example/model/Match.java | 2 +- src/main/java/org/example/view/MatchCreatorView.java | 9 +++++++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index c63b668..031cf3f 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -3,17 +3,16 @@ import org.example.model.Match; import org.example.model.MatchChecker; import org.example.model.Message; -import org.example.model.Player; import org.example.utils.Sender; import org.example.view.FriendlyModeView; import org.example.view.RoomView; import javax.swing.*; import java.util.ArrayList; -import java.util.Timer; +import java.util.Objects; public class MatchCreatorController { - public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, ArrayList matches, Sender sender, MatchChecker mm){ + public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, JSpinner maxSize, ArrayList matches, Sender sender, MatchChecker mm){ create.addActionListener(e -> { String nameM = nameMatch.getText(); if(nameM != null && nameM.length() > 0){ @@ -21,7 +20,10 @@ public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, if(response.getMessage() != null && response.getMessage().equals("Y")){ JOptionPane.showMessageDialog(frame,"Game match already used!","Warning!",JOptionPane.WARNING_MESSAGE); }else{ - Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM)); + Object[] o = new Object[2]; + o[0] = nameM; + o[1] = new Integer((int)maxSize.getValue()); + Message response2 = sender.sendAndRead(new Message(name, "CREATE",o)); if(response2.getMessage() != null){ Match match = (Match) response2.getMessage(); mm.setType("friendly"); diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java index ad1a6f0..b8f2d14 100644 --- a/src/main/java/org/example/model/Match.java +++ b/src/main/java/org/example/model/Match.java @@ -31,7 +31,7 @@ public Match(String type, Player host){ this.id = Utility.randomIDGenerator(10000); this.name = ""+this.id; this.host = host; - this.size = 4; //DEFAULT SIZE + this.size = 1; //DEFAULT SIZE } public Match(String type, String name, Player host, int size){ this.players = new ArrayList<>(); diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index be50563..5f02b03 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -16,7 +16,7 @@ public class MatchCreatorView { public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ panel = new JPanel(); panel.setBorder(new EmptyBorder(25,25,25,25)); - panel.setLayout(new GridLayout(5,1)); + panel.setLayout(new GridLayout(7,1)); JLabel title = new JLabel("Create a new match"); Font font = title.getFont(); title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); @@ -25,13 +25,18 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen panel.add(description); JTextField nameMatch = new JTextField(20); panel.add(nameMatch); + JLabel description2 = new JLabel("Maximum number of people allowed: "); + panel.add(description2); + SpinnerModel value = new SpinnerNumberModel(4,1,10,1); + JSpinner maxSize = new JSpinner(value); + panel.add(maxSize); JButton create = new JButton("Create"); panel.add(create); JButton back = new JButton("Go back"); panel.add(back); - MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,matches, sender, mm); + MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,matches, sender, mm); panel.setVisible(true); From 3ca14c5f41270dc2623b73f97b8335adeed6f04a Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Thu, 10 Nov 2022 21:41:17 +0100 Subject: [PATCH 05/55] Working friendly but without timer --- src/main/java/org/example/Main.java | 2 +- .../java/org/example/controller/FriendlyModeController.java | 2 ++ .../java/org/example/controller/MatchCreatorController.java | 5 +---- src/main/java/org/example/view/RoomView.java | 6 ++++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index d8764b9..14fe700 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -8,7 +8,7 @@ import java.net.Socket; public class Main { - private static final int PORT = 9000; + private static final int PORT = 9001; private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) { diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 93ac4b0..486f37c 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -42,6 +42,8 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match frame.remove(panel); frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); frame.validate(); + }else{ + JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); } }); JSeparator js = new JSeparator(); diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index 031cf3f..da7b17b 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -20,10 +20,7 @@ public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, if(response.getMessage() != null && response.getMessage().equals("Y")){ JOptionPane.showMessageDialog(frame,"Game match already used!","Warning!",JOptionPane.WARNING_MESSAGE); }else{ - Object[] o = new Object[2]; - o[0] = nameM; - o[1] = new Integer((int)maxSize.getValue()); - Message response2 = sender.sendAndRead(new Message(name, "CREATE",o)); + Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM+""+maxSize.getValue())); if(response2.getMessage() != null){ Match match = (Match) response2.getMessage(); mm.setType("friendly"); diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index eef3319..daf7407 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -17,9 +17,9 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match Timer t = new Timer(); panel = new JPanel(); if(match.getHost().name.equals(name)) { - panel.setLayout(new GridLayout(5,1)); + panel.setLayout(new GridLayout(6,1)); }else{ - panel.setLayout(new GridLayout(4,1)); + panel.setLayout(new GridLayout(5,1)); } JLabel matchName = new JLabel(match.getName()); @@ -28,6 +28,8 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match panel.add(matchName); JLabel title = new JLabel("Players"); panel.add(title); + JLabel description = new JLabel("Max size: "+match.getSize()); + panel.add(description); JPanel content = new JPanel(); JScrollPane scrollable = new JScrollPane(); scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); From 521631e18cf1a26df780c1177a801838656fc1ce Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Thu, 10 Nov 2022 22:07:32 +0100 Subject: [PATCH 06/55] Fix --- .../org/example/view/FriendlyModeView.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index c23741c..cd53c6d 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -38,7 +38,7 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen content.setLayout(new GridLayout((matches.size()),1)); content.setVisible(true); scrollable.setViewportView(content); - + print(matches, sender, name, frame, panel, content, mm); panel.add(scrollable); JButton reload = new JButton("Reload"); panel.add(reload); @@ -57,6 +57,35 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen panel.setVisible(true); } + private void print(ArrayList matches, Sender sender, String name, JFrame frame, JPanel panel, JPanel content, MatchChecker mm){ + for(Match m : matches){ + JPanel content2 = new JPanel(); + content2.setLayout(new GridLayout(5,1)); + JLabel l1 = new JLabel("Match: "+m.getName()); + content2.add(l1); + JLabel l2 = new JLabel("Host: "+m.getHost()); + content2.add(l2); + JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); + content2.add(l3); + JButton enter = new JButton("Enter"); + content2.add(enter); + enter.addActionListener(e2 -> { + Message response = sender.sendAndRead(new Message<>(name, "GET_IN",m.getName())); + if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ + Match mGet = (Match) response.getMessage(); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); + frame.validate(); + }else{ + JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); + } + }); + JSeparator js = new JSeparator(); + content2.add(js); + content.add(content2); + content2.setVisible(true); + } + } public JPanel getPanel(){ return this.panel; } From 1867463efa2990e5e60331cf84d1123d65ca4658 Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Thu, 10 Nov 2022 22:17:36 +0100 Subject: [PATCH 07/55] test --- src/main/java/org/example/model/Player.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/org/example/model/Player.java b/src/main/java/org/example/model/Player.java index 70a9f23..6d47fac 100644 --- a/src/main/java/org/example/model/Player.java +++ b/src/main/java/org/example/model/Player.java @@ -13,12 +13,14 @@ public class Player implements Serializable { public boolean hasFinished; public Score score; private int id; + private boolean ready; public Player(){ this.name = null; this.questions = new ArrayList<>(); this.score = null; this.id = Utility.randomIDGenerator(10000); this.hasFinished = false; + this.ready = false; } public Player(String name){ this.name = name; @@ -26,6 +28,15 @@ public Player(String name){ this.score = new Score(this.name); this.id = Utility.randomIDGenerator(10000); this.hasFinished = false; + this.ready = false; + } + + public boolean isReady() { + return ready; + } + + public void setReady(boolean ready) { + this.ready = ready; } public boolean isHasFinished() { From 0d751ae497f234c296304b61b2c93b4770e5a318 Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Thu, 10 Nov 2022 22:24:03 +0100 Subject: [PATCH 08/55] updated todo --- src/main/java/org/example/Main.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index 14fe700..e766ea6 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -7,6 +7,12 @@ import java.io.InputStreamReader; import java.net.Socket; +//TODO: GESTIRE PRONTO NON PRONTO SU INTERFACCIA FRIENDLY, SE TUTTI I GIOCATORI NEL MATCH SONO READY FAR PARTIRE TIMER START DI TIPO X SECONDI +//TODO: IMPLEMENTARE TIMER MASSIMO PARTITA FRIENDLY +//TODO: IMPLEMENTARE TOURNAMENT MODE +//TODO: IMPLEMENTARE TEST CASES SU SOCKET E VEDERE CHE RISPONDANO QUANTO CI SI ASPETTI + + public class Main { private static final int PORT = 9001; private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); From 817a1e88b896d4ad86da5a3594dea5260f4241bf Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Mon, 14 Nov 2022 13:43:43 +0100 Subject: [PATCH 09/55] Working on tiemr --- src/main/java/org/example/Main.java | 2 +- .../example/controller/AlertController.java | 2 +- .../example/controller/ModeController.java | 2 +- .../controller/QuestionController.java | 89 ++++++++++++------- .../example/controller/RoomController.java | 5 +- src/main/java/org/example/model/Score.java | 11 +++ .../java/org/example/view/QuestionView.java | 12 ++- .../java/org/example/view/ResultsView.java | 4 +- 8 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index e766ea6..97b49de 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -19,7 +19,7 @@ public class Main { public static void main(String[] args) { try{ - Socket socket = new Socket("192.168.1.12", PORT); + Socket socket = new Socket("localhost", PORT); WindowView w = new WindowView(new Sender(socket)); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/org/example/controller/AlertController.java b/src/main/java/org/example/controller/AlertController.java index 319dfe9..19ea454 100644 --- a/src/main/java/org/example/controller/AlertController.java +++ b/src/main/java/org/example/controller/AlertController.java @@ -21,7 +21,7 @@ public AlertController(JFrame frame, JPanel alert, String name, String type, JBu mm.setQuestion((Question) response.getMessage()); System.out.println(mm); frame.remove(alert); - frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm).getPanel()); + frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null).getPanel()); frame.validate(); } }); diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index 8edaabb..6b81dd0 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -36,7 +36,7 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li Message response = sender.sendAndRead(new Message<>(name, "START","practice")); Question q = (Question) response.getMessage(); frame.remove(mode); - frame.add(new QuestionView(frame,name,q,sender, mm).getPanel()); + frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null).getPanel()); frame.validate(); } break; diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index 7e19463..a8cb3d6 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -12,9 +12,33 @@ import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; public class QuestionController { - public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm){ + public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds){ + if(!lecit){ + TimerTask task = new TimerTask() { + public int i = 0; + @Override + public void run() { + i++; + seconds.getAndAdd(1); + System.out.println("Seconds passed: "+i); + if(i > 60){ + tQuiz.cancel(); //Delete timer if test is taking more than n/60 minutes + System.out.println("Timer ended!"); + String text = answer.getText(); + q.checkAnswer(text); + Message response = sender.sendAndRead(new Message<>(name, "END_TIMER",q)); + if(response != null && response.getEvent().equals("END_TIMER") && response.getMessage() != null){ + printScoresFriendly(frame, question, response, name, sender, mm); + } + //TODO: Ho un dubbio, mm sotto lo setto solo su practice e non su friendly, controllare se ci sono bug + } + } + }; + tQuiz.schedule(task, 1500, 1000); + } jb.addActionListener(e -> { if(answer.getText() != null && answer.getText().length() > 0){ //TODO: DOVREI TOGLIERE TUTTI GLI SPAZI VUOTI E CONFRONTARE LA STRINGA SOLO A QUEL PUNTO String text = answer.getText(); @@ -22,14 +46,12 @@ public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); switch (response.getEvent().toLowerCase()){ case "game": - System.out.println(mm); frame.remove(question); Question newQuestion = (Question) response.getMessage(); - frame.add(new QuestionView(frame,name,newQuestion,sender, mm).getPanel()); + frame.add(new QuestionView(frame,name,newQuestion,sender, mm, true, tQuiz, seconds).getPanel()); frame.validate(); break; case "end": - System.out.println(mm); switch (mm.getType()){ case "practice": mm.setGoingOn(false); @@ -41,37 +63,42 @@ public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField frame.validate(); break; case "friendly": - frame.remove(question); - Score score2 = (Score) response.getMessage(); - JPanel waiting = new ResultsView(frame,name,score2,sender, mm,true).getPanel(); - frame.add(waiting); - frame.validate(); - Timer t = new Timer(); - TimerTask tt = new TimerTask() { - @Override - public void run() { - Message check = sender.sendAndRead(new Message<>(name, "IS_END", mm.getMatch())); - if(check != null && check.getMessage() != null){ - if(check.getMessage() instanceof ArrayList){ - t.cancel(); - mm.setGoingOn(false); - mm.setType(null); - mm.setMatch(null); - frame.remove(waiting); - frame.add(new ResultsView(frame,name,(ArrayList) check.getMessage(),sender, mm,false).getPanel()); - frame.validate(); - } - } - } - }; - t.scheduleAtFixedRate(tt,1000,1000); - //TODO: DOVREI CONTROLLARE CHE TUTTI ABBIANO TERMINATO, QUINDI FACCIO UN POLLING, SE HANNO TERMINATO - //TODO: MOSTRO LA VIEW DEI RISULTATI E SETTO MM.SETGOINGON A FALSE E SETTYPE A NULL - + if(tQuiz != null) + tQuiz.cancel(); + printScoresFriendly(frame, question, response, name, sender, mm); break; } } } }); + + + } + + private void printScoresFriendly(JFrame frame, JPanel question, Message response, String name, Sender sender, MatchChecker mm){ + frame.remove(question); + Score score2 = (Score) response.getMessage(); + JPanel waiting = new ResultsView(frame,name,score2,sender, mm,true).getPanel(); + frame.add(waiting); + frame.validate(); + Timer t = new Timer(); + TimerTask tt = new TimerTask() { + @Override + public void run() { + Message check = sender.sendAndRead(new Message<>(name, "IS_END", mm.getMatch())); + if(check != null && check.getMessage() != null){ + if(check.getMessage() instanceof ArrayList){ + t.cancel(); + mm.setGoingOn(false); + mm.setType(null); + mm.setMatch(null); + frame.remove(waiting); + frame.add(new ResultsView(frame,name,(ArrayList) check.getMessage(),sender, mm,false).getPanel()); + frame.validate(); + } + } + } + }; + t.scheduleAtFixedRate(tt,1000,1000); } } diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 7e8e6ca..953beeb 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; public class RoomController { public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t){ @@ -27,10 +28,12 @@ public void run() { t.cancel(); Message responseD = sender.sendAndRead(new Message<>(name, "DROP_QUESTION",match.getName())); if(responseD != null && responseD.getMessage() != null && responseD.getMessage() instanceof Question){ + Timer tQuiz = new Timer(); + AtomicInteger seconds = new AtomicInteger(0); mm.setGoingOn(true); mm.setMatch(match.getName()); frame.remove(panel); - frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm).getPanel()); + frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds).getPanel()); frame.validate(); } }else{ diff --git a/src/main/java/org/example/model/Score.java b/src/main/java/org/example/model/Score.java index 9408da8..507b068 100644 --- a/src/main/java/org/example/model/Score.java +++ b/src/main/java/org/example/model/Score.java @@ -6,10 +6,21 @@ public class Score implements Serializable { public ArrayList questions; public String name; + public boolean completed; public Score(String name){ this.name = name; questions = new ArrayList<>(); + this.completed = false; } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + public int getNumberOfCorrectAnswers(){ int i = 0; for(Question q : questions){ diff --git a/src/main/java/org/example/view/QuestionView.java b/src/main/java/org/example/view/QuestionView.java index 0503844..281ed84 100644 --- a/src/main/java/org/example/view/QuestionView.java +++ b/src/main/java/org/example/view/QuestionView.java @@ -8,14 +8,18 @@ import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; public class QuestionView { JPanel question; - public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm){ + public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds){ question = new JPanel(); - question.setLayout(new GridLayout(4,1)); + question.setLayout(new GridLayout(5,1)); question.setBorder(new EmptyBorder(25,25,25,25)); - + JLabel timeLabel = new JLabel(); + question.add(timeLabel); JLabel questionLabel = new JLabel("Question: "); question.add(questionLabel); @@ -31,7 +35,7 @@ public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchC JButton sendButton = new JButton("Send answer"); question.add(sendButton); - QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm); + QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds); mm.setQuestion(q); question.setVisible(true); } diff --git a/src/main/java/org/example/view/ResultsView.java b/src/main/java/org/example/view/ResultsView.java index 7bf5f01..63ad490 100644 --- a/src/main/java/org/example/view/ResultsView.java +++ b/src/main/java/org/example/view/ResultsView.java @@ -68,10 +68,12 @@ public ResultsView(JFrame frame, String name, ArrayList scores, Sender se content.setLayout(new GridLayout(scores.size(),1)); for(Score score : scores){ JPanel content2 = new JPanel(); - content2.setLayout(new GridLayout(score.questions.size()*5,1)); + content2.setLayout(new GridLayout(score.questions.size()*7,1)); JLabel namePlayer = new JLabel(score.name); namePlayer.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); content2.add(namePlayer); + JLabel completed = new JLabel("Completed: "+score.isCompleted()); + content2.add(completed); for(Question q : score.questions){ JLabel el1 = new JLabel("Question: "+q.quest); el1.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); From 2c7cfbe5221fcc6e06250656211e90aa498b9e6c Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Mon, 14 Nov 2022 17:43:42 +0100 Subject: [PATCH 10/55] Implemented timer function --- .../example/controller/AlertController.java | 2 +- .../example/controller/ModeController.java | 2 +- .../controller/QuestionController.java | 21 ++++++++++--------- .../example/controller/RoomController.java | 2 +- .../java/org/example/view/QuestionView.java | 11 +++++----- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/example/controller/AlertController.java b/src/main/java/org/example/controller/AlertController.java index 19ea454..d7fc18b 100644 --- a/src/main/java/org/example/controller/AlertController.java +++ b/src/main/java/org/example/controller/AlertController.java @@ -21,7 +21,7 @@ public AlertController(JFrame frame, JPanel alert, String name, String type, JBu mm.setQuestion((Question) response.getMessage()); System.out.println(mm); frame.remove(alert); - frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null).getPanel()); + frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null, null).getPanel()); frame.validate(); } }); diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index 6b81dd0..2ed12b8 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -36,7 +36,7 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li Message response = sender.sendAndRead(new Message<>(name, "START","practice")); Question q = (Question) response.getMessage(); frame.remove(mode); - frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null).getPanel()); + frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null, null).getPanel()); frame.validate(); } break; diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index a8cb3d6..8884f1b 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -9,31 +9,32 @@ import org.example.view.ResultsView; import javax.swing.*; +import java.awt.*; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicInteger; public class QuestionController { - public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds){ + public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel label){ if(!lecit){ TimerTask task = new TimerTask() { - public int i = 0; + public int i = seconds.get(); @Override public void run() { i++; + int minutes = i / 60; + int secondss = i % 60; seconds.getAndAdd(1); - System.out.println("Seconds passed: "+i); - if(i > 60){ + if(secondss < 10) + label.setText("Time passed in minutes: "+minutes+":"+"0"+secondss); + else label.setText("Time passed in minutes: "+minutes+":"+secondss); + if(i > 125){ tQuiz.cancel(); //Delete timer if test is taking more than n/60 minutes - System.out.println("Timer ended!"); - String text = answer.getText(); - q.checkAnswer(text); - Message response = sender.sendAndRead(new Message<>(name, "END_TIMER",q)); + Message response = sender.sendAndRead(new Message<>(name, "END_TIMER")); if(response != null && response.getEvent().equals("END_TIMER") && response.getMessage() != null){ printScoresFriendly(frame, question, response, name, sender, mm); } - //TODO: Ho un dubbio, mm sotto lo setto solo su practice e non su friendly, controllare se ci sono bug } } }; @@ -48,7 +49,7 @@ public void run() { case "game": frame.remove(question); Question newQuestion = (Question) response.getMessage(); - frame.add(new QuestionView(frame,name,newQuestion,sender, mm, true, tQuiz, seconds).getPanel()); + frame.add(new QuestionView(frame,name,newQuestion,sender, mm, true, tQuiz, seconds, label).getPanel()); frame.validate(); break; case "end": diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 953beeb..9be3242 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -33,7 +33,7 @@ public void run() { mm.setGoingOn(true); mm.setMatch(match.getName()); frame.remove(panel); - frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds).getPanel()); + frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel()).getPanel()); frame.validate(); } }else{ diff --git a/src/main/java/org/example/view/QuestionView.java b/src/main/java/org/example/view/QuestionView.java index 281ed84..53a817d 100644 --- a/src/main/java/org/example/view/QuestionView.java +++ b/src/main/java/org/example/view/QuestionView.java @@ -14,12 +14,12 @@ public class QuestionView { JPanel question; - public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds){ + public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel timeLabel){ question = new JPanel(); question.setLayout(new GridLayout(5,1)); question.setBorder(new EmptyBorder(25,25,25,25)); - JLabel timeLabel = new JLabel(); - question.add(timeLabel); + if(timeLabel != null) + question.add(timeLabel); JLabel questionLabel = new JLabel("Question: "); question.add(questionLabel); @@ -34,10 +34,11 @@ public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchC JButton sendButton = new JButton("Send answer"); question.add(sendButton); - - QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds); mm.setQuestion(q); question.setVisible(true); + QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds, timeLabel); + + } public JPanel getPanel(){ From 573533c25fccad5a2106e7122fa2e70ed07a096d Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Mon, 14 Nov 2022 21:58:51 +0100 Subject: [PATCH 11/55] Working on readyness --- src/main/java/org/example/Main.java | 4 ++-- .../example/controller/FriendlyModeController.java | 2 +- .../example/controller/MatchCreatorController.java | 2 +- .../org/example/controller/QuestionController.java | 2 +- .../java/org/example/controller/RoomController.java | 12 ++++++++++-- src/main/java/org/example/view/FriendlyModeView.java | 2 +- src/main/java/org/example/view/RoomView.java | 10 +++++++--- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index 97b49de..b4b6b51 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -14,12 +14,12 @@ public class Main { - private static final int PORT = 9001; + private static final int PORT = 9000; private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) { try{ - Socket socket = new Socket("localhost", PORT); + Socket socket = new Socket("192.168.1.27", PORT); WindowView w = new WindowView(new Sender(socket)); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 486f37c..1426344 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -40,7 +40,7 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index da7b17b..8ecc2a5 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -26,7 +26,7 @@ public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, mm.setType("friendly"); mm.setGoingOn(true); frame.remove(panel); - frame.add(new RoomView(frame, name, matches,match, sender, mm).getPanel()); + frame.add(new RoomView(frame, name, matches,match, sender, mm,false).getPanel()); frame.validate(); } } diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index 8884f1b..03fab77 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -29,7 +29,7 @@ public void run() { if(secondss < 10) label.setText("Time passed in minutes: "+minutes+":"+"0"+secondss); else label.setText("Time passed in minutes: "+minutes+":"+secondss); - if(i > 125){ + if(i > 10){ tQuiz.cancel(); //Delete timer if test is taking more than n/60 minutes Message response = sender.sendAndRead(new Message<>(name, "END_TIMER")); if(response != null && response.getEvent().equals("END_TIMER") && response.getMessage() != null){ diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 9be3242..942044c 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -4,6 +4,7 @@ import org.example.utils.Sender; import org.example.view.FriendlyModeView; import org.example.view.QuestionView; +import org.example.view.RoomView; import javax.swing.*; import java.awt.*; @@ -13,7 +14,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } @@ -81,7 +82,14 @@ public void run() { }); if(start != null){ start.addActionListener(e -> { - sender.send(new Message(name, "FRIENDLY_START",match.getName())); + if(!ready){ + t.cancel(); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches, match, sender, mm, true).getPanel()); + frame.validate(); + }else{ + sender.send(new Message(name, "FRIENDLY_START",match.getName())); + } }); } } diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index cd53c6d..3567495 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -74,7 +74,7 @@ private void print(ArrayList matches, Sender sender, String name, JFrame if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index daf7407..cd1841b 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -13,7 +13,7 @@ public class RoomView { private JPanel panel; - public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm){ + public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready){ Timer t = new Timer(); panel = new JPanel(); if(match.getHost().name.equals(name)) { @@ -51,14 +51,18 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match scrollable.setViewportView(content); panel.add(scrollable); JButton start = null; - if(match.getHost().name.equals(name)){ + if(!ready){ + start = new JButton("Ready"); + panel.add(start); + } + if(match.getHost().name.equals(name) && ready){ start = new JButton("Start match"); panel.add(start); } JButton close = new JButton("Close match"); panel.add(close); - RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t); + RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready); panel.setVisible(true); } public JPanel getPanel(){ From 69a0504f181a9f4f91975fad2a2d56c8fab8f81a Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Mon, 14 Nov 2022 23:13:25 +0100 Subject: [PATCH 12/55] Working on readyness --- .idea/misc.xml | 2 +- src/main/java/org/example/controller/RoomController.java | 5 ++++- src/main/java/org/example/model/Match.java | 1 + src/main/java/org/example/model/Player.java | 1 + src/main/java/org/example/utils/Sender.java | 1 + src/main/java/org/example/view/RoomView.java | 2 +- 6 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5821b2f..c049206 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,5 +4,5 @@ - + \ No newline at end of file diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 942044c..a7e1bf9 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -80,9 +80,11 @@ public void run() { frame.validate(); } }); + if(start != null){ start.addActionListener(e -> { if(!ready){ + sender.send(new Message(name, "UPDATE_READY", true)); t.cancel(); frame.remove(panel); frame.add(new RoomView(frame, name, matches, match, sender, mm, true).getPanel()); @@ -90,6 +92,7 @@ public void run() { }else{ sender.send(new Message(name, "FRIENDLY_START",match.getName())); } + }); } } @@ -100,7 +103,7 @@ private void printerCicle(Match match, int i, JPanel content){ JLabel el1 = new JLabel(i+". Name: "); el1.setFont(new Font(el1.getFont().getFontName(),Font.BOLD,el1.getFont().getSize())); contentPl.add(el1); - JLabel el2 = new JLabel(p.name); + JLabel el2 = new JLabel(p.name+ " - Ready: "+p.isReady()); contentPl.add(el2); JSeparator sp = new JSeparator(); contentPl.add(sp); diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java index b8f2d14..ef63fd4 100644 --- a/src/main/java/org/example/model/Match.java +++ b/src/main/java/org/example/model/Match.java @@ -7,6 +7,7 @@ import java.util.Objects; public class Match implements Serializable { + private static final long serialVersionUID = 2L; private ArrayList players; private boolean available; //Tells if the match can be join by other users private String type; //Practice/Tournament/Friendly diff --git a/src/main/java/org/example/model/Player.java b/src/main/java/org/example/model/Player.java index 6d47fac..cf720bd 100644 --- a/src/main/java/org/example/model/Player.java +++ b/src/main/java/org/example/model/Player.java @@ -7,6 +7,7 @@ import java.util.Objects; public class Player implements Serializable { + private static final long serialVersionUID = 3L; public String name; public ArrayList questions; diff --git a/src/main/java/org/example/utils/Sender.java b/src/main/java/org/example/utils/Sender.java index 8eff3b2..c2ad3ab 100644 --- a/src/main/java/org/example/utils/Sender.java +++ b/src/main/java/org/example/utils/Sender.java @@ -30,6 +30,7 @@ public Message sendAndRead(Message message){ result = this.in.readObject(); Message result2; if(result != null){ + System.out.println(result); result2 = (Message) result; System.out.println("Incoming message: "+result2); return result2; diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index cd1841b..edf7bc7 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -40,7 +40,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match JLabel el1 = new JLabel(i+". Name: "); el1.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); contentPl.add(el1); - JLabel el2 = new JLabel(p.name); + JLabel el2 = new JLabel(p.name+ " - Ready: "+p.isReady()); contentPl.add(el2); JSeparator sp = new JSeparator(); contentPl.add(sp); From 15ddd217807160f4b16ab1e97fef24a806143827 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Tue, 15 Nov 2022 11:48:47 +0100 Subject: [PATCH 13/55] Readyness should now works --- src/main/java/org/example/Main.java | 2 +- .../example/controller/RoomController.java | 45 ++++++++++++++----- src/main/java/org/example/view/RoomView.java | 7 ++- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index b4b6b51..bb9b979 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -19,7 +19,7 @@ public class Main { public static void main(String[] args) { try{ - Socket socket = new Socket("192.168.1.27", PORT); + Socket socket = new Socket("localhost", PORT); WindowView w = new WindowView(new Sender(socket)); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index a7e1bf9..c201ee5 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -8,9 +8,12 @@ import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; public class RoomController { @@ -18,7 +21,9 @@ public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, J if(!match.getHost().name.equals(name)){ back.setText("Exit"); } + System.out.println(match); TimerTask tt = new TimerTask() { + AtomicBoolean startAdded = new AtomicBoolean(false); @Override public void run() { Message responsef = sender.sendAndRead(new Message<>(name, "UPDATE_PLAYERS",match.getName())); @@ -41,7 +46,17 @@ public void run() { content.removeAll(); content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); int i = 1; - printerCicle(mmm,i,content); + int readyness = printerCicle(mmm,i,content, 0); + if(readyness == mmm.getPlayers().size()){ + if(match.getHost().name.equals(name) && ready && !startAdded.get()){ + startAdded.set(true); + JButton startNew = new JButton("Start match"); + startNew.addActionListener(e -> { + adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm); + }); + panel.add(startNew); + } + } content.setVisible(true); frame.revalidate(); frame.repaint(); @@ -83,21 +98,12 @@ public void run() { if(start != null){ start.addActionListener(e -> { - if(!ready){ - sender.send(new Message(name, "UPDATE_READY", true)); - t.cancel(); - frame.remove(panel); - frame.add(new RoomView(frame, name, matches, match, sender, mm, true).getPanel()); - frame.validate(); - }else{ - sender.send(new Message(name, "FRIENDLY_START",match.getName())); - } - + adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm); }); } } - private void printerCicle(Match match, int i, JPanel content){ + private int printerCicle(Match match, int i, JPanel content, int readyness){ for(Player p : match.getPlayers()){ JPanel contentPl = new JPanel(); JLabel el1 = new JLabel(i+". Name: "); @@ -108,8 +114,23 @@ private void printerCicle(Match match, int i, JPanel content){ JSeparator sp = new JSeparator(); contentPl.add(sp); i++; + if(p.isReady()) + readyness++; contentPl.setVisible(true); content.add(contentPl); } + return readyness; + } + + private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm){ + if(!ready){ + t.cancel(); + sender.send(new Message(name, "UPDATE_READY", true)); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches, match, sender, mm, true).getPanel()); + frame.validate(); + }else{ + sender.send(new Message(name, "FRIENDLY_START",match.getName())); + } } } diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index edf7bc7..eacdbe4 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -16,7 +16,7 @@ public class RoomView { public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready){ Timer t = new Timer(); panel = new JPanel(); - if(match.getHost().name.equals(name)) { + if(match.getHost().name.equals(name) || !ready) { panel.setLayout(new GridLayout(6,1)); }else{ panel.setLayout(new GridLayout(5,1)); @@ -35,6 +35,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); content.setLayout(new GridLayout(match.getPlayers().size(),1)); int i = 1; + int readyness = 0; for(Player p : match.getPlayers()){ JPanel contentPl = new JPanel(); JLabel el1 = new JLabel(i+". Name: "); @@ -45,6 +46,8 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match JSeparator sp = new JSeparator(); contentPl.add(sp); i++; + if(p.isReady()) + readyness++; contentPl.setVisible(true); content.add(contentPl); } @@ -55,7 +58,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match start = new JButton("Ready"); panel.add(start); } - if(match.getHost().name.equals(name) && ready){ + if(match.getHost().name.equals(name) && ready && readyness == match.getPlayers().size()){ start = new JButton("Start match"); panel.add(start); } From 127341205ed55abc60ac20aaeab4924adc5a36f9 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Tue, 15 Nov 2022 12:19:03 +0100 Subject: [PATCH 14/55] Added timer when all people are ready --- .../org/example/controller/RoomController.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index c201ee5..2bb0c95 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -49,6 +49,21 @@ public void run() { int readyness = printerCicle(mmm,i,content, 0); if(readyness == mmm.getPlayers().size()){ if(match.getHost().name.equals(name) && ready && !startAdded.get()){ + //TODO: Aggiungere timer di 5 secondi in cui al suo termine viene avviato il match se l'host non preme start + Timer t2 = new Timer(); + TimerTask tt2 = new TimerTask() { + int i = 0; + @Override + public void run() { + i++; + System.out.println(i); + if(i > 5){ + t2.cancel(); + adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm); + } + } + }; + t2.schedule(tt2, 400,1000); startAdded.set(true); JButton startNew = new JButton("Start match"); startNew.addActionListener(e -> { From f24b5bbe8a4c892ba16aac2bf9e03fdca0235839 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Tue, 15 Nov 2022 13:00:14 +0100 Subject: [PATCH 15/55] Fix on readyness timer --- .../java/org/example/controller/RoomController.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 2bb0c95..c4cf62b 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -24,6 +24,8 @@ public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, J System.out.println(match); TimerTask tt = new TimerTask() { AtomicBoolean startAdded = new AtomicBoolean(false); + AtomicInteger timerStart = new AtomicInteger(0); + Timer t2 = new Timer(); @Override public void run() { Message responsef = sender.sendAndRead(new Message<>(name, "UPDATE_PLAYERS",match.getName())); @@ -32,6 +34,7 @@ public void run() { if(mmm.getPlayers().size() > 0){ if(!mmm.isAvailable()){ t.cancel(); + t2.cancel(); Message responseD = sender.sendAndRead(new Message<>(name, "DROP_QUESTION",match.getName())); if(responseD != null && responseD.getMessage() != null && responseD.getMessage() instanceof Question){ Timer tQuiz = new Timer(); @@ -49,15 +52,11 @@ public void run() { int readyness = printerCicle(mmm,i,content, 0); if(readyness == mmm.getPlayers().size()){ if(match.getHost().name.equals(name) && ready && !startAdded.get()){ - //TODO: Aggiungere timer di 5 secondi in cui al suo termine viene avviato il match se l'host non preme start - Timer t2 = new Timer(); TimerTask tt2 = new TimerTask() { - int i = 0; @Override public void run() { - i++; - System.out.println(i); - if(i > 5){ + int val = timerStart.addAndGet(1); + if(val > 5){ t2.cancel(); adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm); } @@ -71,6 +70,8 @@ public void run() { }); panel.add(startNew); } + }else{ + timerStart.set(0); } content.setVisible(true); frame.revalidate(); From e228bb56993a02edfece6f8289714c853aedfe34 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Wed, 16 Nov 2022 15:49:47 +0100 Subject: [PATCH 16/55] Fix --- src/main/java/org/example/controller/RoomController.java | 7 ++++--- src/main/java/org/example/model/Match.java | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index c4cf62b..e1041da 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -51,14 +51,15 @@ public void run() { int i = 1; int readyness = printerCicle(mmm,i,content, 0); if(readyness == mmm.getPlayers().size()){ - if(match.getHost().name.equals(name) && ready && !startAdded.get()){ + if(mmm.getHost().name.equals(name) && ready && !startAdded.get()){ + panel.setLayout(new GridLayout(6,1)); TimerTask tt2 = new TimerTask() { @Override public void run() { int val = timerStart.addAndGet(1); if(val > 5){ t2.cancel(); - adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm); + adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm); } } }; @@ -66,7 +67,7 @@ public void run() { startAdded.set(true); JButton startNew = new JButton("Start match"); startNew.addActionListener(e -> { - adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm); + adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm); }); panel.add(startNew); } diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java index ef63fd4..8fac285 100644 --- a/src/main/java/org/example/model/Match.java +++ b/src/main/java/org/example/model/Match.java @@ -147,4 +147,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(id); } -} + + public Player getFirstPLayer(){ + return this.players.get(0); + } +} \ No newline at end of file From 5b9d8b56400fc1051f6f9aff22c2d86e29b53c83 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 11:51:09 +0100 Subject: [PATCH 17/55] Added the possibility for hosts to change the maximum duration of a match --- .../example/controller/AlertController.java | 2 +- .../controller/FriendlyModeController.java | 2 +- .../controller/MatchCreatorController.java | 7 +++--- .../example/controller/ModeController.java | 2 +- .../controller/QuestionController.java | 10 ++++----- .../example/controller/RoomController.java | 14 ++++++------ src/main/java/org/example/model/Match.java | 22 +++++++++++++++++++ .../org/example/view/FriendlyModeView.java | 2 +- .../org/example/view/MatchCreatorView.java | 13 +++++++---- .../java/org/example/view/QuestionView.java | 4 ++-- src/main/java/org/example/view/RoomView.java | 4 ++-- 11 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/example/controller/AlertController.java b/src/main/java/org/example/controller/AlertController.java index d7fc18b..8844ffd 100644 --- a/src/main/java/org/example/controller/AlertController.java +++ b/src/main/java/org/example/controller/AlertController.java @@ -21,7 +21,7 @@ public AlertController(JFrame frame, JPanel alert, String name, String type, JBu mm.setQuestion((Question) response.getMessage()); System.out.println(mm); frame.remove(alert); - frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null, null).getPanel()); + frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null, null, 0).getPanel()); frame.validate(); } }); diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 1426344..9fe4bc4 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -40,7 +40,7 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false,mGet.getTime()).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index 8ecc2a5..fadb0c3 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -9,10 +9,9 @@ import javax.swing.*; import java.util.ArrayList; -import java.util.Objects; public class MatchCreatorController { - public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, JSpinner maxSize, ArrayList matches, Sender sender, MatchChecker mm){ + public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, JSpinner maxSize, JSpinner timeMatch, ArrayList matches, Sender sender, MatchChecker mm){ create.addActionListener(e -> { String nameM = nameMatch.getText(); if(nameM != null && nameM.length() > 0){ @@ -20,13 +19,13 @@ public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, if(response.getMessage() != null && response.getMessage().equals("Y")){ JOptionPane.showMessageDialog(frame,"Game match already used!","Warning!",JOptionPane.WARNING_MESSAGE); }else{ - Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM+""+maxSize.getValue())); + Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM+":"+maxSize.getValue()+":"+timeMatch.getValue())); if(response2.getMessage() != null){ Match match = (Match) response2.getMessage(); mm.setType("friendly"); mm.setGoingOn(true); frame.remove(panel); - frame.add(new RoomView(frame, name, matches,match, sender, mm,false).getPanel()); + frame.add(new RoomView(frame, name, matches,match, sender, mm,false, (Integer) timeMatch.getValue()).getPanel()); frame.validate(); } } diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index 2ed12b8..5d837fc 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -36,7 +36,7 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li Message response = sender.sendAndRead(new Message<>(name, "START","practice")); Question q = (Question) response.getMessage(); frame.remove(mode); - frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null, null).getPanel()); + frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null, null,0).getPanel()); frame.validate(); } break; diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index 03fab77..7ed091c 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -16,7 +16,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class QuestionController { - public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel label){ + public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel label, int time){ if(!lecit){ TimerTask task = new TimerTask() { public int i = seconds.get(); @@ -27,9 +27,9 @@ public void run() { int secondss = i % 60; seconds.getAndAdd(1); if(secondss < 10) - label.setText("Time passed in minutes: "+minutes+":"+"0"+secondss); - else label.setText("Time passed in minutes: "+minutes+":"+secondss); - if(i > 10){ + label.setText("Time passed in minutes: "+minutes+":"+"0"+secondss+"/"+time+":00"); + else label.setText("Time passed in minutes: "+minutes+":"+secondss+"/"+time+":00"); + if(i > time * 60){ tQuiz.cancel(); //Delete timer if test is taking more than n/60 minutes Message response = sender.sendAndRead(new Message<>(name, "END_TIMER")); if(response != null && response.getEvent().equals("END_TIMER") && response.getMessage() != null){ @@ -49,7 +49,7 @@ public void run() { case "game": frame.remove(question); Question newQuestion = (Question) response.getMessage(); - frame.add(new QuestionView(frame,name,newQuestion,sender, mm, true, tQuiz, seconds, label).getPanel()); + frame.add(new QuestionView(frame,name,newQuestion,sender, mm, true, tQuiz, seconds, label, time).getPanel()); frame.validate(); break; case "end": diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index e1041da..4096977 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -17,7 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready, int time){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } @@ -42,7 +42,7 @@ public void run() { mm.setGoingOn(true); mm.setMatch(match.getName()); frame.remove(panel); - frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel()).getPanel()); + frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel(), time).getPanel()); frame.validate(); } }else{ @@ -59,7 +59,7 @@ public void run() { int val = timerStart.addAndGet(1); if(val > 5){ t2.cancel(); - adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm); + adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time); } } }; @@ -67,7 +67,7 @@ public void run() { startAdded.set(true); JButton startNew = new JButton("Start match"); startNew.addActionListener(e -> { - adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm); + adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time); }); panel.add(startNew); } @@ -115,7 +115,7 @@ public void run() { if(start != null){ start.addActionListener(e -> { - adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm); + adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm, time); }); } } @@ -139,12 +139,12 @@ private int printerCicle(Match match, int i, JPanel content, int readyness){ return readyness; } - private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm){ + private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm, int time){ if(!ready){ t.cancel(); sender.send(new Message(name, "UPDATE_READY", true)); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, match, sender, mm, true).getPanel()); + frame.add(new RoomView(frame, name, matches, match, sender, mm, true, time).getPanel()); frame.validate(); }else{ sender.send(new Message(name, "FRIENDLY_START",match.getName())); diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java index 8fac285..d546ff7 100644 --- a/src/main/java/org/example/model/Match.java +++ b/src/main/java/org/example/model/Match.java @@ -16,6 +16,7 @@ public class Match implements Serializable { private Player host; private int size; + private int time; //Time in minutes of max duration of the match public Match(){ this.players = new ArrayList<>(); this.available = false ; @@ -24,6 +25,7 @@ public Match(){ this.name = ""+this.id; this.host = null; this.size = 0; + this.time = 0; } public Match(String type, Player host){ this.players = new ArrayList<>(); @@ -33,6 +35,7 @@ public Match(String type, Player host){ this.name = ""+this.id; this.host = host; this.size = 1; //DEFAULT SIZE + this.time = 0; } public Match(String type, String name, Player host, int size){ this.players = new ArrayList<>(); @@ -42,6 +45,25 @@ public Match(String type, String name, Player host, int size){ this.name = name; this.host = host; this.size = size; + this.time = 0; + } + public Match(String type, String name, Player host, int size, int time){ + this.players = new ArrayList<>(); + this.available = false ; + this.type = type; + this.id = Utility.randomIDGenerator(10000); + this.name = name; + this.host = host; + this.size = size; + this.time = time; + } + + public synchronized int getTime() { + return time; + } + + public synchronized void setTime(int time) { + this.time = time; } public synchronized int getSize() { diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index 3567495..789deee 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -74,7 +74,7 @@ private void print(ArrayList matches, Sender sender, String name, JFrame if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false, mGet.getTime()).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index 5f02b03..8a90658 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -16,7 +16,7 @@ public class MatchCreatorView { public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ panel = new JPanel(); panel.setBorder(new EmptyBorder(25,25,25,25)); - panel.setLayout(new GridLayout(7,1)); + panel.setLayout(new GridLayout(9,1)); JLabel title = new JLabel("Create a new match"); Font font = title.getFont(); title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); @@ -27,16 +27,21 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen panel.add(nameMatch); JLabel description2 = new JLabel("Maximum number of people allowed: "); panel.add(description2); - SpinnerModel value = new SpinnerNumberModel(4,1,10,1); - JSpinner maxSize = new JSpinner(value); + SpinnerModel people = new SpinnerNumberModel(4,1,9,1); + JSpinner maxSize = new JSpinner(people); panel.add(maxSize); + JLabel description3 = new JLabel("Maximum duration of the match in minutes:"); + panel.add(description3); + SpinnerModel time = new SpinnerNumberModel(4,2,10,2); + JSpinner timeMatch = new JSpinner(time); + panel.add(timeMatch); JButton create = new JButton("Create"); panel.add(create); JButton back = new JButton("Go back"); panel.add(back); - MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,matches, sender, mm); + MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,timeMatch, matches, sender, mm); panel.setVisible(true); diff --git a/src/main/java/org/example/view/QuestionView.java b/src/main/java/org/example/view/QuestionView.java index 53a817d..fff9f6a 100644 --- a/src/main/java/org/example/view/QuestionView.java +++ b/src/main/java/org/example/view/QuestionView.java @@ -14,7 +14,7 @@ public class QuestionView { JPanel question; - public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel timeLabel){ + public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel timeLabel,int time){ question = new JPanel(); question.setLayout(new GridLayout(5,1)); question.setBorder(new EmptyBorder(25,25,25,25)); @@ -36,7 +36,7 @@ public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchC question.add(sendButton); mm.setQuestion(q); question.setVisible(true); - QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds, timeLabel); + QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds, timeLabel,time); } diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index eacdbe4..5f64991 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -13,7 +13,7 @@ public class RoomView { private JPanel panel; - public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready){ + public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time){ Timer t = new Timer(); panel = new JPanel(); if(match.getHost().name.equals(name) || !ready) { @@ -65,7 +65,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match JButton close = new JButton("Close match"); panel.add(close); - RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready); + RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready, time); panel.setVisible(true); } public JPanel getPanel(){ From b0cdd03bf210b65a84b9f0d0acd5d7b0adc60846 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 13:27:11 +0100 Subject: [PATCH 18/55] Some graphics fixes --- .../org/example/controller/AlertController.java | 2 +- .../controller/FriendlyModeController.java | 2 +- .../controller/MatchCreatorController.java | 6 +++--- .../org/example/controller/ModeController.java | 2 +- .../example/controller/QuestionController.java | 4 ++-- .../org/example/controller/RoomController.java | 16 ++++++++-------- src/main/java/org/example/model/Match.java | 11 ++++++++++- .../java/org/example/view/FriendlyModeView.java | 2 +- .../java/org/example/view/MatchCreatorView.java | 13 ++++++++++--- src/main/java/org/example/view/QuestionView.java | 6 +++--- src/main/java/org/example/view/RoomView.java | 16 ++++++++++------ 11 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/example/controller/AlertController.java b/src/main/java/org/example/controller/AlertController.java index 8844ffd..b3a24f3 100644 --- a/src/main/java/org/example/controller/AlertController.java +++ b/src/main/java/org/example/controller/AlertController.java @@ -21,7 +21,7 @@ public AlertController(JFrame frame, JPanel alert, String name, String type, JBu mm.setQuestion((Question) response.getMessage()); System.out.println(mm); frame.remove(alert); - frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null, null, 0).getPanel()); + frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null, null, 0,10,1).getPanel()); frame.validate(); } }); diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 9fe4bc4..d285b05 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -40,7 +40,7 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false,mGet.getTime()).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false,mGet.getTime(),mGet.getNumberQuestions()).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index fadb0c3..4cece18 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -11,7 +11,7 @@ import java.util.ArrayList; public class MatchCreatorController { - public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, JSpinner maxSize, JSpinner timeMatch, ArrayList matches, Sender sender, MatchChecker mm){ + public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, JSpinner maxSize, JSpinner timeMatch, JSpinner questionsSize, ArrayList matches, Sender sender, MatchChecker mm){ create.addActionListener(e -> { String nameM = nameMatch.getText(); if(nameM != null && nameM.length() > 0){ @@ -19,13 +19,13 @@ public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, if(response.getMessage() != null && response.getMessage().equals("Y")){ JOptionPane.showMessageDialog(frame,"Game match already used!","Warning!",JOptionPane.WARNING_MESSAGE); }else{ - Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM+":"+maxSize.getValue()+":"+timeMatch.getValue())); + Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM+":"+maxSize.getValue()+":"+timeMatch.getValue()+":"+questionsSize.getValue())); if(response2.getMessage() != null){ Match match = (Match) response2.getMessage(); mm.setType("friendly"); mm.setGoingOn(true); frame.remove(panel); - frame.add(new RoomView(frame, name, matches,match, sender, mm,false, (Integer) timeMatch.getValue()).getPanel()); + frame.add(new RoomView(frame, name, matches,match, sender, mm,false, (Integer) timeMatch.getValue(), (Integer) questionsSize.getValue()).getPanel()); frame.validate(); } } diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index 5d837fc..f7a1ab6 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -36,7 +36,7 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li Message response = sender.sendAndRead(new Message<>(name, "START","practice")); Question q = (Question) response.getMessage(); frame.remove(mode); - frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null, null,0).getPanel()); + frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null, null,0, 10, 1).getPanel()); frame.validate(); } break; diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index 7ed091c..2f202c9 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -16,7 +16,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class QuestionController { - public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel label, int time){ + public QuestionController(JFrame frame, JPanel question, JButton jb, JTextField answer, Question q, String name, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel label, int time, int questions, int iterator){ if(!lecit){ TimerTask task = new TimerTask() { public int i = seconds.get(); @@ -49,7 +49,7 @@ public void run() { case "game": frame.remove(question); Question newQuestion = (Question) response.getMessage(); - frame.add(new QuestionView(frame,name,newQuestion,sender, mm, true, tQuiz, seconds, label, time).getPanel()); + frame.add(new QuestionView(frame,name,newQuestion,sender, mm, true, tQuiz, seconds, label, time, questions,iterator+1).getPanel()); frame.validate(); break; case "end": diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 4096977..771a651 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -17,7 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready, int time){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready, int time, int questions){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } @@ -42,7 +42,7 @@ public void run() { mm.setGoingOn(true); mm.setMatch(match.getName()); frame.remove(panel); - frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel(), time).getPanel()); + frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel(), time, questions, 1).getPanel()); frame.validate(); } }else{ @@ -52,14 +52,14 @@ public void run() { int readyness = printerCicle(mmm,i,content, 0); if(readyness == mmm.getPlayers().size()){ if(mmm.getHost().name.equals(name) && ready && !startAdded.get()){ - panel.setLayout(new GridLayout(6,1)); + panel.setLayout(new GridLayout(8,1)); TimerTask tt2 = new TimerTask() { @Override public void run() { int val = timerStart.addAndGet(1); if(val > 5){ t2.cancel(); - adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time); + adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time, questions); } } }; @@ -67,7 +67,7 @@ public void run() { startAdded.set(true); JButton startNew = new JButton("Start match"); startNew.addActionListener(e -> { - adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time); + adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time, questions); }); panel.add(startNew); } @@ -115,7 +115,7 @@ public void run() { if(start != null){ start.addActionListener(e -> { - adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm, time); + adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm, time, questions); }); } } @@ -139,12 +139,12 @@ private int printerCicle(Match match, int i, JPanel content, int readyness){ return readyness; } - private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm, int time){ + private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm, int time, int questions){ if(!ready){ t.cancel(); sender.send(new Message(name, "UPDATE_READY", true)); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, match, sender, mm, true, time).getPanel()); + frame.add(new RoomView(frame, name, matches, match, sender, mm, true, time, questions).getPanel()); frame.validate(); }else{ sender.send(new Message(name, "FRIENDLY_START",match.getName())); diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java index d546ff7..cbfdad1 100644 --- a/src/main/java/org/example/model/Match.java +++ b/src/main/java/org/example/model/Match.java @@ -17,6 +17,8 @@ public class Match implements Serializable { private Player host; private int size; private int time; //Time in minutes of max duration of the match + + private int numberQuestions; public Match(){ this.players = new ArrayList<>(); this.available = false ; @@ -26,6 +28,7 @@ public Match(){ this.host = null; this.size = 0; this.time = 0; + this.numberQuestions = 0; } public Match(String type, Player host){ this.players = new ArrayList<>(); @@ -36,6 +39,7 @@ public Match(String type, Player host){ this.host = host; this.size = 1; //DEFAULT SIZE this.time = 0; + this.numberQuestions = 10; } public Match(String type, String name, Player host, int size){ this.players = new ArrayList<>(); @@ -47,7 +51,7 @@ public Match(String type, String name, Player host, int size){ this.size = size; this.time = 0; } - public Match(String type, String name, Player host, int size, int time){ + public Match(String type, String name, Player host, int size, int time, int numberQuestions){ this.players = new ArrayList<>(); this.available = false ; this.type = type; @@ -56,6 +60,11 @@ public Match(String type, String name, Player host, int size, int time){ this.host = host; this.size = size; this.time = time; + this.numberQuestions = numberQuestions; + } + + public int getNumberQuestions() { + return numberQuestions; } public synchronized int getTime() { diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index 789deee..a0dd6b4 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -74,7 +74,7 @@ private void print(ArrayList matches, Sender sender, String name, JFrame if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false, mGet.getTime()).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false, mGet.getTime(),mGet.getNumberQuestions()).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index 8a90658..c7abd25 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -16,7 +16,7 @@ public class MatchCreatorView { public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ panel = new JPanel(); panel.setBorder(new EmptyBorder(25,25,25,25)); - panel.setLayout(new GridLayout(9,1)); + panel.setLayout(new GridLayout(12,1)); JLabel title = new JLabel("Create a new match"); Font font = title.getFont(); title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); @@ -32,16 +32,23 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen panel.add(maxSize); JLabel description3 = new JLabel("Maximum duration of the match in minutes:"); panel.add(description3); - SpinnerModel time = new SpinnerNumberModel(4,2,10,2); + SpinnerModel time = new SpinnerNumberModel(2,2,10,2); JSpinner timeMatch = new JSpinner(time); panel.add(timeMatch); + JLabel description4 = new JLabel("Numbers of questions of the match:"); + panel.add(description4); + SpinnerModel questions = new SpinnerNumberModel(5,5,15,1); + JSpinner questionsSize = new JSpinner(questions); + panel.add(questionsSize); + JSeparator sp = new JSeparator(); + panel.add(sp); JButton create = new JButton("Create"); panel.add(create); JButton back = new JButton("Go back"); panel.add(back); - MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,timeMatch, matches, sender, mm); + MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,timeMatch,questionsSize, matches, sender, mm); panel.setVisible(true); diff --git a/src/main/java/org/example/view/QuestionView.java b/src/main/java/org/example/view/QuestionView.java index fff9f6a..193f4d6 100644 --- a/src/main/java/org/example/view/QuestionView.java +++ b/src/main/java/org/example/view/QuestionView.java @@ -14,13 +14,13 @@ public class QuestionView { JPanel question; - public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel timeLabel,int time){ + public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel timeLabel,int time, int questions, int iterator){ question = new JPanel(); question.setLayout(new GridLayout(5,1)); question.setBorder(new EmptyBorder(25,25,25,25)); if(timeLabel != null) question.add(timeLabel); - JLabel questionLabel = new JLabel("Question: "); + JLabel questionLabel = new JLabel("Question "+iterator+": "); question.add(questionLabel); JLabel questionLabel2 = new JLabel(q.quest); @@ -36,7 +36,7 @@ public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchC question.add(sendButton); mm.setQuestion(q); question.setVisible(true); - QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds, timeLabel,time); + QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds, timeLabel,time, questions, iterator); } diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index 5f64991..0929ab2 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -13,23 +13,27 @@ public class RoomView { private JPanel panel; - public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time){ + public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time, int questions){ Timer t = new Timer(); panel = new JPanel(); if(match.getHost().name.equals(name) || !ready) { - panel.setLayout(new GridLayout(6,1)); + panel.setLayout(new GridLayout(8,1)); }else{ - panel.setLayout(new GridLayout(5,1)); + panel.setLayout(new GridLayout(7,1)); } JLabel matchName = new JLabel(match.getName()); Font font = matchName.getFont(); matchName.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); panel.add(matchName); - JLabel title = new JLabel("Players"); - panel.add(title); JLabel description = new JLabel("Max size: "+match.getSize()); panel.add(description); + JLabel questionsLabel = new JLabel("Number of questions: "+questions); + panel.add(questionsLabel); + JLabel durationLabel = new JLabel("Maximum duration in minutes: "+time+":00"); + panel.add(durationLabel); + JLabel title = new JLabel("Players"); + panel.add(title); JPanel content = new JPanel(); JScrollPane scrollable = new JScrollPane(); scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); @@ -65,7 +69,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match JButton close = new JButton("Close match"); panel.add(close); - RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready, time); + RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready, time, questions); panel.setVisible(true); } public JPanel getPanel(){ From 2d4f69922b0748b21cbf84c5e9f0cda901bf44c8 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 16:17:31 +0100 Subject: [PATCH 19/55] Bug fixes --- .../org/example/controller/AlertController.java | 4 ++-- .../org/example/controller/LoginController.java | 6 ++++-- .../java/org/example/controller/ModeController.java | 3 ++- .../java/org/example/controller/RoomController.java | 1 + .../org/example/controller/WindowController.java | 1 - src/main/java/org/example/model/Match.java | 9 +++++++++ src/main/java/org/example/model/MatchChecker.java | 13 ++++++++++++- src/main/java/org/example/model/Player.java | 11 +++++++++++ src/main/java/org/example/model/Question.java | 2 +- src/main/java/org/example/view/AlertView.java | 1 - src/main/java/org/example/view/QuestionView.java | 1 + 11 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/example/controller/AlertController.java b/src/main/java/org/example/controller/AlertController.java index b3a24f3..cf14825 100644 --- a/src/main/java/org/example/controller/AlertController.java +++ b/src/main/java/org/example/controller/AlertController.java @@ -19,9 +19,9 @@ public AlertController(JFrame frame, JPanel alert, String name, String type, JBu mm.setType("practice"); mm.setGoingOn(true); mm.setQuestion((Question) response.getMessage()); - System.out.println(mm); frame.remove(alert); - frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null, null, 0,10,1).getPanel()); + System.out.println(mm.getPosition()); + frame.add(new QuestionView(frame,name, (Question) response.getMessage(),sender, mm, true, null, null, null, 0,10,mm.getPosition()).getPanel()); frame.validate(); } }); diff --git a/src/main/java/org/example/controller/LoginController.java b/src/main/java/org/example/controller/LoginController.java index 23df345..40fa903 100644 --- a/src/main/java/org/example/controller/LoginController.java +++ b/src/main/java/org/example/controller/LoginController.java @@ -1,5 +1,6 @@ package org.example.controller; +import org.example.model.Match; import org.example.model.MatchChecker; import org.example.model.Message; import org.example.utils.Sender; @@ -15,9 +16,10 @@ public LoginController(JFrame frame, JPanel login, JButton jb, JTextField nameJ, if(name != null && name.length() > 0){ mm.setName(name); Message response = sender.sendAndRead(new Message(name, "NAME")); - if(response.getMessage() != null && response.getMessage() instanceof String){ + if(response.getMessage() != null && response.getMessage() instanceof Match){ frame.remove(login); - frame.add(new AlertView(frame,name, (String) response.getMessage(),sender, mm).getPanel()); + mm.setPosition(((Match) response.getMessage()).getPlayer(name).getIndexLastQuestion()); + frame.add(new AlertView(frame,name, ((Match) response.getMessage()).getType(),sender, mm).getPanel()); frame.validate(); }else{ frame.remove(login); diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index f7a1ab6..4a4b281 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -33,10 +33,11 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li if(result == 0){ mm.setType("practice"); mm.setGoingOn(true); + mm.setPosition(1); Message response = sender.sendAndRead(new Message<>(name, "START","practice")); Question q = (Question) response.getMessage(); frame.remove(mode); - frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null, null,0, 10, 1).getPanel()); + frame.add(new QuestionView(frame,name,q,sender, mm, true, null, null, null,0, 10, mm.getPosition()).getPanel()); frame.validate(); } break; diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 771a651..867e3c7 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -41,6 +41,7 @@ public void run() { AtomicInteger seconds = new AtomicInteger(0); mm.setGoingOn(true); mm.setMatch(match.getName()); + mm.setPosition(1); frame.remove(panel); frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel(), time, questions, 1).getPanel()); frame.validate(); diff --git a/src/main/java/org/example/controller/WindowController.java b/src/main/java/org/example/controller/WindowController.java index d80e363..5a3dba3 100644 --- a/src/main/java/org/example/controller/WindowController.java +++ b/src/main/java/org/example/controller/WindowController.java @@ -16,7 +16,6 @@ public void windowClosing(WindowEvent e) { if(mm.isGoingOn()){ sender.send(new Message(mm.getName(),"END", mm)); }else{ - System.out.println(mm.getName()); sender.send(new Message(mm.getName(),"END")); } sender.close(); diff --git a/src/main/java/org/example/model/Match.java b/src/main/java/org/example/model/Match.java index cbfdad1..3574bcd 100644 --- a/src/main/java/org/example/model/Match.java +++ b/src/main/java/org/example/model/Match.java @@ -159,10 +159,19 @@ public synchronized Player getPlayer(String p){ } return null; } + @Override public String toString() { return "Match{" + "players=" + players + + ", available=" + available + + ", type='" + type + '\'' + + ", id=" + id + + ", name='" + name + '\'' + + ", host=" + host + + ", size=" + size + + ", time=" + time + + ", numberQuestions=" + numberQuestions + '}'; } diff --git a/src/main/java/org/example/model/MatchChecker.java b/src/main/java/org/example/model/MatchChecker.java index 9df3036..81168b0 100644 --- a/src/main/java/org/example/model/MatchChecker.java +++ b/src/main/java/org/example/model/MatchChecker.java @@ -10,12 +10,22 @@ public class MatchChecker implements Serializable { private Question question; private String match; //Name of the match + private int position; public MatchChecker(){ this.isGoingOn = false; this.question = null; this.type = null; this.match = null; this.name = null; + this.position = 1; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; } public String getName() { @@ -65,7 +75,8 @@ public String toString() { ", isGoingOn=" + isGoingOn + ", type='" + type + '\'' + ", question=" + question + - ", match=" + match + + ", match='" + match + '\'' + + ", position=" + position + '}'; } } diff --git a/src/main/java/org/example/model/Player.java b/src/main/java/org/example/model/Player.java index cf720bd..a03e1c6 100644 --- a/src/main/java/org/example/model/Player.java +++ b/src/main/java/org/example/model/Player.java @@ -15,6 +15,7 @@ public class Player implements Serializable { public Score score; private int id; private boolean ready; + private int indexLastQuestion; public Player(){ this.name = null; this.questions = new ArrayList<>(); @@ -22,6 +23,7 @@ public Player(){ this.id = Utility.randomIDGenerator(10000); this.hasFinished = false; this.ready = false; + this.indexLastQuestion = -1; } public Player(String name){ this.name = name; @@ -30,6 +32,15 @@ public Player(String name){ this.id = Utility.randomIDGenerator(10000); this.hasFinished = false; this.ready = false; + this.indexLastQuestion = -1; + } + + public int getIndexLastQuestion() { + return indexLastQuestion; + } + + public void setIndexLastQuestion(int indexLastQuestion) { + this.indexLastQuestion = indexLastQuestion; } public boolean isReady() { diff --git a/src/main/java/org/example/model/Question.java b/src/main/java/org/example/model/Question.java index c11e4ac..4b3fff9 100644 --- a/src/main/java/org/example/model/Question.java +++ b/src/main/java/org/example/model/Question.java @@ -14,7 +14,7 @@ public Question(String quest, String answer){ public final boolean checkAnswer(String answer){ String newString = answer.toLowerCase().replaceAll("\\s+",""); - if(newString.equals(this.answer)){ + if(newString.equals(this.answer.toLowerCase())){ this.correct = true; } this.given = answer; diff --git a/src/main/java/org/example/view/AlertView.java b/src/main/java/org/example/view/AlertView.java index 071df6d..280bb73 100644 --- a/src/main/java/org/example/view/AlertView.java +++ b/src/main/java/org/example/view/AlertView.java @@ -38,7 +38,6 @@ public AlertView(JFrame frame, String name, String type, Sender sender, MatchCh alert.add(attentionLabel3, c); JButton buttonYes = new JButton("Yes"); - c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 3; alert.add(buttonYes, c); diff --git a/src/main/java/org/example/view/QuestionView.java b/src/main/java/org/example/view/QuestionView.java index 193f4d6..7a2b8a3 100644 --- a/src/main/java/org/example/view/QuestionView.java +++ b/src/main/java/org/example/view/QuestionView.java @@ -35,6 +35,7 @@ public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchC JButton sendButton = new JButton("Send answer"); question.add(sendButton); mm.setQuestion(q); + mm.setPosition(iterator); question.setVisible(true); QuestionController qc = new QuestionController(frame,question,sendButton,result,q, name, sender, mm, lecit, tQuiz, seconds, timeLabel,time, questions, iterator); From 968fe9927d146eb57bb9d41eaf4f57420c4e3055 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 16:58:47 +0100 Subject: [PATCH 20/55] Fix --- .../java/org/example/controller/LoginController.java | 10 +++++++--- .../org/example/controller/QuestionController.java | 2 +- src/main/java/org/example/view/RoomView.java | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/example/controller/LoginController.java b/src/main/java/org/example/controller/LoginController.java index 40fa903..d67261e 100644 --- a/src/main/java/org/example/controller/LoginController.java +++ b/src/main/java/org/example/controller/LoginController.java @@ -22,9 +22,13 @@ public LoginController(JFrame frame, JPanel login, JButton jb, JTextField nameJ, frame.add(new AlertView(frame,name, ((Match) response.getMessage()).getType(),sender, mm).getPanel()); frame.validate(); }else{ - frame.remove(login); - frame.add(new ModeView(frame,name,sender, mm).getPanel()); - frame.validate(); + if(response.getMessage() != null && response.getMessage() instanceof String){ + JOptionPane.showMessageDialog(frame,"A user with this name is already connected","Warning!",JOptionPane.WARNING_MESSAGE); + }else{ + frame.remove(login); + frame.add(new ModeView(frame,name,sender, mm).getPanel()); + frame.validate(); + } } } }); diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index 2f202c9..d58bac8 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -38,7 +38,7 @@ public void run() { } } }; - tQuiz.schedule(task, 1500, 1000); + tQuiz.schedule(task, 500, 1000); } jb.addActionListener(e -> { if(answer.getText() != null && answer.getText().length() > 0){ //TODO: DOVREI TOGLIERE TUTTI GLI SPAZI VUOTI E CONFRONTARE LA STRINGA SOLO A QUEL PUNTO diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index 0929ab2..cdd6170 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -7,6 +7,7 @@ import org.example.utils.Sender; import javax.swing.*; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.util.ArrayList; import java.util.Timer; @@ -21,7 +22,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match }else{ panel.setLayout(new GridLayout(7,1)); } - + panel.setBorder(new EmptyBorder(25,25,25,25)); JLabel matchName = new JLabel(match.getName()); Font font = matchName.getFont(); matchName.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); From cb7196c89209d08587af069b3357772206900888 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 21:36:50 +0100 Subject: [PATCH 21/55] Graphical fixes --- src/main/java/org/example/view/AlertView.java | 31 ++++++--- .../org/example/view/FriendlyModeView.java | 63 +++++++++++++++---- src/main/java/org/example/view/LoginView.java | 56 +++++++++++++++-- src/main/java/org/example/view/ModeView.java | 1 - .../java/org/example/view/QuestionView.java | 41 +++++++++--- .../java/org/example/view/WindowView.java | 4 +- 6 files changed, 157 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/example/view/AlertView.java b/src/main/java/org/example/view/AlertView.java index 280bb73..9949aec 100644 --- a/src/main/java/org/example/view/AlertView.java +++ b/src/main/java/org/example/view/AlertView.java @@ -16,36 +16,49 @@ public AlertView(JFrame frame, String name, String type, Sender sender, MatchCh alert.setBorder(new EmptyBorder(25,25,25,25)); alert.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); - + c.anchor = GridBagConstraints.CENTER; + c.gridwidth = 1; + c.insets = new Insets(5,5,5,5); JLabel attentionLabel = new JLabel("Warning!"); Font font = attentionLabel.getFont(); attentionLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); - c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 0; alert.add(attentionLabel, c); JLabel attentionLabel2 = new JLabel("A previous not finished match of type "+type+" is found"); - c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 1; alert.add(attentionLabel2, c); JLabel attentionLabel3 = new JLabel("Do you want to resume it?"); - c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 2; alert.add(attentionLabel3, c); - JButton buttonYes = new JButton("Yes"); + JSeparator sp = new JSeparator(); c.gridx = 0; c.gridy = 3; - alert.add(buttonYes, c); + alert.add(sp, c); + + JPanel pp = new JPanel(); + pp.setLayout(new GridBagLayout()); + GridBagConstraints cc = new GridBagConstraints(); + c.gridwidth = 1; + c.gridx = 0; + c.gridy = 4; + alert.add(pp,c); + + JButton buttonYes = new JButton("Yes"); + cc.gridx = 0; + cc.gridy = 0; + buttonYes.setOpaque(true); + pp.add(buttonYes, cc); JButton buttonNo = new JButton("No"); - c.gridx = 1; - c.gridy = 3; - alert.add(buttonNo, c); + cc.gridx = 1; + cc.gridy = 0; + pp.add(buttonNo, cc); AlertController lc = new AlertController(frame, alert, name, type, buttonYes, buttonNo, sender, mm); diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index a0dd6b4..225c4c5 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -21,35 +21,72 @@ public class FriendlyModeView { private JPanel panel; public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ panel = new JPanel(); - panel.setBorder(new EmptyBorder(25,25,25,25)); - panel.setLayout(new GridLayout(8,1)); - + panel.setLayout(new GridBagLayout()); + GridBagConstraints gcc1 = new GridBagConstraints(); + gcc1.fill = GridBagConstraints.HORIZONTAL; + gcc1.anchor = GridBagConstraints.CENTER; + gcc1.weightx = 0; + gcc1.weighty = 0; + gcc1.insets = new Insets(5,5,5,5); JLabel title = new JLabel("Friendly mode"); + gcc1.ipady = 60; + gcc1.gridx = 0; + gcc1.gridy = 0; Font font = title.getFont(); title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); - panel.add(title); + panel.add(title,gcc1); + + gcc1.ipady = 0; JLabel description = new JLabel("Select a match or create a new one."); - panel.add(description); + gcc1.gridx = 0; + gcc1.gridy = 1; + panel.add(description,gcc1); JScrollPane scrollable = new JScrollPane(); + gcc1.gridx = 0; + gcc1.gridy = 2; scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); JPanel content = new JPanel(); + content.setPreferredSize(new Dimension(200,200)); content.setLayout(new GridLayout((matches.size()),1)); content.setVisible(true); scrollable.setViewportView(content); + print(matches, sender, name, frame, panel, content, mm); - panel.add(scrollable); + panel.add(scrollable,gcc1); + + JPanel panel2 = new JPanel(); + panel2.setLayout(new GridBagLayout()); + GridBagConstraints gcc2 = new GridBagConstraints(); + gcc1.gridx = 0; + gcc1.gridy = 3; + panel.add(panel2,gcc1); + JButton reload = new JButton("Reload"); - panel.add(reload); + reload.setPreferredSize(new Dimension(160,40)); + gcc2.gridx = 0; + gcc2.gridy = 0; + panel2.add(reload,gcc2); + JLabel or = new JLabel("or"); - panel.add(or); - JButton button = new JButton("Create a new match"); - panel.add(button); - JSeparator sp = new JSeparator(); - panel.add(sp); + gcc2.gridx = 0; + gcc2.gridy = 1; + panel2.add(or,gcc2); + JButton back = new JButton("Go Back"); - panel.add(back); + back.setPreferredSize(new Dimension(160,40)); + gcc2.gridx = 0; + gcc2.gridy = 2; + panel2.add(back,gcc2); + + JButton button = new JButton("Create a new match"); + button.setPreferredSize(new Dimension(160,40)); + gcc2.gridx = 1; + gcc2.gridy = 2; + panel2.add(button,gcc2); + + FriendlyModeController fmc = new FriendlyModeController(frame, panel, matches, button, back, reload, content, name, sender, mm); diff --git a/src/main/java/org/example/view/LoginView.java b/src/main/java/org/example/view/LoginView.java index 4f2358e..ce8e645 100644 --- a/src/main/java/org/example/view/LoginView.java +++ b/src/main/java/org/example/view/LoginView.java @@ -12,17 +12,61 @@ public class LoginView { private JPanel login; public LoginView(JFrame frame, Sender sender, MatchChecker mm){ login = new JPanel(); - login.setLayout(new GridLayout(4,1)); + login.setLayout(new GridBagLayout()); login.setBorder(new EmptyBorder(25,25,25,25)); + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.CENTER; JLabel loginLabel = new JLabel("LOG IN"); Font font = loginLabel.getFont(); loginLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); - login.add(loginLabel); - login.add(new JLabel("Enter your username")); - JTextField nameJ = new JTextField(20); - login.add(nameJ); + c.ipady = 60; + c.weightx = 2; + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + login.add(loginLabel,c); + + c.ipady = 15; + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 2; + c.gridheight = 1; + login.add(new JLabel("Enter your username so to play fantastic games alone or with your friends!"),c); + + + + JTextField nameJ = new JTextField(10); + c.gridwidth = 1; + c.gridheight = 1; + c.gridx = 0; + c.gridy = 3; + c.weightx = 1; + login.add(nameJ,c); + + JLabel username = new JLabel("Username:"); + username.setLabelFor(nameJ); + c.gridwidth = 1; + c.gridheight = 1; + c.gridx = 0; + c.gridy = 2; + c.weightx = 1; + login.add(username,c); + + JSeparator sp = new JSeparator(); + c.weightx = 2; + c.gridwidth = 3; + c.gridx = 0; + c.gridy = 4; + login.add(sp,c); + JButton loginButton = new JButton("Log In"); - login.add(loginButton); + loginButton.setPreferredSize(new Dimension(120,40)); + c.gridwidth = 1; + c.gridx = 0; + c.gridy = 5; + login.add(loginButton,c); + LoginController lc = new LoginController(frame, login, loginButton, nameJ,sender, mm); login.setVisible(true); diff --git a/src/main/java/org/example/view/ModeView.java b/src/main/java/org/example/view/ModeView.java index 13aebe3..6e90b3a 100644 --- a/src/main/java/org/example/view/ModeView.java +++ b/src/main/java/org/example/view/ModeView.java @@ -39,7 +39,6 @@ private void print(JFrame frame, String name, Sender sender, MatchChecker mm){ mode.add(el); } JButton select = new JButton("Select"); - mode.add(select); diff --git a/src/main/java/org/example/view/QuestionView.java b/src/main/java/org/example/view/QuestionView.java index 7a2b8a3..1b77dd4 100644 --- a/src/main/java/org/example/view/QuestionView.java +++ b/src/main/java/org/example/view/QuestionView.java @@ -16,24 +16,49 @@ public class QuestionView { JPanel question; public QuestionView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, boolean lecit, Timer tQuiz, AtomicInteger seconds, JLabel timeLabel,int time, int questions, int iterator){ question = new JPanel(); - question.setLayout(new GridLayout(5,1)); - question.setBorder(new EmptyBorder(25,25,25,25)); - if(timeLabel != null) - question.add(timeLabel); + question.setLayout(new GridBagLayout()); + + GridBagConstraints gcc = new GridBagConstraints(); + gcc.anchor = GridBagConstraints.CENTER; + gcc.insets = new Insets(5,5,5,5); + gcc.gridwidth = 1; + + if(timeLabel != null){ + gcc.gridx = 0; + gcc.gridy = 0; + gcc.ipady=60; + question.add(timeLabel,gcc); + + } + gcc.ipady=0; JLabel questionLabel = new JLabel("Question "+iterator+": "); - question.add(questionLabel); + gcc.gridx = 0; + gcc.gridy = 1; + question.add(questionLabel,gcc); JLabel questionLabel2 = new JLabel(q.quest); Font font = questionLabel2.getFont(); questionLabel2.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); - question.add(questionLabel2); + gcc.gridx = 0; + gcc.gridy = 2; + question.add(questionLabel2,gcc); JTextField result = new JTextField(20); - question.add(result); + gcc.gridx = 0; + gcc.gridy = 3; + question.add(result,gcc); + JSeparator sp = new JSeparator(); + gcc.gridx = 0; + gcc.gridy = 4; + gcc.weightx = 1; + question.add(sp,gcc); JButton sendButton = new JButton("Send answer"); - question.add(sendButton); + gcc.gridx = 0; + gcc.gridy = 5; + sendButton.setPreferredSize(new Dimension(120,50)); + question.add(sendButton,gcc); mm.setQuestion(q); mm.setPosition(iterator); question.setVisible(true); diff --git a/src/main/java/org/example/view/WindowView.java b/src/main/java/org/example/view/WindowView.java index c541585..a99ef3a 100644 --- a/src/main/java/org/example/view/WindowView.java +++ b/src/main/java/org/example/view/WindowView.java @@ -14,7 +14,7 @@ public class WindowView { public WindowView(Sender sender){ JFrame frame = new JFrame(); frame.setTitle("Play game!"); - frame.setSize(new Dimension(600,500)); + frame.setSize(new Dimension(650,550)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MatchChecker mm = new MatchChecker(); @@ -23,7 +23,7 @@ public WindowView(Sender sender){ frame.add(login.getPanel()); WindowController wc = new WindowController(frame,mm,sender); - + frame.setResizable(false); frame.setVisible(true); } } From c8f37461f34c7715220d8c7337a4d4afc37de4d5 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 23:05:34 +0100 Subject: [PATCH 22/55] Improved graphic of application --- .../example/controller/ModeController.java | 2 +- .../example/controller/RoomController.java | 10 ++- src/main/java/org/example/view/AlertView.java | 3 +- .../org/example/view/FriendlyModeView.java | 2 +- src/main/java/org/example/view/LoginView.java | 22 ++---- .../org/example/view/MatchCreatorView.java | 69 +++++++++++++---- src/main/java/org/example/view/ModeView.java | 29 ++++++-- .../java/org/example/view/ResultsView.java | 58 +++++++++++---- src/main/java/org/example/view/RoomView.java | 74 ++++++++++++++----- .../java/org/example/view/WindowView.java | 2 +- 10 files changed, 191 insertions(+), 80 deletions(-) diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index 4a4b281..5abd9b9 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -27,7 +27,7 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li switch (value.toLowerCase()){ case "practice mode": String[] options = {"Yes","No"}; - int result = JOptionPane.showOptionDialog(frame , "A game will start soon.\n Do you want to start it now?", "Question", + int result = JOptionPane.showOptionDialog(frame , "A game will start soon.\nDo you want to start it now?", "Question", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if(result == 0){ diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 867e3c7..d5bd342 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -17,7 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready, int time, int questions){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready, int time, int questions, GridBagConstraints gcc, JPanel pp){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } @@ -51,9 +51,8 @@ public void run() { content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); int i = 1; int readyness = printerCicle(mmm,i,content, 0); - if(readyness == mmm.getPlayers().size()){ + if(readyness == mmm.getPlayers().size()){ //TODO: FIX IN THE FUTURE if(mmm.getHost().name.equals(name) && ready && !startAdded.get()){ - panel.setLayout(new GridLayout(8,1)); TimerTask tt2 = new TimerTask() { @Override public void run() { @@ -67,10 +66,13 @@ public void run() { t2.schedule(tt2, 400,1000); startAdded.set(true); JButton startNew = new JButton("Start match"); + startNew.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 1; + gcc.gridy = 0; startNew.addActionListener(e -> { adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time, questions); }); - panel.add(startNew); + pp.add(startNew,gcc); } }else{ timerStart.set(0); diff --git a/src/main/java/org/example/view/AlertView.java b/src/main/java/org/example/view/AlertView.java index 9949aec..a1fd61d 100644 --- a/src/main/java/org/example/view/AlertView.java +++ b/src/main/java/org/example/view/AlertView.java @@ -13,7 +13,6 @@ public class AlertView { private JPanel alert; public AlertView(JFrame frame, String name, String type, Sender sender, MatchChecker mm){ alert = new JPanel(); - alert.setBorder(new EmptyBorder(25,25,25,25)); alert.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.CENTER; @@ -50,12 +49,14 @@ public AlertView(JFrame frame, String name, String type, Sender sender, MatchCh alert.add(pp,c); JButton buttonYes = new JButton("Yes"); + buttonYes.setPreferredSize(new Dimension(120,50)); cc.gridx = 0; cc.gridy = 0; buttonYes.setOpaque(true); pp.add(buttonYes, cc); JButton buttonNo = new JButton("No"); + buttonNo.setPreferredSize(new Dimension(120,50)); cc.gridx = 1; cc.gridy = 0; pp.add(buttonNo, cc); diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index 225c4c5..1f3af23 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -48,7 +48,7 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen gcc1.gridy = 2; scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); JPanel content = new JPanel(); - content.setPreferredSize(new Dimension(200,200)); + scrollable.setPreferredSize(new Dimension(350,200)); content.setLayout(new GridLayout((matches.size()),1)); content.setVisible(true); scrollable.setViewportView(content); diff --git a/src/main/java/org/example/view/LoginView.java b/src/main/java/org/example/view/LoginView.java index ce8e645..92c4976 100644 --- a/src/main/java/org/example/view/LoginView.java +++ b/src/main/java/org/example/view/LoginView.java @@ -12,57 +12,45 @@ public class LoginView { private JPanel login; public LoginView(JFrame frame, Sender sender, MatchChecker mm){ login = new JPanel(); + login.setLayout(new GridBagLayout()); - login.setBorder(new EmptyBorder(25,25,25,25)); GridBagConstraints c = new GridBagConstraints(); - c.anchor = GridBagConstraints.CENTER; + c.anchor = GridBagConstraints.WEST; + c.insets = new Insets(5,5,5,5); + JLabel loginLabel = new JLabel("LOG IN"); Font font = loginLabel.getFont(); loginLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); c.ipady = 60; - c.weightx = 2; c.gridx = 0; c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; login.add(loginLabel,c); c.ipady = 15; c.gridx = 0; c.gridy = 1; - c.gridwidth = 2; - c.gridheight = 1; login.add(new JLabel("Enter your username so to play fantastic games alone or with your friends!"),c); - JTextField nameJ = new JTextField(10); - c.gridwidth = 1; - c.gridheight = 1; + JTextField nameJ = new JTextField(20); c.gridx = 0; c.gridy = 3; - c.weightx = 1; login.add(nameJ,c); JLabel username = new JLabel("Username:"); username.setLabelFor(nameJ); - c.gridwidth = 1; - c.gridheight = 1; c.gridx = 0; c.gridy = 2; - c.weightx = 1; login.add(username,c); JSeparator sp = new JSeparator(); - c.weightx = 2; - c.gridwidth = 3; c.gridx = 0; c.gridy = 4; login.add(sp,c); JButton loginButton = new JButton("Log In"); loginButton.setPreferredSize(new Dimension(120,40)); - c.gridwidth = 1; c.gridx = 0; c.gridy = 5; login.add(loginButton,c); diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index c7abd25..942026f 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -15,38 +15,77 @@ public class MatchCreatorView { private JPanel panel; public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sender sender, MatchChecker mm){ panel = new JPanel(); - panel.setBorder(new EmptyBorder(25,25,25,25)); - panel.setLayout(new GridLayout(12,1)); + panel.setLayout(new GridBagLayout()); + GridBagConstraints gcc = new GridBagConstraints(); + gcc.anchor = GridBagConstraints.WEST; + gcc.insets = new Insets(5,5,5,5); + JLabel title = new JLabel("Create a new match"); + gcc.ipady = 60; Font font = title.getFont(); title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); - panel.add(title); + gcc.gridx = 0; + gcc.gridy = 0; + panel.add(title,gcc); + + gcc.ipady = 0; + JLabel description = new JLabel("Name of the match: "); - panel.add(description); + gcc.gridy = 2; + panel.add(description,gcc); + JTextField nameMatch = new JTextField(20); - panel.add(nameMatch); + gcc.gridy = 3; + panel.add(nameMatch,gcc); + JLabel description2 = new JLabel("Maximum number of people allowed: "); - panel.add(description2); - SpinnerModel people = new SpinnerNumberModel(4,1,9,1); + gcc.gridy = 4; + panel.add(description2,gcc); + + SpinnerModel people = new SpinnerNumberModel(4,1,10,1); JSpinner maxSize = new JSpinner(people); - panel.add(maxSize); + gcc.gridy = 5; + panel.add(maxSize,gcc); + JLabel description3 = new JLabel("Maximum duration of the match in minutes:"); - panel.add(description3); + gcc.gridy = 6; + panel.add(description3,gcc); + SpinnerModel time = new SpinnerNumberModel(2,2,10,2); JSpinner timeMatch = new JSpinner(time); - panel.add(timeMatch); + gcc.gridy = 7; + panel.add(timeMatch,gcc); + JLabel description4 = new JLabel("Numbers of questions of the match:"); - panel.add(description4); + gcc.gridy = 8; + panel.add(description4,gcc); + SpinnerModel questions = new SpinnerNumberModel(5,5,15,1); JSpinner questionsSize = new JSpinner(questions); - panel.add(questionsSize); + gcc.gridy = 9; + panel.add(questionsSize,gcc); + JSeparator sp = new JSeparator(); - panel.add(sp); + gcc.gridy = 10; + panel.add(sp,gcc); + + JPanel pp = new JPanel(); + pp.setLayout(new GridBagLayout()); + gcc.gridx = 0; + gcc.gridy = 11; + panel.add(pp,gcc); + JButton create = new JButton("Create"); - panel.add(create); + create.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 1; + gcc.gridy = 0; + pp.add(create,gcc); JButton back = new JButton("Go back"); - panel.add(back); + back.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 0; + gcc.gridy = 0; + pp.add(back,gcc); MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,timeMatch,questionsSize, matches, sender, mm); diff --git a/src/main/java/org/example/view/ModeView.java b/src/main/java/org/example/view/ModeView.java index 6e90b3a..a2863e8 100644 --- a/src/main/java/org/example/view/ModeView.java +++ b/src/main/java/org/example/view/ModeView.java @@ -17,29 +17,42 @@ public ModeView(JFrame frame, String name, Sender sender, MatchChecker mm){ private void print(JFrame frame, String name, Sender sender, MatchChecker mm){ mode = new JPanel(); - mode.setLayout(new GridLayout(6,1)); - - mode.setBorder(new EmptyBorder(25,25,25,25)); + mode.setLayout(new GridBagLayout()); + GridBagConstraints gcc = new GridBagConstraints(); + gcc.insets = new Insets(15,15,15,15); + gcc.anchor = GridBagConstraints.WEST; JLabel modeLabel1 = new JLabel("Choose your game mode"); Font font = modeLabel1.getFont(); modeLabel1.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); - mode.add(modeLabel1); - + gcc.gridx = 0; + gcc.gridy = 0; + gcc.ipady = 60; + mode.add(modeLabel1,gcc); + gcc.ipady = 0; JLabel modeLabel2 = new JLabel("Welcome "+name+"! Select the mode you want to play."); - mode.add(modeLabel2); + gcc.gridx = 0; + gcc.gridy = 1; + mode.add(modeLabel2,gcc); JRadioButton[] list = new JRadioButton[]{ new JRadioButton("Practice Mode", true), new JRadioButton("Friendly Mode"), new JRadioButton("Tournament Mode")}; ButtonGroup group = new ButtonGroup(); + int i = 2; for(JRadioButton el : list){ group.add(el); - mode.add(el); + gcc.gridx = 0; + gcc.gridy = i; + mode.add(el,gcc); + i++; } JButton select = new JButton("Select"); - mode.add(select); + select.setPreferredSize(new Dimension(120,40)); + gcc.gridx = 0; + gcc.gridy = 5; + mode.add(select,gcc); ModeController mc = new ModeController(frame,mode,select,list,name,sender, mm); diff --git a/src/main/java/org/example/view/ResultsView.java b/src/main/java/org/example/view/ResultsView.java index 63ad490..0f22d1e 100644 --- a/src/main/java/org/example/view/ResultsView.java +++ b/src/main/java/org/example/view/ResultsView.java @@ -14,15 +14,23 @@ public class ResultsView { private JPanel results; public ResultsView(JFrame frame, String name, Score score, Sender sender, MatchChecker mm, boolean casistic){ results = new JPanel(); + results.setLayout(new GridBagLayout()); + GridBagConstraints gcc = new GridBagConstraints(); + gcc.insets = new Insets(5,5,5,5); + gcc.anchor = GridBagConstraints.WEST; + if(!casistic){ int size = score.questions.size(); - results.setLayout(new GridLayout(3,1)); - results.setBorder(new EmptyBorder(25,25,25,25)); + JLabel scoreLabel = new JLabel("RESULTS"); - results.add(scoreLabel); + gcc.gridx = 0; + gcc.gridy = 0; + results.add(scoreLabel,gcc); + Font font = scoreLabel.getFont(); scoreLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); JScrollPane scrollable = new JScrollPane(); + scrollable.setPreferredSize(new Dimension(400,350)); scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); int i = 1; JPanel content = new JPanel(); @@ -42,34 +50,51 @@ public ResultsView(JFrame frame, String name, Score score, Sender sender, MatchC i++; } scrollable.setViewportView(content); - results.add(scrollable); + gcc.gridx = 0; + gcc.gridy = 1; + results.add(scrollable,gcc); + + JButton button = new JButton("Return to home"); + button.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 0; + gcc.gridy = 2; + results.add(button,gcc); + ResultsController rc = new ResultsController(frame,results,button,name,sender, mm); - results.add(button); + + }else{ - results.setLayout(new GridLayout(1,1)); JLabel waiting = new JLabel("Waiting for the other players"); - results.add(waiting); + gcc.gridx = 0; + gcc.gridy = 0; + results.add(waiting,gcc); } results.setVisible(true); } public ResultsView(JFrame frame, String name, ArrayList scores, Sender sender, MatchChecker mm, boolean casistic){ results = new JPanel(); + results.setLayout(new GridBagLayout()); + GridBagConstraints gcc = new GridBagConstraints(); + gcc.insets = new Insets(5,5,5,5); + gcc.anchor = GridBagConstraints.WEST; if(!casistic){ - results.setLayout(new GridLayout(3,1)); - results.setBorder(new EmptyBorder(25,25,25,25)); JLabel scoreLabel = new JLabel("RESULTS"); - results.add(scoreLabel); + gcc.gridx = 0; + gcc.gridy = 0; + results.add(scoreLabel,gcc); + Font font = scoreLabel.getFont(); scoreLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); JScrollPane scrollable = new JScrollPane(); + scrollable.setPreferredSize(new Dimension(400,350)); scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); JPanel content = new JPanel(); content.setLayout(new GridLayout(scores.size(),1)); for(Score score : scores){ JPanel content2 = new JPanel(); content2.setLayout(new GridLayout(score.questions.size()*7,1)); - JLabel namePlayer = new JLabel(score.name); + JLabel namePlayer = new JLabel("User: "+score.name); namePlayer.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); content2.add(namePlayer); JLabel completed = new JLabel("Completed: "+score.isCompleted()); @@ -90,12 +115,17 @@ public ResultsView(JFrame frame, String name, ArrayList scores, Sender se content.add(content2); } scrollable.setViewportView(content); - results.add(scrollable); + gcc.gridy = 1; + results.add(scrollable,gcc); + JButton button = new JButton("Return to home"); + button.setPreferredSize(new Dimension(120,50)); + gcc.gridy = 2; + results.add(button,gcc); + ResultsController rc = new ResultsController(frame,results,button,name,sender, mm); - results.add(button); + }else{ - results.setLayout(new GridLayout(1,1)); JLabel waiting = new JLabel("Waiting for the other players"); results.add(waiting); } diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index cdd6170..fda7bcc 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -17,26 +17,44 @@ public class RoomView { public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time, int questions){ Timer t = new Timer(); panel = new JPanel(); - if(match.getHost().name.equals(name) || !ready) { - panel.setLayout(new GridLayout(8,1)); - }else{ - panel.setLayout(new GridLayout(7,1)); - } - panel.setBorder(new EmptyBorder(25,25,25,25)); - JLabel matchName = new JLabel(match.getName()); + panel.setLayout(new GridBagLayout()); + GridBagConstraints gcc = new GridBagConstraints(); + gcc.insets = new Insets(5,0,5,5); + gcc.anchor = GridBagConstraints.WEST; + + JLabel matchName = new JLabel("Name of the match: "+match.getName()); + gcc.ipady = 30; Font font = matchName.getFont(); matchName.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); - panel.add(matchName); + gcc.gridx = 0; + gcc.gridy = 0; + panel.add(matchName,gcc); + + gcc.ipady = 0; + JLabel description = new JLabel("Max size: "+match.getSize()); - panel.add(description); + gcc.gridx = 0; + gcc.gridy = 1; + panel.add(description,gcc); + JLabel questionsLabel = new JLabel("Number of questions: "+questions); - panel.add(questionsLabel); + gcc.gridx = 0; + gcc.gridy = 2; + panel.add(questionsLabel,gcc); + JLabel durationLabel = new JLabel("Maximum duration in minutes: "+time+":00"); - panel.add(durationLabel); - JLabel title = new JLabel("Players"); - panel.add(title); + gcc.gridx = 0; + gcc.gridy = 3; + panel.add(durationLabel,gcc); + + JLabel title = new JLabel("Players:"); + gcc.gridx = 0; + gcc.gridy = 4; + panel.add(title,gcc); + JPanel content = new JPanel(); JScrollPane scrollable = new JScrollPane(); + scrollable.setPreferredSize(new Dimension(350,150)); scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); content.setLayout(new GridLayout(match.getPlayers().size(),1)); int i = 1; @@ -57,20 +75,40 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match content.add(contentPl); } scrollable.setViewportView(content); - panel.add(scrollable); + gcc.gridx = 0; + gcc.gridy = 5; + panel.add(scrollable,gcc); + + + JPanel pp = new JPanel(); + pp.setLayout(new GridBagLayout()); + gcc.gridx = 0; + gcc.gridy = 6; + panel.add(pp,gcc); + JButton start = null; if(!ready){ start = new JButton("Ready"); - panel.add(start); + start.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 1; + gcc.gridy = 0; + pp.add(start,gcc); } if(match.getHost().name.equals(name) && ready && readyness == match.getPlayers().size()){ start = new JButton("Start match"); - panel.add(start); + start.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 1; + gcc.gridy = 0; + pp.add(start,gcc); } + JButton close = new JButton("Close match"); - panel.add(close); + close.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 0; + gcc.gridy = 0; + pp.add(close,gcc); - RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready, time, questions); + RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready, time, questions, gcc, pp); panel.setVisible(true); } public JPanel getPanel(){ diff --git a/src/main/java/org/example/view/WindowView.java b/src/main/java/org/example/view/WindowView.java index a99ef3a..7d10088 100644 --- a/src/main/java/org/example/view/WindowView.java +++ b/src/main/java/org/example/view/WindowView.java @@ -14,7 +14,7 @@ public class WindowView { public WindowView(Sender sender){ JFrame frame = new JFrame(); frame.setTitle("Play game!"); - frame.setSize(new Dimension(650,550)); + frame.setSize(new Dimension(600,500)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MatchChecker mm = new MatchChecker(); From 9ca62358eb278449f046236ddcee516bdf4a66b3 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 23:10:54 +0100 Subject: [PATCH 23/55] Small graph improvement --- src/main/java/org/example/view/FriendlyModeView.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index 1f3af23..40e0383 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -97,13 +97,15 @@ public FriendlyModeView(JFrame frame, String name, ArrayList matches, Sen private void print(ArrayList matches, Sender sender, String name, JFrame frame, JPanel panel, JPanel content, MatchChecker mm){ for(Match m : matches){ JPanel content2 = new JPanel(); - content2.setLayout(new GridLayout(5,1)); + content2.setLayout(new GridLayout(6,1)); JLabel l1 = new JLabel("Match: "+m.getName()); content2.add(l1); - JLabel l2 = new JLabel("Host: "+m.getHost()); + JLabel l2 = new JLabel("Mode: "+m.getType()); content2.add(l2); - JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); + JLabel l3 = new JLabel("Host: "+m.getHost().name); content2.add(l3); + JLabel l4 = new JLabel("Size: "+m.getPlayers().size()); + content2.add(l4); JButton enter = new JButton("Enter"); content2.add(enter); enter.addActionListener(e2 -> { From ef159cbe9c9daa3a47e888b5cc81dfe8352be4c8 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Thu, 17 Nov 2022 23:14:37 +0100 Subject: [PATCH 24/55] Small bugfix --- .../org/example/controller/FriendlyModeController.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index d285b05..77ef2fc 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -26,13 +26,15 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match content.setLayout(new GridLayout((newMatches.size()),1)); for(Match m : newMatches){ JPanel content2 = new JPanel(); - content2.setLayout(new GridLayout(5,1)); + content2.setLayout(new GridLayout(6,1)); JLabel l1 = new JLabel("Match: "+m.getName()); content2.add(l1); - JLabel l2 = new JLabel("Host: "+m.getHost()); + JLabel l2 = new JLabel("Mode: "+m.getType()); content2.add(l2); - JLabel l3 = new JLabel("Size: "+m.getPlayers().size()); + JLabel l3 = new JLabel("Host: "+m.getHost().name); content2.add(l3); + JLabel l4 = new JLabel("Size: "+m.getPlayers().size()); + content2.add(l4); JButton enter = new JButton("Enter"); content2.add(enter); enter.addActionListener(e2 -> { From 139d2d26012b35b20e0002e26606d6c93b49a28b Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Fri, 18 Nov 2022 10:16:38 +0100 Subject: [PATCH 25/55] Fix --- src/main/java/org/example/Main.java | 4 ---- src/main/java/org/example/controller/RoomController.java | 7 +++++-- src/main/java/org/example/view/LoginView.java | 1 + src/main/java/org/example/view/ModeView.java | 4 +++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index bb9b979..83f0f90 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -7,10 +7,6 @@ import java.io.InputStreamReader; import java.net.Socket; -//TODO: GESTIRE PRONTO NON PRONTO SU INTERFACCIA FRIENDLY, SE TUTTI I GIOCATORI NEL MATCH SONO READY FAR PARTIRE TIMER START DI TIPO X SECONDI -//TODO: IMPLEMENTARE TIMER MASSIMO PARTITA FRIENDLY -//TODO: IMPLEMENTARE TOURNAMENT MODE -//TODO: IMPLEMENTARE TEST CASES SU SOCKET E VEDERE CHE RISPONDANO QUANTO CI SI ASPETTI public class Main { diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index d5bd342..835cf37 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -21,11 +21,11 @@ public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, J if(!match.getHost().name.equals(name)){ back.setText("Exit"); } - System.out.println(match); + Timer t2 = new Timer(); TimerTask tt = new TimerTask() { AtomicBoolean startAdded = new AtomicBoolean(false); AtomicInteger timerStart = new AtomicInteger(0); - Timer t2 = new Timer(); + @Override public void run() { Message responsef = sender.sendAndRead(new Message<>(name, "UPDATE_PLAYERS",match.getName())); @@ -82,12 +82,14 @@ public void run() { frame.repaint(); } }else{ + t2.cancel(); t.cancel(); frame.remove(panel); frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); frame.validate(); } }else{ + t2.cancel(); t.cancel(); frame.remove(panel); frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); @@ -103,6 +105,7 @@ public void run() { Message response = sender.sendAndRead(new Message(name, "MATCH_REMOVER",match.getName())); if(response != null && response.getMessage() != null && response.getEvent().equals("MATCH_REMOVER") && response.getMessage().equals("ok")){ t.cancel(); + t2.cancel(); frame.remove(panel); frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); frame.validate(); diff --git a/src/main/java/org/example/view/LoginView.java b/src/main/java/org/example/view/LoginView.java index 92c4976..ccd3bcd 100644 --- a/src/main/java/org/example/view/LoginView.java +++ b/src/main/java/org/example/view/LoginView.java @@ -45,6 +45,7 @@ public LoginView(JFrame frame, Sender sender, MatchChecker mm){ login.add(username,c); JSeparator sp = new JSeparator(); + sp.setPreferredSize(new Dimension(400,1)); c.gridx = 0; c.gridy = 4; login.add(sp,c); diff --git a/src/main/java/org/example/view/ModeView.java b/src/main/java/org/example/view/ModeView.java index a2863e8..615f874 100644 --- a/src/main/java/org/example/view/ModeView.java +++ b/src/main/java/org/example/view/ModeView.java @@ -48,10 +48,12 @@ private void print(JFrame frame, String name, Sender sender, MatchChecker mm){ mode.add(el,gcc); i++; } + + JButton select = new JButton("Select"); select.setPreferredSize(new Dimension(120,40)); gcc.gridx = 0; - gcc.gridy = 5; + gcc.gridy = 6; mode.add(select,gcc); From 1e814026fe0fd0721222dee68586a22ec88a954b Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Fri, 18 Nov 2022 11:24:49 +0100 Subject: [PATCH 26/55] Started doing tournament mode --- .../controller/MatchCreatorController.java | 6 ++-- .../example/controller/ModeController.java | 2 +- .../org/example/view/MatchCreatorView.java | 30 +++++++++++-------- src/main/java/org/example/view/ModeView.java | 3 +- src/main/java/org/example/view/RoomView.java | 18 +++++++---- 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index 4cece18..6e9b6a8 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -11,7 +11,7 @@ import java.util.ArrayList; public class MatchCreatorController { - public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, JSpinner maxSize, JSpinner timeMatch, JSpinner questionsSize, ArrayList matches, Sender sender, MatchChecker mm){ + public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, JButton back, JButton create, String name, JSpinner maxSize, JSpinner timeMatch, JSpinner questionsSize, JComboBox modeList, ArrayList matches, Sender sender, MatchChecker mm){ create.addActionListener(e -> { String nameM = nameMatch.getText(); if(nameM != null && nameM.length() > 0){ @@ -19,10 +19,10 @@ public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, if(response.getMessage() != null && response.getMessage().equals("Y")){ JOptionPane.showMessageDialog(frame,"Game match already used!","Warning!",JOptionPane.WARNING_MESSAGE); }else{ - Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM+":"+maxSize.getValue()+":"+timeMatch.getValue()+":"+questionsSize.getValue())); + Message response2 = sender.sendAndRead(new Message(name, "CREATE",nameM+":"+maxSize.getValue()+":"+timeMatch.getValue()+":"+questionsSize.getValue()+":"+modeList.getSelectedItem())); if(response2.getMessage() != null){ Match match = (Match) response2.getMessage(); - mm.setType("friendly"); + mm.setType((String) modeList.getSelectedItem()); mm.setGoingOn(true); frame.remove(panel); frame.add(new RoomView(frame, name, matches,match, sender, mm,false, (Integer) timeMatch.getValue(), (Integer) questionsSize.getValue()).getPanel()); diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index 5abd9b9..c58ee40 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -41,7 +41,7 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li frame.validate(); } break; - case "friendly mode": + case "friendly/tournament mode": mm.setType("friendly"); Message responsef = sender.sendAndRead(new Message<>(name, "START","friendly")); if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() != null && responsef.getMessage() instanceof ArrayList){ diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index 942026f..5800298 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -21,14 +21,12 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen gcc.insets = new Insets(5,5,5,5); JLabel title = new JLabel("Create a new match"); - gcc.ipady = 60; Font font = title.getFont(); title.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); gcc.gridx = 0; gcc.gridy = 0; panel.add(title,gcc); - gcc.ipady = 0; JLabel description = new JLabel("Name of the match: "); gcc.gridy = 2; @@ -38,41 +36,49 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen gcc.gridy = 3; panel.add(nameMatch,gcc); - JLabel description2 = new JLabel("Maximum number of people allowed: "); + JLabel description1 = new JLabel("Type of the match:"); gcc.gridy = 4; + panel.add(description1,gcc); + + JComboBox modeList = new JComboBox(new String[]{"friendly","tournament"}); + modeList.setSelectedIndex(0); + gcc.gridy = 5; + panel.add(modeList,gcc); + + JLabel description2 = new JLabel("Maximum number of people allowed: "); + gcc.gridy = 6; panel.add(description2,gcc); SpinnerModel people = new SpinnerNumberModel(4,1,10,1); JSpinner maxSize = new JSpinner(people); - gcc.gridy = 5; + gcc.gridy = 7; panel.add(maxSize,gcc); JLabel description3 = new JLabel("Maximum duration of the match in minutes:"); - gcc.gridy = 6; + gcc.gridy = 8; panel.add(description3,gcc); SpinnerModel time = new SpinnerNumberModel(2,2,10,2); JSpinner timeMatch = new JSpinner(time); - gcc.gridy = 7; + gcc.gridy = 9; panel.add(timeMatch,gcc); JLabel description4 = new JLabel("Numbers of questions of the match:"); - gcc.gridy = 8; + gcc.gridy = 10; panel.add(description4,gcc); SpinnerModel questions = new SpinnerNumberModel(5,5,15,1); JSpinner questionsSize = new JSpinner(questions); - gcc.gridy = 9; + gcc.gridy = 11; panel.add(questionsSize,gcc); JSeparator sp = new JSeparator(); - gcc.gridy = 10; + gcc.gridy = 12; panel.add(sp,gcc); JPanel pp = new JPanel(); pp.setLayout(new GridBagLayout()); - gcc.gridx = 0; - gcc.gridy = 11; + gcc.gridy = 13; panel.add(pp,gcc); JButton create = new JButton("Create"); @@ -87,7 +93,7 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen gcc.gridy = 0; pp.add(back,gcc); - MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,timeMatch,questionsSize, matches, sender, mm); + MatchCreatorController mc = new MatchCreatorController(frame,panel,nameMatch, back, create, name,maxSize,timeMatch,questionsSize, modeList, matches, sender, mm); panel.setVisible(true); diff --git a/src/main/java/org/example/view/ModeView.java b/src/main/java/org/example/view/ModeView.java index 615f874..7c8f46a 100644 --- a/src/main/java/org/example/view/ModeView.java +++ b/src/main/java/org/example/view/ModeView.java @@ -37,8 +37,7 @@ private void print(JFrame frame, String name, Sender sender, MatchChecker mm){ JRadioButton[] list = new JRadioButton[]{ new JRadioButton("Practice Mode", true), - new JRadioButton("Friendly Mode"), - new JRadioButton("Tournament Mode")}; + new JRadioButton("Friendly/Tournament Mode")}; ButtonGroup group = new ButtonGroup(); int i = 2; for(JRadioButton el : list){ diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index fda7bcc..8b95f30 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -32,24 +32,30 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match gcc.ipady = 0; - JLabel description = new JLabel("Max size: "+match.getSize()); + JLabel description0 = new JLabel("Mode: "+match.getType()); gcc.gridx = 0; gcc.gridy = 1; + panel.add(description0,gcc); + + + JLabel description = new JLabel("Max size: "+match.getSize()); + gcc.gridx = 0; + gcc.gridy = 2; panel.add(description,gcc); JLabel questionsLabel = new JLabel("Number of questions: "+questions); gcc.gridx = 0; - gcc.gridy = 2; + gcc.gridy = 3; panel.add(questionsLabel,gcc); JLabel durationLabel = new JLabel("Maximum duration in minutes: "+time+":00"); gcc.gridx = 0; - gcc.gridy = 3; + gcc.gridy = 4; panel.add(durationLabel,gcc); JLabel title = new JLabel("Players:"); gcc.gridx = 0; - gcc.gridy = 4; + gcc.gridy = 5; panel.add(title,gcc); JPanel content = new JPanel(); @@ -76,14 +82,14 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match } scrollable.setViewportView(content); gcc.gridx = 0; - gcc.gridy = 5; + gcc.gridy = 6; panel.add(scrollable,gcc); JPanel pp = new JPanel(); pp.setLayout(new GridBagLayout()); gcc.gridx = 0; - gcc.gridy = 6; + gcc.gridy = 7; panel.add(pp,gcc); JButton start = null; From 89337717b9546120b4ebbcfce5ffb10c09c13a65 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Fri, 18 Nov 2022 22:07:04 +0100 Subject: [PATCH 27/55] Started doing tournament --- .../example/controller/ModeController.java | 2 +- .../example/controller/RoomController.java | 14 ++- .../controller/TournamentController.java | 44 +++++++++ src/main/java/org/example/model/Player.java | 5 + src/main/java/org/example/model/Question.java | 43 +++++++- .../java/org/example/view/TournamentView.java | 97 +++++++++++++++++++ 6 files changed, 199 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/example/controller/TournamentController.java create mode 100644 src/main/java/org/example/view/TournamentView.java diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index c58ee40..11658e9 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -43,7 +43,7 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li break; case "friendly/tournament mode": mm.setType("friendly"); - Message responsef = sender.sendAndRead(new Message<>(name, "START","friendly")); + Message responsef = sender.sendAndRead(new Message<>(name, "START","friendlytournament")); if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() != null && responsef.getMessage() instanceof ArrayList){ ArrayList matches = (ArrayList) responsef.getMessage(); frame.remove(mode); diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 835cf37..ac05aa4 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -5,6 +5,7 @@ import org.example.view.FriendlyModeView; import org.example.view.QuestionView; import org.example.view.RoomView; +import org.example.view.TournamentView; import javax.swing.*; import java.awt.*; @@ -42,9 +43,16 @@ public void run() { mm.setGoingOn(true); mm.setMatch(match.getName()); mm.setPosition(1); - frame.remove(panel); - frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel(), time, questions, 1).getPanel()); - frame.validate(); + if(mm.getType().equals("friendly")){ + frame.remove(panel); + frame.add(new QuestionView(frame, name, (Question) responseD.getMessage(), sender, mm, false, tQuiz, seconds, new JLabel(), time, questions, 1).getPanel()); + frame.validate(); + } else if (mm.getType().equals("tournament")) { + frame.remove(panel); + frame.add(new TournamentView(frame, name, (Question) responseD.getMessage(), sender, mm, new JLabel(), questions, 1, false).getPanel()); + frame.validate(); + } + } }else{ content.removeAll(); diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java new file mode 100644 index 0000000..5bb4c03 --- /dev/null +++ b/src/main/java/org/example/controller/TournamentController.java @@ -0,0 +1,44 @@ +package org.example.controller; + +import org.example.model.MatchChecker; +import org.example.model.Message; +import org.example.model.Question; +import org.example.model.Score; +import org.example.utils.Sender; +import org.example.view.ResultsView; +import org.example.view.TournamentView; + +import javax.swing.*; +import java.util.ArrayList; + +//TODO: TIMER MAGARI ANCHE VISIVO SU QUANTO TEMPO IL MATCH DURA PER IL SINGOLO GIOCATORE +//TODO: POTREI FARE TIMER CHE PARTE DA ZERO PER OGNI QUESTION E MISURA QUANTO TEMPO CI METTE A RISPONDERE AD OGNI DOMANDA +//TODO: AL TERMINE VIENE FATTA LA SOMMA ED A PARITA' DI PUNTI VIENE DECRETATO IL MIGLIORE + +public class TournamentController { + public TournamentController(JFrame frame, JPanel question, JButton jb, ArrayList list, Question q, String name, Sender sender, MatchChecker mm, JLabel timeLabel, int questions, int iterator){ + jb.addActionListener(e -> { + String value = null; + for(JRadioButton el : list){ + if(el.isSelected()){ + value = el.getText(); + break; + } + } + q.checkAnswer(value); + Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); + switch (response.getEvent().toLowerCase()){ + case "game": + frame.remove(question); + Question newQuestion = (Question) response.getMessage(); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); + frame.validate(); + break; + case "end": + //printScoresFriendly(frame, question, response, name, sender, mm); + break; + } + }); + } + +} diff --git a/src/main/java/org/example/model/Player.java b/src/main/java/org/example/model/Player.java index a03e1c6..542fbb5 100644 --- a/src/main/java/org/example/model/Player.java +++ b/src/main/java/org/example/model/Player.java @@ -108,7 +108,12 @@ public int hashCode() { public String toString() { return "Player{" + "name='" + name + '\'' + + ", questions=" + questions + + ", hasFinished=" + hasFinished + + ", score=" + score + ", id=" + id + + ", ready=" + ready + + ", indexLastQuestion=" + indexLastQuestion + '}'; } } \ No newline at end of file diff --git a/src/main/java/org/example/model/Question.java b/src/main/java/org/example/model/Question.java index 4b3fff9..94344cc 100644 --- a/src/main/java/org/example/model/Question.java +++ b/src/main/java/org/example/model/Question.java @@ -1,15 +1,32 @@ package org.example.model; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; public class Question implements Serializable { - public String quest, answer, given; + public String quest, answer, given,wrong1,wrong2,wrong3,wrong4; public boolean correct; public Question(String quest, String answer){ this.quest = quest; this.answer = answer; this.correct = false; this.given = null; + this.wrong1 = null; + this.wrong2 = null; + this.wrong3 = null; + this.wrong4 = null; + } + + public Question(String quest, String answer, String wrong1, String wrong2, String wrong3, String wrong4){ + this.quest = quest; + this.answer = answer; + this.correct = false; + this.given = null; + this.wrong1 = wrong1; + this.wrong2 = wrong2; + this.wrong3 = wrong3; + this.wrong4 = wrong4; } public final boolean checkAnswer(String answer){ @@ -23,6 +40,28 @@ public final boolean checkAnswer(String answer){ @Override public String toString() { - return this.quest; + return "Question{" + + "quest='" + quest + '\'' + + ", answer='" + answer + '\'' + + ", given='" + given + '\'' + + ", wrong1='" + wrong1 + '\'' + + ", wrong2='" + wrong2 + '\'' + + ", wrong3='" + wrong3 + '\'' + + ", wrong4='" + wrong4 + '\'' + + ", correct=" + correct + + '}'; + } + + public ArrayList getAllAnswers(){ + ArrayList answers = new ArrayList<>(); + answers.add(answer); + if(wrong1 != null && wrong2 != null && wrong3 != null && wrong4 != null){ + answers.add(wrong1); + answers.add(wrong2); + answers.add(wrong3); + answers.add(wrong4); + } + Collections.shuffle(answers); + return answers; } } diff --git a/src/main/java/org/example/view/TournamentView.java b/src/main/java/org/example/view/TournamentView.java new file mode 100644 index 0000000..71da4aa --- /dev/null +++ b/src/main/java/org/example/view/TournamentView.java @@ -0,0 +1,97 @@ +package org.example.view; + +import org.example.controller.QuestionController; +import org.example.controller.TournamentController; +import org.example.model.MatchChecker; +import org.example.model.Question; +import org.example.utils.Sender; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; + +public class TournamentView { + JPanel question; + public TournamentView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, JLabel timeLabel, int questions, int iterator, boolean casistic){ + question = new JPanel(); + question.setLayout(new GridBagLayout()); + + GridBagConstraints gcc = new GridBagConstraints(); + gcc.anchor = GridBagConstraints.CENTER; + + gcc.insets = new Insets(5,5,5,5); + + JButton sendButton = null; + ArrayList elements = new ArrayList<>(); + + if(!casistic){ + if(timeLabel != null){ + gcc.gridx = 0; + gcc.gridy = 0; + gcc.ipady=60; + question.add(timeLabel,gcc); + + } + gcc.ipady=0; + JLabel questionLabel = new JLabel("Question "+iterator+": "); + gcc.gridx = 0; + gcc.gridy = 1; + question.add(questionLabel,gcc); + + JLabel questionLabel2 = new JLabel(q.quest); + Font font = questionLabel2.getFont(); + questionLabel2.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + gcc.gridx = 0; + gcc.gridy = 2; + question.add(questionLabel2,gcc); + + ArrayList answers = q.getAllAnswers(); + + for(String ans : answers){ + elements.add(new JRadioButton(ans)); + } + ButtonGroup group = new ButtonGroup(); + int i = 3; + gcc.anchor = GridBagConstraints.WEST; + for(JRadioButton el : elements){ + group.add(el); + gcc.gridx = 0; + gcc.gridy = i; + question.add(el,gcc); + i++; + } + gcc.anchor = GridBagConstraints.CENTER; + JSeparator sp = new JSeparator(); + gcc.gridx = 0; + gcc.gridy = 8; + + question.add(sp,gcc); + + sendButton = new JButton("Send answer"); + gcc.gridx = 0; + gcc.gridy = 9; + sendButton.setPreferredSize(new Dimension(120,50)); + question.add(sendButton,gcc); + + mm.setQuestion(q); + mm.setPosition(iterator); + }else{ + JLabel waiting = new JLabel("Waiting for the other players"); + question.add(waiting); + } + + question.setVisible(true); + TournamentController tc = new TournamentController(frame, question,sendButton,elements,q,name,sender,mm,timeLabel,questions,iterator); + + + } + + public JPanel getPanel(){ + return question; + } +} From 26e29f3dcc28a0544ee03571c359271961d1680d Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sat, 19 Nov 2022 13:30:08 +0100 Subject: [PATCH 28/55] fix on tournament --- .../controller/TournamentController.java | 72 +++++++++++++++---- src/main/java/org/example/model/Question.java | 24 +++++++ src/main/java/org/example/model/Score.java | 7 ++ .../org/example/view/MatchCreatorView.java | 3 +- 4 files changed, 93 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java index 5bb4c03..f1ecfa0 100644 --- a/src/main/java/org/example/controller/TournamentController.java +++ b/src/main/java/org/example/controller/TournamentController.java @@ -10,14 +10,46 @@ import javax.swing.*; import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; //TODO: TIMER MAGARI ANCHE VISIVO SU QUANTO TEMPO IL MATCH DURA PER IL SINGOLO GIOCATORE //TODO: POTREI FARE TIMER CHE PARTE DA ZERO PER OGNI QUESTION E MISURA QUANTO TEMPO CI METTE A RISPONDERE AD OGNI DOMANDA //TODO: AL TERMINE VIENE FATTA LA SOMMA ED A PARITA' DI PUNTI VIENE DECRETATO IL MIGLIORE public class TournamentController { + private final int DEFAULT_QUESTION_TIME = 30; public TournamentController(JFrame frame, JPanel question, JButton jb, ArrayList list, Question q, String name, Sender sender, MatchChecker mm, JLabel timeLabel, int questions, int iterator){ + Timer t = new Timer(); + AtomicInteger seconds = new AtomicInteger(DEFAULT_QUESTION_TIME); + TimerTask tt = new TimerTask() { + @Override + public void run() { + int got = seconds.decrementAndGet(); + if(got < 10) timeLabel.setText("Time remained for this question: 00:0"+got); + else timeLabel.setText("Time remained for this question: 00:"+got); + if(got == 0){ //30 seconds is the max time a question can take by default + t.cancel(); + Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); + switch (response.getEvent().toLowerCase()){ + case "game": + frame.remove(question); + Question newQuestion = (Question) response.getMessage(); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); + frame.validate(); + break; + case "end": + //printScoresFriendly(frame, question, response, name, sender, mm); + break; + } + } + } + }; + t.scheduleAtFixedRate(tt,10,1000); + jb.addActionListener(e -> { + t.cancel(); String value = null; for(JRadioButton el : list){ if(el.isSelected()){ @@ -26,18 +58,34 @@ public TournamentController(JFrame frame, JPanel question, JButton jb, ArrayList } } q.checkAnswer(value); - Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); - switch (response.getEvent().toLowerCase()){ - case "game": - frame.remove(question); - Question newQuestion = (Question) response.getMessage(); - frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); - frame.validate(); - break; - case "end": - //printScoresFriendly(frame, question, response, name, sender, mm); - break; - } + q.setSeconds(DEFAULT_QUESTION_TIME-seconds.get()); + Timer t2 = new Timer(); + TimerTask tt2 = new TimerTask() { + @Override + public void run() { + Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); + Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); + switch (response2.getEvent().toLowerCase()){ + case "game": + if(response1.getMessage().equals("no")){ + frame.remove(question); + frame.add(new TournamentView(frame, name, null, sender, mm, null,questions, iterator,true).getPanel()); + frame.validate(); + }else{ + t2.cancel(); + frame.remove(question); + Question newQuestion = (Question) response2.getMessage(); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); + frame.validate(); + } + break; + case "end": + //printScoresFriendly(frame, question, response, name, sender, mm); + break; + } + } + }; + t2.scheduleAtFixedRate(tt2,10,1000); }); } diff --git a/src/main/java/org/example/model/Question.java b/src/main/java/org/example/model/Question.java index 94344cc..c6769d9 100644 --- a/src/main/java/org/example/model/Question.java +++ b/src/main/java/org/example/model/Question.java @@ -3,10 +3,13 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; public class Question implements Serializable { public String quest, answer, given,wrong1,wrong2,wrong3,wrong4; public boolean correct; + public int seconds; //Seconds passed in order to give the answer public Question(String quest, String answer){ this.quest = quest; this.answer = answer; @@ -29,6 +32,14 @@ public Question(String quest, String answer, String wrong1, String wrong2, Strin this.wrong4 = wrong4; } + public int getSeconds() { + return seconds; + } + + public void setSeconds(int seconds) { + this.seconds = seconds; + } + public final boolean checkAnswer(String answer){ String newString = answer.toLowerCase().replaceAll("\\s+",""); if(newString.equals(this.answer.toLowerCase())){ @@ -64,4 +75,17 @@ public ArrayList getAllAnswers(){ Collections.shuffle(answers); return answers; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Question question = (Question) o; + return this.quest.equals((question.quest)); + } + + @Override + public int hashCode() { + return Objects.hash(quest, answer, given, wrong1, wrong2, wrong3, wrong4, correct, seconds); + } } diff --git a/src/main/java/org/example/model/Score.java b/src/main/java/org/example/model/Score.java index 507b068..0449f00 100644 --- a/src/main/java/org/example/model/Score.java +++ b/src/main/java/org/example/model/Score.java @@ -45,6 +45,13 @@ public void addQuestion(Question q){ this.questions.add(q); } + public boolean containQuestion(Question q){ + for(Question qq : this.questions){ + if(qq.equals(q)) + return true; + } + return false; + } @Override public String toString() { return "Score{" + diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index 5800298..a5eb549 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -63,11 +63,12 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen gcc.gridy = 9; panel.add(timeMatch,gcc); + JLabel description4 = new JLabel("Numbers of questions of the match:"); gcc.gridy = 10; panel.add(description4,gcc); - SpinnerModel questions = new SpinnerNumberModel(5,5,15,1); + SpinnerModel questions = new SpinnerNumberModel(5,5,15,5); JSpinner questionsSize = new JSpinner(questions); gcc.gridy = 11; panel.add(questionsSize,gcc); From 44c69393ca812a1f4343d9ab07fb8974db288bf0 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sat, 19 Nov 2022 14:00:57 +0100 Subject: [PATCH 29/55] fix --- src/main/java/org/example/controller/FriendlyModeController.java | 1 + src/main/java/org/example/controller/ModeController.java | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 77ef2fc..3274446 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -38,6 +38,7 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match JButton enter = new JButton("Enter"); content2.add(enter); enter.addActionListener(e2 -> { + mm.setType(m.getType()); Message response = sender.sendAndRead(new Message<>(name, "GET_IN",m.getName())); if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); diff --git a/src/main/java/org/example/controller/ModeController.java b/src/main/java/org/example/controller/ModeController.java index 11658e9..26d6c23 100644 --- a/src/main/java/org/example/controller/ModeController.java +++ b/src/main/java/org/example/controller/ModeController.java @@ -42,7 +42,6 @@ private void controller(JFrame frame, JPanel mode, JButton jb, JRadioButton[] li } break; case "friendly/tournament mode": - mm.setType("friendly"); Message responsef = sender.sendAndRead(new Message<>(name, "START","friendlytournament")); if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() != null && responsef.getMessage() instanceof ArrayList){ ArrayList matches = (ArrayList) responsef.getMessage(); From 7e4c30cf4e6f185173276039d34d6384b1e80e3e Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sat, 19 Nov 2022 14:05:47 +0100 Subject: [PATCH 30/55] fix --- .../java/org/example/controller/FriendlyModeController.java | 2 +- src/main/java/org/example/view/FriendlyModeView.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 3274446..64b5f14 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -38,10 +38,10 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match JButton enter = new JButton("Enter"); content2.add(enter); enter.addActionListener(e2 -> { - mm.setType(m.getType()); Message response = sender.sendAndRead(new Message<>(name, "GET_IN",m.getName())); if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); + mm.setType(mGet.getType()); frame.remove(panel); frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false,mGet.getTime(),mGet.getNumberQuestions()).getPanel()); frame.validate(); diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index 40e0383..311e7e9 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -112,6 +112,7 @@ private void print(ArrayList matches, Sender sender, String name, JFrame Message response = sender.sendAndRead(new Message<>(name, "GET_IN",m.getName())); if(response != null && response.getMessage() != null && response.getEvent().equals("GET_IN") && response.getMessage() instanceof Match){ Match mGet = (Match) response.getMessage(); + mm.setType(mGet.getType()); frame.remove(panel); frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false, mGet.getTime(),mGet.getNumberQuestions()).getPanel()); frame.validate(); From 9fff0e8542f76c7538f89d66c354b5dbf3fa1348 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sat, 19 Nov 2022 16:19:44 +0100 Subject: [PATCH 31/55] Fix --- .../controller/TournamentController.java | 134 ++++++++++-------- .../java/org/example/view/TournamentView.java | 2 +- 2 files changed, 76 insertions(+), 60 deletions(-) diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java index f1ecfa0..35c98f1 100644 --- a/src/main/java/org/example/controller/TournamentController.java +++ b/src/main/java/org/example/controller/TournamentController.java @@ -3,9 +3,7 @@ import org.example.model.MatchChecker; import org.example.model.Message; import org.example.model.Question; -import org.example.model.Score; import org.example.utils.Sender; -import org.example.view.ResultsView; import org.example.view.TournamentView; import javax.swing.*; @@ -20,73 +18,91 @@ public class TournamentController { private final int DEFAULT_QUESTION_TIME = 30; - public TournamentController(JFrame frame, JPanel question, JButton jb, ArrayList list, Question q, String name, Sender sender, MatchChecker mm, JLabel timeLabel, int questions, int iterator){ - Timer t = new Timer(); - AtomicInteger seconds = new AtomicInteger(DEFAULT_QUESTION_TIME); - TimerTask tt = new TimerTask() { - @Override - public void run() { - int got = seconds.decrementAndGet(); - if(got < 10) timeLabel.setText("Time remained for this question: 00:0"+got); - else timeLabel.setText("Time remained for this question: 00:"+got); - if(got == 0){ //30 seconds is the max time a question can take by default - t.cancel(); - Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); - switch (response.getEvent().toLowerCase()){ - case "game": - frame.remove(question); - Question newQuestion = (Question) response.getMessage(); - frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); - frame.validate(); - break; - case "end": - //printScoresFriendly(frame, question, response, name, sender, mm); - break; + public TournamentController(JFrame frame, JPanel question, JButton jb, ArrayList list, Question q, String name, Sender sender, MatchChecker mm, JLabel timeLabel, int questions, int iterator, boolean casistic){ + if(!casistic){ + Timer t = new Timer(); + AtomicInteger seconds = new AtomicInteger(DEFAULT_QUESTION_TIME); + TimerTask tt = new TimerTask() { + @Override + public void run() { + int got = seconds.decrementAndGet(); + if(got < 10) timeLabel.setText("Time remained for this question: 00:0"+got); + else timeLabel.setText("Time remained for this question: 00:"+got); + if(got == 0){ //30 seconds is the max time a question can take by default + t.cancel(); + Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); + switch (response.getEvent().toLowerCase()){ + case "game": + frame.remove(question); + Question newQuestion = (Question) response.getMessage(); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); + frame.validate(); + break; + case "end": + //printScoresFriendly(frame, question, response, name, sender, mm); + break; + } } } - } - }; - t.scheduleAtFixedRate(tt,10,1000); + }; + t.scheduleAtFixedRate(tt,10,1000); - jb.addActionListener(e -> { - t.cancel(); - String value = null; - for(JRadioButton el : list){ - if(el.isSelected()){ - value = el.getText(); - break; + jb.addActionListener(e -> { + t.cancel(); + String value = null; + for(JRadioButton el : list){ + if(el.isSelected()){ + value = el.getText(); + break; + } } - } - q.checkAnswer(value); - q.setSeconds(DEFAULT_QUESTION_TIME-seconds.get()); - Timer t2 = new Timer(); - TimerTask tt2 = new TimerTask() { + q.checkAnswer(value); + q.setSeconds(DEFAULT_QUESTION_TIME-seconds.get()); + Timer t2 = new Timer(); + TimerTask tt2 = new TimerTask() { + @Override + public void run() { + Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); + Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); + Question newQuestion = (Question) response2.getMessage(); + switch (response2.getEvent().toLowerCase()){ + case "game": + if(response1.getMessage().equals("no")){ + t2.cancel(); + frame.remove(question); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, null,questions, iterator,true).getPanel()); + frame.validate(); + }else{ + t2.cancel(); + frame.remove(question); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); + frame.validate(); + } + break; + case "end": + //printScoresFriendly(frame, question, response, name, sender, mm); + break; + } + } + }; + t2.scheduleAtFixedRate(tt2,10,1000); + }); + }else{ + Timer t = new Timer(); + TimerTask tt = new TimerTask() { @Override public void run() { Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); - Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); - switch (response2.getEvent().toLowerCase()){ - case "game": - if(response1.getMessage().equals("no")){ - frame.remove(question); - frame.add(new TournamentView(frame, name, null, sender, mm, null,questions, iterator,true).getPanel()); - frame.validate(); - }else{ - t2.cancel(); - frame.remove(question); - Question newQuestion = (Question) response2.getMessage(); - frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); - frame.validate(); - } - break; - case "end": - //printScoresFriendly(frame, question, response, name, sender, mm); - break; + if(response1.getMessage().equals("ok")){ + t.cancel(); + frame.remove(question); + frame.add(new TournamentView(frame, name, q, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); + frame.validate(); } } }; - t2.scheduleAtFixedRate(tt2,10,1000); - }); + t.scheduleAtFixedRate(tt,10,1000); + } } } diff --git a/src/main/java/org/example/view/TournamentView.java b/src/main/java/org/example/view/TournamentView.java index 71da4aa..2e2f271 100644 --- a/src/main/java/org/example/view/TournamentView.java +++ b/src/main/java/org/example/view/TournamentView.java @@ -86,7 +86,7 @@ public TournamentView(JFrame frame, String name, Question q, Sender sender, Matc } question.setVisible(true); - TournamentController tc = new TournamentController(frame, question,sendButton,elements,q,name,sender,mm,timeLabel,questions,iterator); + TournamentController tc = new TournamentController(frame, question,sendButton,elements,q,name,sender,mm,timeLabel,questions,iterator,casistic); } From d0212c345c134f334a2d256b45c02dcf8a0a5da3 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sat, 19 Nov 2022 18:47:46 +0100 Subject: [PATCH 32/55] fix --- .../controller/TournamentController.java | 89 ++++++++++--------- .../java/org/example/view/TournamentView.java | 10 +-- 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java index 35c98f1..6c6462b 100644 --- a/src/main/java/org/example/controller/TournamentController.java +++ b/src/main/java/org/example/controller/TournamentController.java @@ -30,18 +30,9 @@ public void run() { else timeLabel.setText("Time remained for this question: 00:"+got); if(got == 0){ //30 seconds is the max time a question can take by default t.cancel(); - Message response = sender.sendAndRead(new Message<>(name, "GAME",q)); - switch (response.getEvent().toLowerCase()){ - case "game": - frame.remove(question); - Question newQuestion = (Question) response.getMessage(); - frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); - frame.validate(); - break; - case "end": - //printScoresFriendly(frame, question, response, name, sender, mm); - break; - } + frame.remove(question); + frame.add(new TournamentView(frame, name, q, sender, mm, null,questions, iterator,true).getPanel()); + frame.validate(); } } }; @@ -56,38 +47,41 @@ public void run() { break; } } - q.checkAnswer(value); - q.setSeconds(DEFAULT_QUESTION_TIME-seconds.get()); - Timer t2 = new Timer(); - TimerTask tt2 = new TimerTask() { - @Override - public void run() { - Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); - Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); - Question newQuestion = (Question) response2.getMessage(); - switch (response2.getEvent().toLowerCase()){ - case "game": - if(response1.getMessage().equals("no")){ - t2.cancel(); - frame.remove(question); - frame.add(new TournamentView(frame, name, newQuestion, sender, mm, null,questions, iterator,true).getPanel()); - frame.validate(); - }else{ - t2.cancel(); - frame.remove(question); - frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); - frame.validate(); + if(value != null){ + q.checkAnswer(value); + q.setSeconds(DEFAULT_QUESTION_TIME-seconds.get()); + Timer t2 = new Timer(); + TimerTask tt2 = new TimerTask() { + @Override + public void run() { + Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); + if(response1.getMessage().equals("no")){ + t2.cancel(); + frame.remove(question); + frame.add(new TournamentView(frame, name, q, sender, mm, null,questions, iterator,true).getPanel()); + frame.validate(); + }else{ + t2.cancel(); + Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); + Question newQuestion = (Question) response2.getMessage(); + switch (response2.getEvent().toLowerCase()){ + case "game": + t2.cancel(); + frame.remove(question); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); + frame.validate(); + break; + case "end": + break; } - break; - case "end": - //printScoresFriendly(frame, question, response, name, sender, mm); - break; + } } - } - }; - t2.scheduleAtFixedRate(tt2,10,1000); + }; + t2.scheduleAtFixedRate(tt2,10,1000); + } }); }else{ + System.out.println("Entered here"); Timer t = new Timer(); TimerTask tt = new TimerTask() { @Override @@ -95,9 +89,18 @@ public void run() { Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); if(response1.getMessage().equals("ok")){ t.cancel(); - frame.remove(question); - frame.add(new TournamentView(frame, name, q, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); - frame.validate(); + Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); + Question newQuestion = (Question) response2.getMessage(); + switch (response2.getEvent().toLowerCase()){ + case "game": + t.cancel(); + frame.remove(question); + frame.add(new TournamentView(frame, name, newQuestion, sender, mm, new JLabel(),questions, iterator+1,false).getPanel()); + frame.validate(); + break; + case "end": + break; + } } } }; diff --git a/src/main/java/org/example/view/TournamentView.java b/src/main/java/org/example/view/TournamentView.java index 2e2f271..6348cee 100644 --- a/src/main/java/org/example/view/TournamentView.java +++ b/src/main/java/org/example/view/TournamentView.java @@ -17,7 +17,7 @@ public class TournamentView { JPanel question; - public TournamentView(JFrame frame, String name, Question q, Sender sender, MatchChecker mm, JLabel timeLabel, int questions, int iterator, boolean casistic){ + public TournamentView(JFrame frame, String name, Question q1, Sender sender, MatchChecker mm, JLabel timeLabel, int questions, int iterator, boolean casistic){ question = new JPanel(); question.setLayout(new GridBagLayout()); @@ -43,14 +43,14 @@ public TournamentView(JFrame frame, String name, Question q, Sender sender, Matc gcc.gridy = 1; question.add(questionLabel,gcc); - JLabel questionLabel2 = new JLabel(q.quest); + JLabel questionLabel2 = new JLabel(q1.quest); Font font = questionLabel2.getFont(); questionLabel2.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); gcc.gridx = 0; gcc.gridy = 2; question.add(questionLabel2,gcc); - ArrayList answers = q.getAllAnswers(); + ArrayList answers = q1.getAllAnswers(); for(String ans : answers){ elements.add(new JRadioButton(ans)); @@ -78,7 +78,7 @@ public TournamentView(JFrame frame, String name, Question q, Sender sender, Matc sendButton.setPreferredSize(new Dimension(120,50)); question.add(sendButton,gcc); - mm.setQuestion(q); + mm.setQuestion(q1); mm.setPosition(iterator); }else{ JLabel waiting = new JLabel("Waiting for the other players"); @@ -86,7 +86,7 @@ public TournamentView(JFrame frame, String name, Question q, Sender sender, Matc } question.setVisible(true); - TournamentController tc = new TournamentController(frame, question,sendButton,elements,q,name,sender,mm,timeLabel,questions,iterator,casistic); + TournamentController tc = new TournamentController(frame, question,sendButton,elements,q1, name,sender,mm,timeLabel,questions,iterator,casistic); } From 657c63f8a5c6d51a1e7f5f441d79d5e8c2adae1f Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sat, 19 Nov 2022 19:00:14 +0100 Subject: [PATCH 33/55] Fixed the reload button --- .../java/org/example/controller/FriendlyModeController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index 64b5f14..f449fd3 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -19,7 +19,7 @@ public class FriendlyModeController { public FriendlyModeController(JFrame frame, JPanel panel, ArrayList matches, JButton create, JButton back, JButton reload, JPanel content, String name, Sender sender, MatchChecker mm){ reload.addActionListener(e -> { - Message responsef = sender.sendAndRead(new Message<>(name, "START","friendly")); + Message responsef = sender.sendAndRead(new Message<>(name, "START","friendlytournament")); if(responsef != null && responsef.getEvent().equals("LIST") && responsef.getMessage() instanceof ArrayList){ ArrayList newMatches = (ArrayList) responsef.getMessage(); content.removeAll(); From 4e832dd34476a6adf877068fb6f19022e62428a9 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sat, 19 Nov 2022 19:51:21 +0100 Subject: [PATCH 34/55] Started doing results of tournament --- .../controller/QuestionController.java | 9 +++-- .../ResultsTournamentController.java | 5 +++ .../org/example/view/MatchCreatorView.java | 2 +- .../example/view/ResultsTournamentView.java | 33 +++++++++++++++++++ .../java/org/example/view/ResultsView.java | 2 +- 5 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/example/controller/ResultsTournamentController.java create mode 100644 src/main/java/org/example/view/ResultsTournamentView.java diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index d58bac8..b42c4bc 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -33,7 +33,7 @@ public void run() { tQuiz.cancel(); //Delete timer if test is taking more than n/60 minutes Message response = sender.sendAndRead(new Message<>(name, "END_TIMER")); if(response != null && response.getEvent().equals("END_TIMER") && response.getMessage() != null){ - printScoresFriendly(frame, question, response, name, sender, mm); + printScoresFriendly(frame, question, name, sender, mm); } } } @@ -66,7 +66,7 @@ public void run() { case "friendly": if(tQuiz != null) tQuiz.cancel(); - printScoresFriendly(frame, question, response, name, sender, mm); + printScoresFriendly(frame, question, name, sender, mm); break; } } @@ -76,10 +76,9 @@ public void run() { } - private void printScoresFriendly(JFrame frame, JPanel question, Message response, String name, Sender sender, MatchChecker mm){ + private void printScoresFriendly(JFrame frame, JPanel question, String name, Sender sender, MatchChecker mm){ frame.remove(question); - Score score2 = (Score) response.getMessage(); - JPanel waiting = new ResultsView(frame,name,score2,sender, mm,true).getPanel(); + JPanel waiting = new ResultsView(frame,name, (Score) null,sender, mm,true).getPanel(); frame.add(waiting); frame.validate(); Timer t = new Timer(); diff --git a/src/main/java/org/example/controller/ResultsTournamentController.java b/src/main/java/org/example/controller/ResultsTournamentController.java new file mode 100644 index 0000000..bb72217 --- /dev/null +++ b/src/main/java/org/example/controller/ResultsTournamentController.java @@ -0,0 +1,5 @@ +package org.example.controller; + +public class ResultsTournamentController { + +} diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index a5eb549..f291b05 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -58,7 +58,7 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen gcc.gridy = 8; panel.add(description3,gcc); - SpinnerModel time = new SpinnerNumberModel(2,2,10,2); + SpinnerModel time = new SpinnerNumberModel(1,1,10,1); JSpinner timeMatch = new JSpinner(time); gcc.gridy = 9; panel.add(timeMatch,gcc); diff --git a/src/main/java/org/example/view/ResultsTournamentView.java b/src/main/java/org/example/view/ResultsTournamentView.java new file mode 100644 index 0000000..21d5dad --- /dev/null +++ b/src/main/java/org/example/view/ResultsTournamentView.java @@ -0,0 +1,33 @@ +package org.example.view; + +import org.example.controller.ResultsController; +import org.example.model.MatchChecker; +import org.example.model.Question; +import org.example.model.Score; +import org.example.utils.Sender; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; + +public class ResultsTournamentView { + private JPanel results; + public ResultsTournamentView(JFrame frame, String name, ArrayList scores, Sender sender, MatchChecker mm, boolean casistic){ + results = new JPanel(); + results.setLayout(new GridBagLayout()); + GridBagConstraints gcc = new GridBagConstraints(); + gcc.insets = new Insets(5,5,5,5); + gcc.anchor = GridBagConstraints.WEST; + + JLabel title = new JLabel("Results"); + gcc.gridx = 0; + gcc.gridy = 0; + results.add(title,gcc); + + results.setVisible(true); + } + + public JPanel getPanel(){ + return this.results; + } +} diff --git a/src/main/java/org/example/view/ResultsView.java b/src/main/java/org/example/view/ResultsView.java index 0f22d1e..c1e83f5 100644 --- a/src/main/java/org/example/view/ResultsView.java +++ b/src/main/java/org/example/view/ResultsView.java @@ -19,7 +19,7 @@ public ResultsView(JFrame frame, String name, Score score, Sender sender, MatchC gcc.insets = new Insets(5,5,5,5); gcc.anchor = GridBagConstraints.WEST; - if(!casistic){ + if(!casistic && score != null){ int size = score.questions.size(); JLabel scoreLabel = new JLabel("RESULTS"); From 974ac72007fe00181e0c5631d487ec75888058cc Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 15:00:44 +0100 Subject: [PATCH 35/55] Fix on tournament --- .../controller/QuestionController.java | 2 +- .../ResultsTournamentController.java | 15 ++++- .../controller/TournamentController.java | 21 ++++--- src/main/java/org/example/model/Rank.java | 55 +++++++++++++++++++ src/main/java/org/example/model/Score.java | 6 ++ .../example/view/ResultsTournamentView.java | 30 +++++++++- .../java/org/example/view/ResultsView.java | 1 + 7 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/example/model/Rank.java diff --git a/src/main/java/org/example/controller/QuestionController.java b/src/main/java/org/example/controller/QuestionController.java index b42c4bc..80d0a76 100644 --- a/src/main/java/org/example/controller/QuestionController.java +++ b/src/main/java/org/example/controller/QuestionController.java @@ -32,7 +32,7 @@ public void run() { if(i > time * 60){ tQuiz.cancel(); //Delete timer if test is taking more than n/60 minutes Message response = sender.sendAndRead(new Message<>(name, "END_TIMER")); - if(response != null && response.getEvent().equals("END_TIMER") && response.getMessage() != null){ + if(response != null && response.getEvent().equals("END_TIMER")){ printScoresFriendly(frame, question, name, sender, mm); } } diff --git a/src/main/java/org/example/controller/ResultsTournamentController.java b/src/main/java/org/example/controller/ResultsTournamentController.java index bb72217..4050c1a 100644 --- a/src/main/java/org/example/controller/ResultsTournamentController.java +++ b/src/main/java/org/example/controller/ResultsTournamentController.java @@ -1,5 +1,18 @@ package org.example.controller; -public class ResultsTournamentController { +import org.example.model.MatchChecker; +import org.example.utils.Sender; +import org.example.view.ModeView; +import javax.swing.*; + +public class ResultsTournamentController{ + public ResultsTournamentController(JFrame frame, JPanel results, JButton jb, String name, Sender sender, MatchChecker mm){ + jb.addActionListener(e -> { + frame.remove(results); + frame.add(new ModeView(frame,name,sender, mm).getPanel()); + frame.validate(); + }); + } } + diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java index 6c6462b..0f4b759 100644 --- a/src/main/java/org/example/controller/TournamentController.java +++ b/src/main/java/org/example/controller/TournamentController.java @@ -3,7 +3,9 @@ import org.example.model.MatchChecker; import org.example.model.Message; import org.example.model.Question; +import org.example.model.Rank; import org.example.utils.Sender; +import org.example.view.ResultsTournamentView; import org.example.view.TournamentView; import javax.swing.*; @@ -55,23 +57,23 @@ public void run() { @Override public void run() { Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); - if(response1.getMessage().equals("no")){ + if(response1.getMessage().equals("no")){ //I've answered clicking the button but other players haven't answered yet t2.cancel(); frame.remove(question); frame.add(new TournamentView(frame, name, q, sender, mm, null,questions, iterator,true).getPanel()); frame.validate(); - }else{ + }else{ //I've answered clicking the button and all players have already answered t2.cancel(); Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); - Question newQuestion = (Question) response2.getMessage(); switch (response2.getEvent().toLowerCase()){ case "game": - t2.cancel(); + Question newQuestion = (Question) response2.getMessage(); frame.remove(question); frame.add(new TournamentView(frame, name, newQuestion, sender, mm, timeLabel,questions, iterator+1,false).getPanel()); frame.validate(); break; case "end": + handleEndTournament(frame, question,sender, name, mm); break; } } @@ -80,8 +82,7 @@ public void run() { t2.scheduleAtFixedRate(tt2,10,1000); } }); - }else{ - System.out.println("Entered here"); + }else{ //If I've entered here I was still waiting for other players to complete the quest Timer t = new Timer(); TimerTask tt = new TimerTask() { @Override @@ -93,12 +94,12 @@ public void run() { Question newQuestion = (Question) response2.getMessage(); switch (response2.getEvent().toLowerCase()){ case "game": - t.cancel(); frame.remove(question); frame.add(new TournamentView(frame, name, newQuestion, sender, mm, new JLabel(),questions, iterator+1,false).getPanel()); frame.validate(); break; case "end": + handleEndTournament(frame, question,sender, name, mm); break; } } @@ -108,4 +109,10 @@ public void run() { } } + private void handleEndTournament(JFrame frame, JPanel question, Sender sender, String name, MatchChecker mm){ + Message response = sender.sendAndRead(new Message<>(name, "RETURN_RANK")); + frame.remove(question); + frame.add(new ResultsTournamentView(frame, name, (ArrayList) response.getMessage(), sender, mm).getPanel()); + frame.validate(); + } } diff --git a/src/main/java/org/example/model/Rank.java b/src/main/java/org/example/model/Rank.java new file mode 100644 index 0000000..e7edf4c --- /dev/null +++ b/src/main/java/org/example/model/Rank.java @@ -0,0 +1,55 @@ +package org.example.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Objects; + +public class Rank implements Comparable, Serializable { + public int points; + public String name; + public Rank(String name){ + this.name = name; + this.points = 0; + } + public Rank(String name, int points){ + this.name = name; + this.points = points; + } + + public void addOne(){ + this.points = this.points + 1; + } + public void set(int points){ + this.points = points; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Rank rank = (Rank) o; + return name.equals(rank.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + + @Override + public int compareTo(Rank o) { + if(this.points > o.points) + return 1; + if(this.points == o.points) + return 0; + return -1; + } + + @Override + public String toString() { + return "Rank{" + + "points=" + points + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/src/main/java/org/example/model/Score.java b/src/main/java/org/example/model/Score.java index 0449f00..c938ac8 100644 --- a/src/main/java/org/example/model/Score.java +++ b/src/main/java/org/example/model/Score.java @@ -52,6 +52,12 @@ public boolean containQuestion(Question q){ } return false; } + + public Question getQuestion(int i){ + if(i < questions.size()) + return this.questions.get(i); + return null; + } @Override public String toString() { return "Score{" + diff --git a/src/main/java/org/example/view/ResultsTournamentView.java b/src/main/java/org/example/view/ResultsTournamentView.java index 21d5dad..a536a84 100644 --- a/src/main/java/org/example/view/ResultsTournamentView.java +++ b/src/main/java/org/example/view/ResultsTournamentView.java @@ -1,8 +1,10 @@ package org.example.view; import org.example.controller.ResultsController; +import org.example.controller.ResultsTournamentController; import org.example.model.MatchChecker; import org.example.model.Question; +import org.example.model.Rank; import org.example.model.Score; import org.example.utils.Sender; @@ -12,7 +14,7 @@ public class ResultsTournamentView { private JPanel results; - public ResultsTournamentView(JFrame frame, String name, ArrayList scores, Sender sender, MatchChecker mm, boolean casistic){ + public ResultsTournamentView(JFrame frame, String name, ArrayList ranks, Sender sender, MatchChecker mm){ results = new JPanel(); results.setLayout(new GridBagLayout()); GridBagConstraints gcc = new GridBagConstraints(); @@ -24,6 +26,32 @@ public ResultsTournamentView(JFrame frame, String name, ArrayList scores, gcc.gridy = 0; results.add(title,gcc); + JScrollPane scrollable = new JScrollPane(); + scrollable.setPreferredSize(new Dimension(400,350)); + scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + JPanel content = new JPanel(); + content.setLayout(new GridLayout(ranks.size(),1)); + for(Rank rank : ranks){ + JPanel content2 = new JPanel(); + content2.setLayout(new GridLayout(2,1)); + JLabel namePlayer = new JLabel("User: "+rank.name); + content2.add(namePlayer); + JLabel completed = new JLabel("Points: "+rank.points); + content2.add(completed); + JSeparator sp = new JSeparator(); + content2.add(sp); + content.add(content2); + } + scrollable.setViewportView(content); + gcc.gridy = 1; + results.add(scrollable,gcc); + + JButton button = new JButton("Return to home"); + button.setPreferredSize(new Dimension(120,50)); + gcc.gridy = 2; + results.add(button,gcc); + + ResultsTournamentController rc = new ResultsTournamentController(frame, results, button, name, sender, mm); results.setVisible(true); } diff --git a/src/main/java/org/example/view/ResultsView.java b/src/main/java/org/example/view/ResultsView.java index c1e83f5..50eacd6 100644 --- a/src/main/java/org/example/view/ResultsView.java +++ b/src/main/java/org/example/view/ResultsView.java @@ -86,6 +86,7 @@ public ResultsView(JFrame frame, String name, ArrayList scores, Sender se Font font = scoreLabel.getFont(); scoreLabel.setFont(new Font(font.getFontName(),Font.BOLD,font.getSize())); + JScrollPane scrollable = new JScrollPane(); scrollable.setPreferredSize(new Dimension(400,350)); scrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); From bafbdc31138d5688edb571969edd4985e7a2047a Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 15:07:25 +0100 Subject: [PATCH 36/55] fix on tournament --- src/main/java/org/example/controller/TournamentController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java index 0f4b759..863a0fe 100644 --- a/src/main/java/org/example/controller/TournamentController.java +++ b/src/main/java/org/example/controller/TournamentController.java @@ -91,9 +91,9 @@ public void run() { if(response1.getMessage().equals("ok")){ t.cancel(); Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); - Question newQuestion = (Question) response2.getMessage(); switch (response2.getEvent().toLowerCase()){ case "game": + Question newQuestion = (Question) response2.getMessage(); frame.remove(question); frame.add(new TournamentView(frame, name, newQuestion, sender, mm, new JLabel(),questions, iterator+1,false).getPanel()); frame.validate(); From 3ec360b2210c9bdaceced92442e02f997fecff3d Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 16:10:18 +0100 Subject: [PATCH 37/55] fix --- .../example/controller/RoomController.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index ac05aa4..156ea70 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -9,8 +9,6 @@ import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; @@ -22,8 +20,8 @@ public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, J if(!match.getHost().name.equals(name)){ back.setText("Exit"); } - Timer t2 = new Timer(); - TimerTask tt = new TimerTask() { + Timer t2 = new Timer(); //T2 is the timer that checks if 5 seconds are passed if all players are ready + TimerTask tt = new TimerTask() { //It does update players AtomicBoolean startAdded = new AtomicBoolean(false); AtomicInteger timerStart = new AtomicInteger(0); @@ -33,7 +31,7 @@ public void run() { if(responsef != null && responsef.getMessage() != null && responsef.getEvent().equals("UPDATE_PLAYERS") && responsef.getMessage() instanceof Match){ Match mmm = (Match) responsef.getMessage(); if(mmm.getPlayers().size() > 0){ - if(!mmm.isAvailable()){ + if(!mmm.isAvailable()){ //Match started t.cancel(); t2.cancel(); Message responseD = sender.sendAndRead(new Message<>(name, "DROP_QUESTION",match.getName())); @@ -54,12 +52,12 @@ public void run() { } } - }else{ + }else{ //Match is not started but update request is made content.removeAll(); content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); int i = 1; int readyness = printerCicle(mmm,i,content, 0); - if(readyness == mmm.getPlayers().size()){ //TODO: FIX IN THE FUTURE + if(readyness == mmm.getPlayers().size()){ //All players are ready if(mmm.getHost().name.equals(name) && ready && !startAdded.get()){ TimerTask tt2 = new TimerTask() { @Override @@ -82,21 +80,29 @@ public void run() { }); pp.add(startNew,gcc); } - }else{ + }else{ //NOt all players are ready timerStart.set(0); + if(mmm.getPlayers().size() > 1){ + t2.cancel(); + t.cancel(); + frame.remove(panel); + frame.add(new RoomView(frame, name, matches, match, sender, mm, true, time, questions).getPanel()); + frame.validate(); + } + } content.setVisible(true); frame.revalidate(); frame.repaint(); } - }else{ + }else{ //There are no players in the room because I left t2.cancel(); t.cancel(); frame.remove(panel); frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); frame.validate(); } - }else{ + }else{ //Not valid response t2.cancel(); t.cancel(); frame.remove(panel); From 48c45f40f8c7c9f866c0ed155939b1caeb703de2 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 17:57:43 +0100 Subject: [PATCH 38/55] fix --- .../example/controller/RoomController.java | 39 +++++++++---------- src/main/java/org/example/view/RoomView.java | 21 +++++++--- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 156ea70..a5246e9 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -9,6 +9,8 @@ import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; @@ -16,12 +18,13 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, Timer t, boolean ready, int time, int questions, GridBagConstraints gcc, JPanel pp){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JButton readyB, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time, int questions, GridBagConstraints gcc, JPanel pp){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } + Timer t = new Timer(); //T is the timer that checks if players are ready or not Timer t2 = new Timer(); //T2 is the timer that checks if 5 seconds are passed if all players are ready - TimerTask tt = new TimerTask() { //It does update players + TimerTask tt = new TimerTask() { AtomicBoolean startAdded = new AtomicBoolean(false); AtomicInteger timerStart = new AtomicInteger(0); @@ -65,30 +68,17 @@ public void run() { int val = timerStart.addAndGet(1); if(val > 5){ t2.cancel(); - adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time, questions); + sender.send(new Message(name, "FRIENDLY_START",match.getName())); } } }; t2.schedule(tt2, 400,1000); startAdded.set(true); - JButton startNew = new JButton("Start match"); - startNew.setPreferredSize(new Dimension(120,50)); - gcc.gridx = 1; - gcc.gridy = 0; - startNew.addActionListener(e -> { - adderActionListener(ready, t, name, sender, frame, panel, matches, mmm, mm, time, questions); - }); - pp.add(startNew,gcc); + } }else{ //NOt all players are ready timerStart.set(0); - if(mmm.getPlayers().size() > 1){ - t2.cancel(); - t.cancel(); - frame.remove(panel); - frame.add(new RoomView(frame, name, matches, match, sender, mm, true, time, questions).getPanel()); - frame.validate(); - } + } content.setVisible(true); @@ -133,9 +123,16 @@ public void run() { } }); + readyB.addActionListener(e -> { + sender.send(new Message(name, "UPDATE_READY", true)); + readyB.setVisible(false); + start.setVisible(true); + }); + + if(start != null){ start.addActionListener(e -> { - adderActionListener(ready, t, name, sender, frame, panel, matches, match, mm, time, questions); + sender.send(new Message(name, "FRIENDLY_START",match.getName())); }); } } @@ -159,7 +156,7 @@ private int printerCicle(Match match, int i, JPanel content, int readyness){ return readyness; } - private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm, int time, int questions){ + /*private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm, int time, int questions){ if(!ready){ t.cancel(); sender.send(new Message(name, "UPDATE_READY", true)); @@ -169,5 +166,5 @@ private void adderActionListener(boolean ready, Timer t, String name, Sender sen }else{ sender.send(new Message(name, "FRIENDLY_START",match.getName())); } - } + }*/ } diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index 8b95f30..a975a57 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -15,7 +15,6 @@ public class RoomView { private JPanel panel; public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time, int questions){ - Timer t = new Timer(); panel = new JPanel(); panel.setLayout(new GridBagLayout()); GridBagConstraints gcc = new GridBagConstraints(); @@ -92,8 +91,20 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match gcc.gridy = 7; panel.add(pp,gcc); - JButton start = null; - if(!ready){ + + JButton readyB = new JButton("Ready"); + readyB.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 1; + gcc.gridy = 0; + pp.add(readyB,gcc); + + JButton start = new JButton("Start match"); + start.setPreferredSize(new Dimension(120,50)); + gcc.gridx = 1; + gcc.gridy = 0; + pp.add(start,gcc); + start.setVisible(false); + /*if(!ready){ start = new JButton("Ready"); start.setPreferredSize(new Dimension(120,50)); gcc.gridx = 1; @@ -106,7 +117,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match gcc.gridx = 1; gcc.gridy = 0; pp.add(start,gcc); - } + }*/ JButton close = new JButton("Close match"); close.setPreferredSize(new Dimension(120,50)); @@ -114,7 +125,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match gcc.gridy = 0; pp.add(close,gcc); - RoomController rc = new RoomController(frame, panel, close, start, content, name, matches, match, sender, mm, t, ready, time, questions, gcc, pp); + RoomController rc = new RoomController(frame, panel, close, start, readyB, content, name, matches, match, sender, mm, ready, time, questions, gcc, pp); panel.setVisible(true); } public JPanel getPanel(){ From 354cd4ce8eaf2083d523e85f9a519b26208bfef9 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 19:27:29 +0100 Subject: [PATCH 39/55] fix --- .../example/controller/FriendlyModeController.java | 2 +- .../example/controller/MatchCreatorController.java | 2 +- .../java/org/example/controller/RoomController.java | 13 ++++++------- .../java/org/example/view/FriendlyModeView.java | 2 +- src/main/java/org/example/view/RoomView.java | 4 ++-- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/example/controller/FriendlyModeController.java b/src/main/java/org/example/controller/FriendlyModeController.java index f449fd3..45185cc 100644 --- a/src/main/java/org/example/controller/FriendlyModeController.java +++ b/src/main/java/org/example/controller/FriendlyModeController.java @@ -43,7 +43,7 @@ public FriendlyModeController(JFrame frame, JPanel panel, ArrayList match Match mGet = (Match) response.getMessage(); mm.setType(mGet.getType()); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false,mGet.getTime(),mGet.getNumberQuestions()).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm,mGet.getTime(),mGet.getNumberQuestions()).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/controller/MatchCreatorController.java b/src/main/java/org/example/controller/MatchCreatorController.java index 6e9b6a8..ff41c7a 100644 --- a/src/main/java/org/example/controller/MatchCreatorController.java +++ b/src/main/java/org/example/controller/MatchCreatorController.java @@ -25,7 +25,7 @@ public MatchCreatorController(JFrame frame, JPanel panel, JTextField nameMatch, mm.setType((String) modeList.getSelectedItem()); mm.setGoingOn(true); frame.remove(panel); - frame.add(new RoomView(frame, name, matches,match, sender, mm,false, (Integer) timeMatch.getValue(), (Integer) questionsSize.getValue()).getPanel()); + frame.add(new RoomView(frame, name, matches,match, sender, mm, (Integer) timeMatch.getValue(), (Integer) questionsSize.getValue()).getPanel()); frame.validate(); } } diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index a5246e9..e5cfe81 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -18,7 +18,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JButton readyB, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time, int questions, GridBagConstraints gcc, JPanel pp){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JButton readyB, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, int time, int questions, GridBagConstraints gcc, JPanel pp){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } @@ -61,7 +61,8 @@ public void run() { int i = 1; int readyness = printerCicle(mmm,i,content, 0); if(readyness == mmm.getPlayers().size()){ //All players are ready - if(mmm.getHost().name.equals(name) && ready && !startAdded.get()){ + if(mmm.getHost().name.equals(name) && !startAdded.get()){ + System.out.println("2"); TimerTask tt2 = new TimerTask() { @Override public void run() { @@ -130,11 +131,9 @@ public void run() { }); - if(start != null){ - start.addActionListener(e -> { - sender.send(new Message(name, "FRIENDLY_START",match.getName())); - }); - } + start.addActionListener(e -> { + sender.send(new Message(name, "FRIENDLY_START",match.getName())); + }); } private int printerCicle(Match match, int i, JPanel content, int readyness){ diff --git a/src/main/java/org/example/view/FriendlyModeView.java b/src/main/java/org/example/view/FriendlyModeView.java index 311e7e9..fd70323 100644 --- a/src/main/java/org/example/view/FriendlyModeView.java +++ b/src/main/java/org/example/view/FriendlyModeView.java @@ -114,7 +114,7 @@ private void print(ArrayList matches, Sender sender, String name, JFrame Match mGet = (Match) response.getMessage(); mm.setType(mGet.getType()); frame.remove(panel); - frame.add(new RoomView(frame, name, matches, mGet, sender, mm, false, mGet.getTime(),mGet.getNumberQuestions()).getPanel()); + frame.add(new RoomView(frame, name, matches, mGet, sender, mm, mGet.getTime(),mGet.getNumberQuestions()).getPanel()); frame.validate(); }else{ JOptionPane.showMessageDialog(frame,"Can't join to this match!","Warning!",JOptionPane.WARNING_MESSAGE); diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index a975a57..cfc162f 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -14,7 +14,7 @@ public class RoomView { private JPanel panel; - public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, boolean ready, int time, int questions){ + public RoomView(JFrame frame, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, int time, int questions){ panel = new JPanel(); panel.setLayout(new GridBagLayout()); GridBagConstraints gcc = new GridBagConstraints(); @@ -125,7 +125,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match gcc.gridy = 0; pp.add(close,gcc); - RoomController rc = new RoomController(frame, panel, close, start, readyB, content, name, matches, match, sender, mm, ready, time, questions, gcc, pp); + RoomController rc = new RoomController(frame, panel, close, start, readyB, content, name, matches, match, sender, mm, time, questions, gcc, pp); panel.setVisible(true); } public JPanel getPanel(){ From c45c831d56a48d8e8165092d7409b52210099c31 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 20:00:56 +0100 Subject: [PATCH 40/55] fix --- .../org/example/controller/RoomController.java | 14 +++++++++----- src/main/java/org/example/view/RoomView.java | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index e5cfe81..1500c19 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -18,7 +18,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JButton readyB, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, int time, int questions, GridBagConstraints gcc, JPanel pp){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JButton readyB, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, int time, int questions){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } @@ -58,11 +58,9 @@ public void run() { }else{ //Match is not started but update request is made content.removeAll(); content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); - int i = 1; - int readyness = printerCicle(mmm,i,content, 0); + int readyness = printerCicle(mmm,1,content); if(readyness == mmm.getPlayers().size()){ //All players are ready if(mmm.getHost().name.equals(name) && !startAdded.get()){ - System.out.println("2"); TimerTask tt2 = new TimerTask() { @Override public void run() { @@ -105,6 +103,11 @@ public void run() { }; t.scheduleAtFixedRate(tt,10,500); + + + + + back.addActionListener(e -> { if(match.getHost().name.equals(name)){ Message response = sender.sendAndRead(new Message(name, "MATCH_REMOVER",match.getName())); @@ -136,7 +139,8 @@ public void run() { }); } - private int printerCicle(Match match, int i, JPanel content, int readyness){ + private int printerCicle(Match match, int i, JPanel content){ + int readyness = 0; for(Player p : match.getPlayers()){ JPanel contentPl = new JPanel(); JLabel el1 = new JLabel(i+". Name: "); diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index cfc162f..77cdeff 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -125,7 +125,7 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match gcc.gridy = 0; pp.add(close,gcc); - RoomController rc = new RoomController(frame, panel, close, start, readyB, content, name, matches, match, sender, mm, time, questions, gcc, pp); + RoomController rc = new RoomController(frame, panel, close, start, readyB, content, name, matches, match, sender, mm, time, questions); panel.setVisible(true); } public JPanel getPanel(){ From 2b70dbdb1efd1ad1f382e3b40d8dd90111ba56a3 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 20:11:28 +0100 Subject: [PATCH 41/55] fix --- .../example/controller/RoomController.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 1500c19..52cee9d 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -60,6 +60,7 @@ public void run() { content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); int readyness = printerCicle(mmm,1,content); if(readyness == mmm.getPlayers().size()){ //All players are ready + start.setVisible(true); if(mmm.getHost().name.equals(name) && !startAdded.get()){ TimerTask tt2 = new TimerTask() { @Override @@ -77,8 +78,9 @@ public void run() { } }else{ //NOt all players are ready timerStart.set(0); - - + if(mmm.getHost().equals(name)){ + start.setVisible(false); + } } content.setVisible(true); frame.revalidate(); @@ -140,7 +142,7 @@ public void run() { } private int printerCicle(Match match, int i, JPanel content){ - int readyness = 0; + int readiness = 0; for(Player p : match.getPlayers()){ JPanel contentPl = new JPanel(); JLabel el1 = new JLabel(i+". Name: "); @@ -152,22 +154,10 @@ private int printerCicle(Match match, int i, JPanel content){ contentPl.add(sp); i++; if(p.isReady()) - readyness++; + readiness++; contentPl.setVisible(true); content.add(contentPl); } - return readyness; + return readiness; } - - /*private void adderActionListener(boolean ready, Timer t, String name, Sender sender, JFrame frame, JPanel panel, ArrayList matches, Match match, MatchChecker mm, int time, int questions){ - if(!ready){ - t.cancel(); - sender.send(new Message(name, "UPDATE_READY", true)); - frame.remove(panel); - frame.add(new RoomView(frame, name, matches, match, sender, mm, true, time, questions).getPanel()); - frame.validate(); - }else{ - sender.send(new Message(name, "FRIENDLY_START",match.getName())); - } - }*/ } From 95cbd3328100f4a50d38c39fb288824d4a4cdb84 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 20:28:39 +0100 Subject: [PATCH 42/55] fix --- src/main/java/org/example/controller/RoomController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 52cee9d..86b7cba 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -78,7 +78,7 @@ public void run() { } }else{ //NOt all players are ready timerStart.set(0); - if(mmm.getHost().equals(name)){ + if(mmm.getHost().name.equals(name)){ start.setVisible(false); } } @@ -132,7 +132,8 @@ public void run() { readyB.addActionListener(e -> { sender.send(new Message(name, "UPDATE_READY", true)); readyB.setVisible(false); - start.setVisible(true); + if(match.getHost().name.equals(name)) + start.setVisible(true); }); From fc0394727e25c9b2b4678632ac00a46888c67dd3 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 20:31:30 +0100 Subject: [PATCH 43/55] fix --- src/main/java/org/example/controller/RoomController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 86b7cba..082528f 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -25,7 +25,6 @@ public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, J Timer t = new Timer(); //T is the timer that checks if players are ready or not Timer t2 = new Timer(); //T2 is the timer that checks if 5 seconds are passed if all players are ready TimerTask tt = new TimerTask() { - AtomicBoolean startAdded = new AtomicBoolean(false); AtomicInteger timerStart = new AtomicInteger(0); @Override @@ -60,8 +59,8 @@ public void run() { content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); int readyness = printerCicle(mmm,1,content); if(readyness == mmm.getPlayers().size()){ //All players are ready - start.setVisible(true); - if(mmm.getHost().name.equals(name) && !startAdded.get()){ + if(mmm.getHost().name.equals(name)){ + start.setVisible(true); TimerTask tt2 = new TimerTask() { @Override public void run() { @@ -73,7 +72,6 @@ public void run() { } }; t2.schedule(tt2, 400,1000); - startAdded.set(true); } }else{ //NOt all players are ready From 7483d2b54f3ada66dae230f3bab0a7134151cf65 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 20:57:35 +0100 Subject: [PATCH 44/55] Fixes on roomview --- .../example/controller/RoomController.java | 19 ++++++++++--------- src/main/java/org/example/view/RoomView.java | 10 +++++++++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 082528f..7f13a98 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -4,28 +4,24 @@ import org.example.utils.Sender; import org.example.view.FriendlyModeView; import org.example.view.QuestionView; -import org.example.view.RoomView; import org.example.view.TournamentView; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; public class RoomController { - public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JButton readyB, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, int time, int questions){ + public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, JButton readyB, JPanel content, String name, ArrayList matches, Match match, Sender sender, MatchChecker mm, int time, int questions, JLabel crome){ if(!match.getHost().name.equals(name)){ back.setText("Exit"); } Timer t = new Timer(); //T is the timer that checks if players are ready or not Timer t2 = new Timer(); //T2 is the timer that checks if 5 seconds are passed if all players are ready TimerTask tt = new TimerTask() { - AtomicInteger timerStart = new AtomicInteger(0); + AtomicInteger timerStart = new AtomicInteger(5); @Override public void run() { @@ -57,15 +53,18 @@ public void run() { }else{ //Match is not started but update request is made content.removeAll(); content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); + timerStart.set(5); //TODO: NON DOVREBBE SERVIRE int readyness = printerCicle(mmm,1,content); if(readyness == mmm.getPlayers().size()){ //All players are ready if(mmm.getHost().name.equals(name)){ start.setVisible(true); + crome.setVisible(true); TimerTask tt2 = new TimerTask() { @Override public void run() { - int val = timerStart.addAndGet(1); - if(val > 5){ + int val = timerStart.decrementAndGet(); + crome.setText("Seconds until start: "+val); + if(val == 0){ t2.cancel(); sender.send(new Message(name, "FRIENDLY_START",match.getName())); } @@ -75,7 +74,7 @@ public void run() { } }else{ //NOt all players are ready - timerStart.set(0); + timerStart.set(5); if(mmm.getHost().name.equals(name)){ start.setVisible(false); } @@ -136,6 +135,8 @@ public void run() { start.addActionListener(e -> { + t.cancel(); + t2.cancel(); sender.send(new Message(name, "FRIENDLY_START",match.getName())); }); } diff --git a/src/main/java/org/example/view/RoomView.java b/src/main/java/org/example/view/RoomView.java index 77cdeff..38c96ce 100644 --- a/src/main/java/org/example/view/RoomView.java +++ b/src/main/java/org/example/view/RoomView.java @@ -125,7 +125,15 @@ public RoomView(JFrame frame, String name, ArrayList matches, Match match gcc.gridy = 0; pp.add(close,gcc); - RoomController rc = new RoomController(frame, panel, close, start, readyB, content, name, matches, match, sender, mm, time, questions); + + JLabel crome = new JLabel(); + gcc.gridx = 0; + gcc.gridy = 8; + crome.setVisible(false); + panel.add(crome,gcc); + + + RoomController rc = new RoomController(frame, panel, close, start, readyB, content, name, matches, match, sender, mm, time, questions,crome); panel.setVisible(true); } public JPanel getPanel(){ From e2dfc78336ed62f26c35d9e5ff068a72feff44e1 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Sun, 20 Nov 2022 21:09:38 +0100 Subject: [PATCH 45/55] Fixes on roomview --- src/main/java/org/example/controller/RoomController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 7f13a98..1578aca 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -135,7 +135,6 @@ public void run() { start.addActionListener(e -> { - t.cancel(); t2.cancel(); sender.send(new Message(name, "FRIENDLY_START",match.getName())); }); From 703b676fbdc46ff3e134013c91d087a943008c22 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 12:30:21 +0100 Subject: [PATCH 46/55] fix --- src/main/java/org/example/model/Rank.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/model/Rank.java b/src/main/java/org/example/model/Rank.java index e7edf4c..131c8d9 100644 --- a/src/main/java/org/example/model/Rank.java +++ b/src/main/java/org/example/model/Rank.java @@ -5,7 +5,7 @@ import java.util.Objects; public class Rank implements Comparable, Serializable { - public int points; + public float points; public String name; public Rank(String name){ this.name = name; @@ -19,7 +19,12 @@ public Rank(String name, int points){ public void addOne(){ this.points = this.points + 1; } - public void set(int points){ + + public void addHalf(){ + this.points = this.points + 0.5f; + } + + public void set(float points){ this.points = points; } From 80bb0eede8dc2593522b213f97fd8fef88266489 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 15:39:38 +0100 Subject: [PATCH 47/55] Fix on tournament results --- src/main/java/org/example/Main.java | 1 - src/main/java/org/example/model/Rank.java | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index 83f0f90..65c0508 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -11,7 +11,6 @@ public class Main { private static final int PORT = 9000; - private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) { try{ diff --git a/src/main/java/org/example/model/Rank.java b/src/main/java/org/example/model/Rank.java index 131c8d9..47b5e30 100644 --- a/src/main/java/org/example/model/Rank.java +++ b/src/main/java/org/example/model/Rank.java @@ -7,11 +7,12 @@ public class Rank implements Comparable, Serializable { public float points; public String name; + public Rank(String name){ this.name = name; this.points = 0; } - public Rank(String name, int points){ + public Rank(String name, float points){ this.name = name; this.points = points; } From 16784312f9cde5e0eb78714ef94d9fb4aa28e516 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 17:38:33 +0100 Subject: [PATCH 48/55] Fix on tournament results --- src/main/java/org/example/controller/TournamentController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java index 863a0fe..35d07e9 100644 --- a/src/main/java/org/example/controller/TournamentController.java +++ b/src/main/java/org/example/controller/TournamentController.java @@ -89,16 +89,17 @@ public void run() { public void run() { Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); if(response1.getMessage().equals("ok")){ - t.cancel(); Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); switch (response2.getEvent().toLowerCase()){ case "game": + t.cancel(); Question newQuestion = (Question) response2.getMessage(); frame.remove(question); frame.add(new TournamentView(frame, name, newQuestion, sender, mm, new JLabel(),questions, iterator+1,false).getPanel()); frame.validate(); break; case "end": + t.cancel(); handleEndTournament(frame, question,sender, name, mm); break; } From b65c8e73b298815b5c194b0c29b5d9af4c11444e Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 21:18:17 +0100 Subject: [PATCH 49/55] fix --- .../org/example/controller/ResultsTournamentController.java | 2 ++ src/main/java/org/example/controller/TournamentController.java | 3 +-- src/main/java/org/example/utils/Sender.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/controller/ResultsTournamentController.java b/src/main/java/org/example/controller/ResultsTournamentController.java index 4050c1a..c566d00 100644 --- a/src/main/java/org/example/controller/ResultsTournamentController.java +++ b/src/main/java/org/example/controller/ResultsTournamentController.java @@ -1,6 +1,7 @@ package org.example.controller; import org.example.model.MatchChecker; +import org.example.model.Message; import org.example.utils.Sender; import org.example.view.ModeView; @@ -9,6 +10,7 @@ public class ResultsTournamentController{ public ResultsTournamentController(JFrame frame, JPanel results, JButton jb, String name, Sender sender, MatchChecker mm){ jb.addActionListener(e -> { + sender.send(new Message(name, "COUNT_TOURNAMENT")); frame.remove(results); frame.add(new ModeView(frame,name,sender, mm).getPanel()); frame.validate(); diff --git a/src/main/java/org/example/controller/TournamentController.java b/src/main/java/org/example/controller/TournamentController.java index 35d07e9..5c54f76 100644 --- a/src/main/java/org/example/controller/TournamentController.java +++ b/src/main/java/org/example/controller/TournamentController.java @@ -90,16 +90,15 @@ public void run() { Message response1 = sender.sendAndRead(new Message<>(name, "UPDATE_NEXT",q)); if(response1.getMessage().equals("ok")){ Message response2 = sender.sendAndRead(new Message<>(name, "GAME",q)); + t.cancel(); switch (response2.getEvent().toLowerCase()){ case "game": - t.cancel(); Question newQuestion = (Question) response2.getMessage(); frame.remove(question); frame.add(new TournamentView(frame, name, newQuestion, sender, mm, new JLabel(),questions, iterator+1,false).getPanel()); frame.validate(); break; case "end": - t.cancel(); handleEndTournament(frame, question,sender, name, mm); break; } diff --git a/src/main/java/org/example/utils/Sender.java b/src/main/java/org/example/utils/Sender.java index c2ad3ab..4d4fce3 100644 --- a/src/main/java/org/example/utils/Sender.java +++ b/src/main/java/org/example/utils/Sender.java @@ -24,13 +24,13 @@ public Sender(Socket socket){ public Message sendAndRead(Message message){ Object result; try{ + System.out.println("Outcoming message: "+message); this.out.writeObject(message); this.out.flush(); this.out.reset(); result = this.in.readObject(); Message result2; if(result != null){ - System.out.println(result); result2 = (Message) result; System.out.println("Incoming message: "+result2); return result2; @@ -43,6 +43,7 @@ public Message sendAndRead(Message message){ public void send(Message message){ try{ + System.out.println("Outcoming message: "+message); this.out.writeObject(message); this.out.flush(); this.out.reset(); From 3c5f531a46da1478291ef5665494b42efb12a1de Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 21:57:51 +0100 Subject: [PATCH 50/55] fix --- .../controller/ResultsTournamentController.java | 15 ++++++++++++++- .../org/example/view/ResultsTournamentView.java | 13 ++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/controller/ResultsTournamentController.java b/src/main/java/org/example/controller/ResultsTournamentController.java index c566d00..5bb41dd 100644 --- a/src/main/java/org/example/controller/ResultsTournamentController.java +++ b/src/main/java/org/example/controller/ResultsTournamentController.java @@ -2,19 +2,32 @@ import org.example.model.MatchChecker; import org.example.model.Message; +import org.example.model.Rank; import org.example.utils.Sender; import org.example.view.ModeView; import javax.swing.*; +import java.util.ArrayList; public class ResultsTournamentController{ - public ResultsTournamentController(JFrame frame, JPanel results, JButton jb, String name, Sender sender, MatchChecker mm){ + public ResultsTournamentController(JFrame frame, JPanel results, JButton jb, String name, Sender sender, MatchChecker mm, ArrayList ranks){ jb.addActionListener(e -> { sender.send(new Message(name, "COUNT_TOURNAMENT")); frame.remove(results); frame.add(new ModeView(frame,name,sender, mm).getPanel()); frame.validate(); }); + float min = ranks.get(0).points; + String nameP = ranks.get(0).name; + for(Rank r : ranks){ + if(r.points < min) + nameP = r.name; + } + if(nameP.equals(name)){ + JOptionPane.showMessageDialog(frame,"You have won the tournament!","Winner!",JOptionPane.INFORMATION_MESSAGE); + }else{ + JOptionPane.showMessageDialog(frame,"You have lost the tournament","You will win next time :(",JOptionPane.INFORMATION_MESSAGE); + } } } diff --git a/src/main/java/org/example/view/ResultsTournamentView.java b/src/main/java/org/example/view/ResultsTournamentView.java index a536a84..fee4c66 100644 --- a/src/main/java/org/example/view/ResultsTournamentView.java +++ b/src/main/java/org/example/view/ResultsTournamentView.java @@ -33,13 +33,16 @@ public ResultsTournamentView(JFrame frame, String name, ArrayList ranks, S content.setLayout(new GridLayout(ranks.size(),1)); for(Rank rank : ranks){ JPanel content2 = new JPanel(); - content2.setLayout(new GridLayout(2,1)); + content2.setLayout(new GridBagLayout()); JLabel namePlayer = new JLabel("User: "+rank.name); - content2.add(namePlayer); + gcc.gridy=0; + content2.add(namePlayer,gcc); JLabel completed = new JLabel("Points: "+rank.points); - content2.add(completed); + gcc.gridy=1; + content2.add(completed,gcc); + gcc.gridy=2; JSeparator sp = new JSeparator(); - content2.add(sp); + content2.add(sp,gcc); content.add(content2); } scrollable.setViewportView(content); @@ -51,7 +54,7 @@ public ResultsTournamentView(JFrame frame, String name, ArrayList ranks, S gcc.gridy = 2; results.add(button,gcc); - ResultsTournamentController rc = new ResultsTournamentController(frame, results, button, name, sender, mm); + ResultsTournamentController rc = new ResultsTournamentController(frame, results, button, name, sender, mm, ranks); results.setVisible(true); } From b31af2e6ee7c465413078bbd2131952859285c26 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 21:59:50 +0100 Subject: [PATCH 51/55] fix --- .../org/example/controller/ResultsTournamentController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/controller/ResultsTournamentController.java b/src/main/java/org/example/controller/ResultsTournamentController.java index 5bb41dd..9e63c1c 100644 --- a/src/main/java/org/example/controller/ResultsTournamentController.java +++ b/src/main/java/org/example/controller/ResultsTournamentController.java @@ -17,10 +17,10 @@ public ResultsTournamentController(JFrame frame, JPanel results, JButton jb, Str frame.add(new ModeView(frame,name,sender, mm).getPanel()); frame.validate(); }); - float min = ranks.get(0).points; + float max = ranks.get(0).points; String nameP = ranks.get(0).name; for(Rank r : ranks){ - if(r.points < min) + if(r.points > max) nameP = r.name; } if(nameP.equals(name)){ From 32d552ff5844cf2ed0b10c14bd28b0b9a944c58a Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 22:34:40 +0100 Subject: [PATCH 52/55] fix --- src/main/java/org/example/controller/RoomController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 1578aca..b4a19c9 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -100,7 +100,7 @@ public void run() { } } }; - t.scheduleAtFixedRate(tt,10,500); + t.scheduleAtFixedRate(tt,100,800); From 0d04a9d95796e5284763f65de9a66776f21135a2 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Mon, 21 Nov 2022 23:00:17 +0100 Subject: [PATCH 53/55] fix --- src/main/java/org/example/controller/RoomController.java | 5 +++-- src/main/java/org/example/view/MatchCreatorView.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index b4a19c9..9ff31ca 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -54,6 +54,7 @@ public void run() { content.removeAll(); content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); timerStart.set(5); //TODO: NON DOVREBBE SERVIRE + int readyness = printerCicle(mmm,1,content); if(readyness == mmm.getPlayers().size()){ //All players are ready if(mmm.getHost().name.equals(name)){ @@ -70,7 +71,7 @@ public void run() { } } }; - t2.schedule(tt2, 400,1000); + t2.schedule(tt2, 100,1000); } }else{ //NOt all players are ready @@ -100,7 +101,7 @@ public void run() { } } }; - t.scheduleAtFixedRate(tt,100,800); + t.scheduleAtFixedRate(tt,100,1000); diff --git a/src/main/java/org/example/view/MatchCreatorView.java b/src/main/java/org/example/view/MatchCreatorView.java index f291b05..0f7a444 100644 --- a/src/main/java/org/example/view/MatchCreatorView.java +++ b/src/main/java/org/example/view/MatchCreatorView.java @@ -54,7 +54,7 @@ public MatchCreatorView(JFrame frame, String name, ArrayList matches, Sen gcc.gridy = 7; panel.add(maxSize,gcc); - JLabel description3 = new JLabel("Maximum duration of the match in minutes:"); + JLabel description3 = new JLabel("Maximum duration of the match in minutes (only for friendly mode):"); gcc.gridy = 8; panel.add(description3,gcc); From db0f358d68f47e62cba4b99db63d263c8de57307 Mon Sep 17 00:00:00 2001 From: BrunoFrancesco97 Date: Tue, 22 Nov 2022 19:50:07 +0100 Subject: [PATCH 54/55] Starting test --- Dockerfile | 4 ++++ build.gradle | 8 ++++++++ src/main/java/org/example/model/Player.java | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b764fe5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM amazoncorretto:17 +LABEL maintainer="francescobruno97" +ADD build/libs/client-1.0-SNAPSHOT.jar client.jar +ENTRYPOINT ["java","-jar","client.jar"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index 3cae2d7..d998e30 100644 --- a/build.gradle +++ b/build.gradle @@ -16,4 +16,12 @@ dependencies { test { useJUnitPlatform() +} + +jar { + manifest { + attributes( + 'Main-Class': 'org.example.Main' + ) + } } \ No newline at end of file diff --git a/src/main/java/org/example/model/Player.java b/src/main/java/org/example/model/Player.java index 542fbb5..82ce540 100644 --- a/src/main/java/org/example/model/Player.java +++ b/src/main/java/org/example/model/Player.java @@ -20,7 +20,7 @@ public Player(){ this.name = null; this.questions = new ArrayList<>(); this.score = null; - this.id = Utility.randomIDGenerator(10000); + this.id = Utility.randomIDGenerator(Integer.MAX_VALUE-1); this.hasFinished = false; this.ready = false; this.indexLastQuestion = -1; @@ -29,7 +29,7 @@ public Player(String name){ this.name = name; this.questions = new ArrayList<>(); this.score = new Score(this.name); - this.id = Utility.randomIDGenerator(10000); + this.id = Utility.randomIDGenerator(Integer.MAX_VALUE-1); this.hasFinished = false; this.ready = false; this.indexLastQuestion = -1; From 75061767b18eee87bf65de30cf14745410aac68e Mon Sep 17 00:00:00 2001 From: Francesco <56157402+BrunoFrancesco97@users.noreply.github.com> Date: Wed, 7 Dec 2022 20:17:50 +0100 Subject: [PATCH 55/55] Fix --- src/main/java/org/example/Main.java | 4 +-- .../ResultsTournamentController.java | 6 ++-- .../example/controller/RoomController.java | 30 +++++++------------ src/main/java/org/example/utils/Sender.java | 2 +- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index 65c0508..f2a6379 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -10,11 +10,11 @@ public class Main { - private static final int PORT = 9000; + private static final int PORT = 9002; public static void main(String[] args) { try{ - Socket socket = new Socket("localhost", PORT); + Socket socket = new Socket("192.168.1.11", PORT); WindowView w = new WindowView(new Sender(socket)); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/org/example/controller/ResultsTournamentController.java b/src/main/java/org/example/controller/ResultsTournamentController.java index 9e63c1c..7417630 100644 --- a/src/main/java/org/example/controller/ResultsTournamentController.java +++ b/src/main/java/org/example/controller/ResultsTournamentController.java @@ -20,10 +20,12 @@ public ResultsTournamentController(JFrame frame, JPanel results, JButton jb, Str float max = ranks.get(0).points; String nameP = ranks.get(0).name; for(Rank r : ranks){ - if(r.points > max) + if(r.points > max){ nameP = r.name; + max = r.points; + } } - if(nameP.equals(name)){ + if(nameP.equals(name) && max != 0){ JOptionPane.showMessageDialog(frame,"You have won the tournament!","Winner!",JOptionPane.INFORMATION_MESSAGE); }else{ JOptionPane.showMessageDialog(frame,"You have lost the tournament","You will win next time :(",JOptionPane.INFORMATION_MESSAGE); diff --git a/src/main/java/org/example/controller/RoomController.java b/src/main/java/org/example/controller/RoomController.java index 9ff31ca..f922586 100644 --- a/src/main/java/org/example/controller/RoomController.java +++ b/src/main/java/org/example/controller/RoomController.java @@ -19,7 +19,6 @@ public RoomController(JFrame frame, JPanel panel, JButton back, JButton start, J back.setText("Exit"); } Timer t = new Timer(); //T is the timer that checks if players are ready or not - Timer t2 = new Timer(); //T2 is the timer that checks if 5 seconds are passed if all players are ready TimerTask tt = new TimerTask() { AtomicInteger timerStart = new AtomicInteger(5); @@ -31,7 +30,6 @@ public void run() { if(mmm.getPlayers().size() > 0){ if(!mmm.isAvailable()){ //Match started t.cancel(); - t2.cancel(); Message responseD = sender.sendAndRead(new Message<>(name, "DROP_QUESTION",match.getName())); if(responseD != null && responseD.getMessage() != null && responseD.getMessage() instanceof Question){ Timer tQuiz = new Timer(); @@ -53,31 +51,25 @@ public void run() { }else{ //Match is not started but update request is made content.removeAll(); content.setLayout(new GridLayout((mmm.getPlayers().size()),1)); - timerStart.set(5); //TODO: NON DOVREBBE SERVIRE int readyness = printerCicle(mmm,1,content); if(readyness == mmm.getPlayers().size()){ //All players are ready if(mmm.getHost().name.equals(name)){ start.setVisible(true); crome.setVisible(true); - TimerTask tt2 = new TimerTask() { - @Override - public void run() { - int val = timerStart.decrementAndGet(); - crome.setText("Seconds until start: "+val); - if(val == 0){ - t2.cancel(); - sender.send(new Message(name, "FRIENDLY_START",match.getName())); - } - } - }; - t2.schedule(tt2, 100,1000); - + System.out.println("Sono qui"); + int val = timerStart.decrementAndGet(); + System.out.println(val); + crome.setText("Seconds until start: "+val); + if(val == 0){ + sender.send(new Message(name, "FRIENDLY_START",match.getName())); + } } }else{ //NOt all players are ready timerStart.set(5); if(mmm.getHost().name.equals(name)){ start.setVisible(false); + crome.setVisible(false); } } content.setVisible(true); @@ -85,14 +77,12 @@ public void run() { frame.repaint(); } }else{ //There are no players in the room because I left - t2.cancel(); t.cancel(); frame.remove(panel); frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); frame.validate(); } }else{ //Not valid response - t2.cancel(); t.cancel(); frame.remove(panel); frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); @@ -113,7 +103,7 @@ public void run() { Message response = sender.sendAndRead(new Message(name, "MATCH_REMOVER",match.getName())); if(response != null && response.getMessage() != null && response.getEvent().equals("MATCH_REMOVER") && response.getMessage().equals("ok")){ t.cancel(); - t2.cancel(); + //t2.cancel(); frame.remove(panel); frame.add(new FriendlyModeView(frame, name, matches, sender, mm).getPanel()); frame.validate(); @@ -136,7 +126,7 @@ public void run() { start.addActionListener(e -> { - t2.cancel(); + //t2.cancel(); sender.send(new Message(name, "FRIENDLY_START",match.getName())); }); } diff --git a/src/main/java/org/example/utils/Sender.java b/src/main/java/org/example/utils/Sender.java index 4d4fce3..5d22275 100644 --- a/src/main/java/org/example/utils/Sender.java +++ b/src/main/java/org/example/utils/Sender.java @@ -4,7 +4,7 @@ import java.io.*; import java.net.Socket; -public class Sender { +public class Sender{ public ObjectOutputStream out; public ObjectInputStream in; public Socket socket; pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy