From aaf8d806656ef1032983f8bea551e3831b7a788a Mon Sep 17 00:00:00 2001 From: ahaas25 <94150901+ahaas25@users.noreply.github.com> Date: Tue, 4 Jan 2022 15:53:01 -0500 Subject: [PATCH] Add files via upload Milestone 1 --- bin/gameWindow$mySurface.class | Bin 0 -> 9985 bytes bin/gameWindow.class | Bin 0 -> 4930 bytes bin/key.class | Bin 0 -> 513 bytes bin/keyboard.class | Bin 0 -> 1478 bytes bin/language.class | Bin 0 -> 794 bytes bin/runner.class | Bin 0 -> 493 bytes bin/utils.class | Bin 0 -> 1003 bytes bin/variables.class | Bin 0 -> 6964 bytes src/gameWindow.java | 478 +++++++++++++++ src/keyboard.java | 40 ++ src/language.java | 24 + src/runner.java | 7 + src/utils.java | 16 + src/variables.java | 236 ++++++++ words.txt | 1000 ++++++++++++++++++++++++++++++++ 15 files changed, 1801 insertions(+) create mode 100644 bin/gameWindow$mySurface.class create mode 100644 bin/gameWindow.class create mode 100644 bin/key.class create mode 100644 bin/keyboard.class create mode 100644 bin/language.class create mode 100644 bin/runner.class create mode 100644 bin/utils.class create mode 100644 bin/variables.class create mode 100644 src/gameWindow.java create mode 100644 src/keyboard.java create mode 100644 src/language.java create mode 100644 src/runner.java create mode 100644 src/utils.java create mode 100644 src/variables.java create mode 100644 words.txt diff --git a/bin/gameWindow$mySurface.class b/bin/gameWindow$mySurface.class new file mode 100644 index 0000000000000000000000000000000000000000..9311a86da02f8539939182168a62e8a7eb918ece GIT binary patch literal 9985 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 literal 0 HcmV?d00001 diff --git a/bin/gameWindow.class b/bin/gameWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..1a37f36fb1d52957cffcf187f253560facd7044c GIT binary patch literal 4930 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 literal 0 HcmV?d00001 diff --git a/bin/key.class b/bin/key.class new file mode 100644 index 0000000000000000000000000000000000000000..a99adddd5993503db3ad4decd18b49e69425da06 GIT binary patch literal 513 zcmZWmOD_Xa7(KUh8OD?<^?tuq!di$;Mbe~LRJyRcGj7^jV=B|Bu=hjktSw4n;RpCp zIMWgloA2E3%=b9woA-~`Hvqd>vXK(7F7=%aDUhkF8?_Utu)1^V)wLfBWJ|wXIgU(N z-4p0xL-9~R6a@yF*V;EKDAZI$=3Jn6--ISU5Xf!(Z{Dm3$U@^nJFqb5!od&)Y;0Eg zAu#MBg&qeZ$k`bEqo=#u#Tdr9A<$tpu5}uVN#mr8KJ*I=l}xBlT34Qq&XgDEM1R9q zK}AI-$-hY%*G!W(O7uZHGS;`Wnl8u6zdTmg-&Ibz(TaS1WRf{)mU;~pU2G@!zygF^o`u6nI{QT#SI{-%U zwS_hXDfz3ps#lw{5LHMmcq`su*{c)=FXtBge5erhD}}N`*UZf1KZ|Zy3o3;%g|<>o z!QvWiIE{@5l^{H;5a~NM&1cV7=X@IxBpt+ITiB)0`9D4ucK>VdroEt3LERASAx;SP z5g9=@aZ=Dj3=0krrv!(H(}E+!h~N?8jNmb1RB)6S5*#D?1y2wYf_{Z~&dZnTOJ3d= z46@|V%Lz_!`KI6`aZ7ND;OYob6O0m}fag@Jf(c?-aE=HBPZL$ad16U$ftV3IM_d=Y zK+FnW;+A=DseZUz&6fn181)2~iMrqwVou-^^MY52g5Vla6l947!3@FYt`lX!o5YyF zBaRC43hjO+^jW3PVZ9j4v(f?=*8~A^TTmkMf<wV>@Gfixr{Guoniu*P8r`vLGN|}d%ZoX`cGb(3S%RLd=DqT?R}0L% z6^w?(fIHcyTN+I_W?`LO(`+BJ)5i`hh=oshA55~biO)>$e6Fyk@4pRbnoRNaCf$&C zdC6O9ZDhOE=6x&BpY8H*4vK+^pzcH=By-gH%f&riy-;8rP3fZT&bk zq5G(gPE(WmxJ#!8t^>w($hc;V>#%V>ZCuYVH>RJYT6&x+`YbiBpQ76O8EQg5OLg=` zYEnN>*Y;GhS?i0&b<(&_8P}JM>lNdAmANrJO||rERMD?f<9e2A>o=$geS_-g9Q|S` zr|CCm{N{~c(fBPGzq0YGFgK=`sFto#MTgY5UZL9hHZ`H=T=yQ<(m&ws?;0=sJ?cTe ze(<$N`SW-sTZkzOmb!w3nude-x#~2p0w3T*&Xj4w<~8AWUZJ_pAf5gmYdhQc=pHsA z<9D%_^Nk)8?8z{^>8>l)nC^W0*Ka0aC^B&u2O3$K-k-3UZRYl7w(zOD-llq+OHBW@ z_2>r2znH=!FomaC1fW@5Cw8NYoz;nc>_Z0oF@kPPk+Yl^(c3sgng?W|twVI+5YFKa qk1@!v@mOOtj6Sa4VQ+rH%oJkx`DN6}`}{U{|A8cPzht}(U;Pc(C=PG{ literal 0 HcmV?d00001 diff --git a/bin/language.class b/bin/language.class new file mode 100644 index 0000000000000000000000000000000000000000..1e5dceae2c2dc191957224a766ab53360f9fb2d6 GIT binary patch literal 794 zcmYLG*>2N76g|`I=`>BA``_Io`0QT{=fF*^ZZziLe8My^y6{_dv(zFF?9}Ui3CsN2w zogj1-tnT8h7lqzr)ZyVg2!~U$MD8>?x^zQ@%=}`^H8gX=#&Kq$alR^KBX3NW{5x;r zMeo_rXr2%~2!?JM8LVlnpi+jyy2b`73fd3Mu$!7wSnYZf_w#H#aKpYC_=%ywG5(1O zJ=v#VHahd@r`)}Y)e+9y8h3*RLdlIh1mirnxG3ClS{fyRo(N5YLud-x)+h`5j3fDwjzsW1 zjb*`KauR*cN3ho#8hJ+O1+&m`KYEgN`?eDO@akGSLTq}uC9$5+$`CTWb|25+VZYF(vuasyn zCCZWH)`Fx=GB9eER~H1i{{(!Tl;8_H#YxMy?#9@(ty+vN+uDio(6$;eY}2L#^OtM2^n}Q4ZRw}RXCP}gX7oXjAr~m)} literal 0 HcmV?d00001 diff --git a/bin/runner.class b/bin/runner.class new file mode 100644 index 0000000000000000000000000000000000000000..96c3762a7307dea0f30e75dbe71607c52b1a7421 GIT binary patch literal 493 zcmZut%TB^T6g^WOg@V$8g7`@44qSjP4aUTnn2Co zs?i)Uq;JDlVIhTl5gB9|N}g2Wem)%v-RHxJU?_W`&nE+}WsLue>1ZV17;;{s)*+@T zmx`gy+}(HbeaPb4uci&sd$v?HC*OUVW{`tXViB4g8L((-J8j5#NEY3>)e8k z{n$~Jq1Nbjw^5QL*8!QRY*A!jONOGiQ6!62FPv*%+{yS`g~WL)Hj7ixLFkBpK`%N4 zMUzmQGNYV1TOs$cZd(-Nc05|3SWE^e?-0sk7bU91%UvQeC_7)UpPiKJ7*FN$3VYs$ f$XX9%=(pK5Sv6Te4F|Mn6Hy(96d8^P8#w+0DTH58 literal 0 HcmV?d00001 diff --git a/bin/utils.class b/bin/utils.class new file mode 100644 index 0000000000000000000000000000000000000000..39bf8920abcd3bb92190e88990cd711de9015627 GIT binary patch literal 1003 zcmZ`%+j7!S6kUf~LQJjFma0Xi)Y?!=sjc_4RiIXD@iK$c8ONssoPpF3m=GL&_Xqq0 zpM2H_I-@gwfPdh}c-bc~Dij}b?rX10_P3v(zXG_0dkO*!;jU-d9R(qVQ-}N&&)M9m z=bls!Mb%@7Y+8=xZ8HRo^Z`St*s2K)K}2lC9#oS$7&HY=BllB2!7-63y$RPHIl}%MUaM gv4(BjA+2F#aTj@VR`9WbA5ax6Fd0vgP6F8Z4S?0mIRF3v literal 0 HcmV?d00001 diff --git a/bin/variables.class b/bin/variables.class new file mode 100644 index 0000000000000000000000000000000000000000..9596adea5f9d7e0df055e22c5fcec5973af7a8ce GIT binary patch literal 6964 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 literal 0 HcmV?d00001 diff --git a/src/gameWindow.java b/src/gameWindow.java new file mode 100644 index 0000000..c02bd4c --- /dev/null +++ b/src/gameWindow.java @@ -0,0 +1,478 @@ +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.Timer; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.util.ArrayList; + +public class gameWindow implements KeyListener, WindowListener, MouseListener { + private JFrame mainFrame; + private keyboard k = new keyboard(); + private variables v = new variables(); + private language l = new language(); + mySurface s; + + /** + * Initializes window and starts the graphics runner. + * Graphics runner runs @v.fps times a second. + */ + public gameWindow (int x, int y, String name) { + mainFrame = new JFrame(name); + mainFrame.setSize(x, y); + mainFrame.addKeyListener(this); + mainFrame.addWindowListener(this); + mainFrame.getContentPane().addMouseListener(this); + mainFrame.setFocusTraversalKeysEnabled(false); + s = new mySurface(); + mainFrame.add(s); + mainFrame.setVisible(true); + graphicsRunner(); + } + + /** + * Redraws the window @v.fps times a second + */ + public void graphicsRunner() { + while(true) { + try { + Thread.sleep(1000/v.fps); + s.repaint(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + protected class mySurface extends JPanel { + double topBarHeight = 0.075; + double textHeight = 0.075; + int UIWidthArea = (int) (getWidth() * 0.8); + int UIHeight = (int) (getHeight() * 0.025); + int UITopBarHeightArea = (int) (getHeight() * topBarHeight); + int UIHeightArea = (int) (getHeight() * 0.9 * 0.5); + + /** + * Main drawing method + * Calls UI drawing methods + */ + private void draw(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint( + RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + drawUI(g); + drawKeyboard(g); + } + + /** + * Draws the UI for typing teacher. + */ + private void drawUI(Graphics g) { + Font wordsFont = new Font("Arial", Font.PLAIN, 24); + double topBarHeight = 0.075; + double textHeight = 0.075; + int UIWidthArea = (int) (getWidth() * 0.8); + int UIHeight = (int) (getHeight() * 0.025); + int UITopBarHeightArea = (int) (getHeight() * topBarHeight); + int UIHeightArea = (int) (getHeight() * 0.9 * 0.5); + + v.rOptions = new Rectangle(UIWidthArea, UIHeight, (int) + (getWidth() * 0.15), UITopBarHeightArea); + v.rScore = new Rectangle((int) (getWidth() * 0.05), + UIHeight, (int) (getWidth() * 0.15), UITopBarHeightArea); + v.rWPM = new Rectangle((int) + ((UIWidthArea - getWidth() * 0.15)/2 + getWidth() * 0.1), + UIHeight, (int) (getWidth() * 0.15), UITopBarHeightArea); + v.rTopBar = new Rectangle((int) (getWidth() * 0.05), + UIHeight, (int) (getWidth() * 0.9), UITopBarHeightArea); + + generateTestStrings(g, wordsFont, (int) (getWidth() * 0.8)); + Rectangle lines[] = new Rectangle[v.drawLines]; + + v.WPMText = l.wpm + ": " + v.getWPM(); + v.ScoreText = l.score + ": " + 0; + + // Draw debug rectangles + if(v.debug) { + g.drawRect((int) v.rWPM.getX(), (int) v.rWPM.getY(), + (int) v.rWPM.getWidth(), (int) v.rWPM.getHeight()); + g.drawRect((int) v.rScore.getX(), (int) v.rScore.getY(), + (int) v.rScore.getWidth(), (int) v.rScore.getHeight()); + g.drawRect((int) v.rOptions.getX(), (int) v.rOptions.getY(), + (int) v.rOptions.getWidth(), (int) v.rOptions.getHeight()); + } + + g.drawRect((int) v.rTopBar.getX(), (int) v.rTopBar.getY(), + (int) v.rTopBar.getWidth(), (int) v.rTopBar.getHeight()); + g.drawRect((int) (getWidth() * 0.05), + (int) (getHeight() * 0.025), (int) (getWidth() * 0.90), + UIHeightArea); + drawCenteredString(g, v.WPMText, v.rWPM, wordsFont); + drawCenteredString(g, v.ScoreText, v.rScore, wordsFont); + drawCenteredString(g, v.testWords + l.words, v.rOptions, wordsFont); + + int textSizeY = (int) (textHeight * getHeight() * lines.length); + + double topOfBarPadding = getHeight() * 0.025; + double topBarPadding = getHeight() * 0.025 + getHeight() * topBarHeight; + + int yPadding = (int) ((getHeight() * 0.35) - textSizeY)/2; + + generateTestStrings(g, wordsFont, UIWidthArea); + generateUserInputStrings(); + + int k = 0; + int middle = v.drawLines/2; + while(v.typedLines - middle - k > 0 && v.drawStrings.size() > k + + v.drawLines) + k++; + + for(int i = 0; i < lines.length; i++) { + lines[i] = new Rectangle((int) (getWidth() * 0.1), + (int) (topOfBarPadding/2 + topBarPadding + yPadding + + textHeight * getHeight() * i), + (int) (getWidth() * 0.8), (int) (getHeight() * textHeight)); + drawTypingPrompt(g, v.drawStrings.get(i+k), + v.userInputStrings.get(i+k), lines[i], wordsFont); + } + + if(v.testOver) { + Rectangle rStatsWindow = new Rectangle((int) (getWidth() * 0.25), + UIHeight + UITopBarHeightArea * 2, + (int) (getWidth() * 0.5), (int) (UIHeightArea * 0.5)); + Rectangle[] textLines = new Rectangle[4]; + + g.setColor(v.backgroundColor); + g.fillRect((int) rStatsWindow.getX(), (int) rStatsWindow.getY(), + (int) rStatsWindow.getWidth(), (int) rStatsWindow.getHeight()); + g.setColor(v.textColor); + + int counter = (int) (rStatsWindow.getY() / (textLines.length - 1)); + for(int i = 0; i < textLines.length; i++) { + textLines[i] = new Rectangle((int) rStatsWindow.getX(), + (int) rStatsWindow.getY() + counter * i, + (int) rStatsWindow.getWidth(), counter); + } + drawCenteredString(g, l.testOver, textLines[0], wordsFont); + drawCenteredString(g, v.WPMText + l.raw, textLines[1], wordsFont); + drawCenteredString(g, l.accuracy + ": " + v.calculateAccuracy() + + "%", textLines[2], wordsFont); + drawCenteredString(g, l.time + ": " + + v.generateElapsedTimeString(), textLines[3], wordsFont); + + } + } + + /** + * Takes the user's input and converts it into strings the length of + * the test lines. + * Example: + * v.drawStrings: [window enter noon star, believe expect wash, chair city tube] + * User input: "window enter noon staa bnelieve expect was charity t tube" + * Output: [window enter noon staa, bnelieve expect was, charity t tube] + */ + private void generateUserInputStrings() { + //v.userString = v.getString(); + v.userInputStrings.clear(); + int position = 0; + v.typedLines = 0; + for(int i = 0; i < v.drawStrings.size(); i++) { + if(v.userString.length() - position <= v.drawStrings.get(i).length()) {// If userString is not as long as line + v.userInputStrings.add(v.userString.substring(position, + v.userString.length())); + i = v.drawStrings.size(); + } + else { // If user completed string + v.userInputStrings.add(v.userString.substring(position, + position + v.drawStrings.get(i).length())); + position += v.drawStrings.get(i).length() + 1; // + 1 For space + v.typedLines++; + } + } + while(v.userInputStrings.size() < v.drawStrings.size()) { + v.userInputStrings.add(""); + } + } + + /** + * Calculates how many words can be displayed on a line and adds them + */ + private void generateTestStrings(Graphics g, Font font, int lineLength) { + String temp[] = v.getTestWords(); + String toAdd = ""; + FontMetrics metrics = g.getFontMetrics(font); + v.drawStrings.clear(); + int length = 0; + for(String x : temp) { + int textLength = metrics.stringWidth(" " + x); + if(length + textLength < lineLength) { + length += textLength; + toAdd += x + " "; + } + else { + toAdd = v.backspace(toAdd); + v.drawStrings.add(toAdd); + length = textLength; + toAdd = x + " "; + } + } + toAdd = v.backspace(toAdd); + v.drawStrings.add(toAdd); + + if (v.drawStrings.size() < v.lines) + v.drawLines = v.drawStrings.size(); + else + v.drawLines = v.lines; + } + + /** + * Draws the on-screen keyboard and displays which keys the user is + * pressing. + */ + private void drawKeyboard(Graphics g) { + int keySizeX = getWidth()/16; + int keySizeY = getHeight()/12; + Font keyboardFont = new Font("Dialog", Font.PLAIN, 24); + Graphics gr = (Graphics2D) g; + gr.setColor(new Color(0,128,128)); + key keyboard[][] = k.kb; + + for(int y = 0; y < keyboard.length; y++) { + for(int x = 0; x < keyboard[y].length; x++) { + int xLength = keySizeX * keyboard[y].length; // Calculates how many pixels each row will take + int leftPadding = (getWidth() - xLength)/2; + int yLength = keySizeY * keyboard.length; + int yPadding = (getHeight() - yLength); + + // Font size will be calculated by window size later. + if(keyboard[y][x].specialChar) + keyboardFont = new Font("Dialog", Font.PLAIN, 24); + else + keyboardFont = new Font("Dialog", Font.PLAIN, 9); + + gr.drawRect(leftPadding + x*keySizeX, yPadding + (y-1) + *keySizeY, keySizeX, keySizeY); + drawCenteredString(gr, keyboard[y][x].key, leftPadding + + x*keySizeX, yPadding + (y-1) + * keySizeY, keySizeX, keySizeY, keyboardFont); + if (v.pressedKeys.contains(keyboard[y][x].key)){ + gr.fillRect(leftPadding + x*keySizeX, yPadding + (y-1) + *keySizeY, keySizeX, keySizeY); + } + } + } + } + + /** + * Draws a centered string. + * Credit: https://stackoverflow.com/questions/27706197/how-can-i-center-graphics-drawstring-in-java + */ + public void drawCenteredString(Graphics gr, String text, int x, int y, + int xHeight, int yHeight, Font font) { + // Get the FontMetrics + FontMetrics metrics = gr.getFontMetrics(font); + // Determine the X coordinate for the text + int drawx = x + (xHeight - metrics.stringWidth(text)) / 2; + // Determine the Y coordinate for the text (note we add the ascent, + // as in java 2d 0 is top of the screen) + int drawy = y + ((yHeight - metrics.getHeight()) / 2) + metrics.getAscent(); + // Set the font + gr.setFont(font); + // Draw the String + gr.drawString(text, drawx, drawy); + } + + /** + * Draws a centered string. + */ + public void drawCenteredString(Graphics g, String text, + Rectangle rect, Font font) { + // Get the FontMetrics + FontMetrics metrics = g.getFontMetrics(font); + // Determine the X coordinate for the text + int x = rect.x + (rect.width - metrics.stringWidth(text)) / 2; + // Determine the Y coordinate for the text (note we add the ascent, as in java 2d 0 is top of the screen) + int y = rect.y + ((rect.height - metrics.getHeight()) / 2) + metrics.getAscent(); + // Set the font + g.setFont(font); + // Draw the String + g.drawString(text, x, y); + } + /** + * Draws the typing prompt text + * Aligns text left and in the middle (y) + * Sets the color of each letter according to its status + */ + public void drawTypingPrompt(Graphics g, String testText, + String userText, Rectangle rect, Font font) { + FontMetrics metrics = g.getFontMetrics(font); + int x = rect.x; + int y = rect.y + ((rect.height - metrics.getHeight()) / 2) + + metrics.getAscent(); + g.setFont(font); + g.drawString(testText, x, y); + + g.setColor(new Color(128,128,128)); + + char c = ' '; + for (int i = 0; i < testText.length(); i++) { + if(userText.length() <= i) // User hasn't typed + g.setColor(v.typingPromptColors[0]); + else if (userText.charAt(i) == testText.charAt(i)) + g.setColor(v.typingPromptColors[1]); + else + g.setColor(v.typingPromptColors[2]); + c = testText.charAt(i); + int width = g.getFontMetrics(font).charWidth(c); + g.drawString("" + c, x, y); + x += width; + } + } + + public void drawCenteredRect(Graphics g, Rectangle rect) { + g.drawRect(rect.x, rect.y, rect.width, rect.y); + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); + draw(g); + } + + } + + @Override + public void keyTyped(KeyEvent e) { + // TODO Auto-generated method stub + } + + /** + * Handles user key presses + */ + @Override + public void keyPressed(KeyEvent e) { + // TODO Auto-generated method stub + + if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE) { + v.userString = v.backspace(v.userString); + } + else if (e.getKeyCode() == KeyEvent.VK_TAB) { + v.resetVars(); + } + else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + mainFrame.dispose(); + System.exit(0); + } + else if (e.getKeyChar() != '\uFFFF' && v.gameRunning){ + v.userString += e.getKeyChar(); + v.timingHandler(); + } + String pressedKey = "" + e.getKeyChar(); + if(!v.pressedKeys.contains(pressedKey)) { + v.pressedKeys.add(pressedKey.toLowerCase()); + } + + v.checkTest(); + + // Refreshes keyboard graphics to reduce visual input delay + refreshGraphics(); + } + + /** + * Handles key released for keyboard graphics + */ + @Override + public void keyReleased(KeyEvent e) { + String depressedKey = "" + e.getKeyChar(); + v.pressedKeys.remove(depressedKey.toLowerCase()); + refreshGraphics(); + } + + private void refreshGraphics() { + s.repaint(); + } + + public void windowClosing(WindowEvent e) { + mainFrame.dispose(); + System.exit(0); + } + + @Override + public void windowOpened(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowClosed(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowIconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowDeiconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowActivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowDeactivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void mouseClicked(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void mousePressed(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void mouseReleased(MouseEvent e) { + if(v.isInRect(v.rOptions, e.getPoint())) { + if(v.wordMode + 1 >= v.wordModes.length) { + v.wordMode = 0; + v.testWords = v.wordModes[0]; + } + else { + v.wordMode++; + v.testWords = v.wordModes[v.wordMode]; + } + v.resetVars(); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void mouseExited(MouseEvent e) { + // TODO Auto-generated method stub + + } +} diff --git a/src/keyboard.java b/src/keyboard.java new file mode 100644 index 0000000..f3b881b --- /dev/null +++ b/src/keyboard.java @@ -0,0 +1,40 @@ + +public class keyboard { + + public String engl[][] = {{"`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "backspace"}, + {"tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\"}, + {"caps lock", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "enter"}, + {"shift", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "shift"}}; + public key[][] kb; + + public keyboard() { + generateEngl(); + } + + /** + * Creates a Jagged Array of keys + */ + public void generateEngl() { + kb = new key[engl.length][]; + for (int i = 0; i < engl.length; i++) { + kb[i] = new key[engl[i].length]; + } + + for (int y = 0; y < kb.length; y++) { + for (int x = 0; x < kb[y].length; x++) { + kb[y][x] = new key(engl[y][x]); + } + } + } +} + +class key { + public String key; + public int keyID; + public boolean specialChar; + + public key(String text) { + key = text; + specialChar = text.length() == 1; + } +} diff --git a/src/language.java b/src/language.java new file mode 100644 index 0000000..f367c76 --- /dev/null +++ b/src/language.java @@ -0,0 +1,24 @@ + +public class language { + public String score, words, testOver, wpm, raw, accuracy, time; + + // This will later load from a text file so uses can change languages + public language() { + loadLanguage(); + } + + private void loadLanguage() { + loadEnglish(); + } + + // Temporary method + private void loadEnglish() { + score = "Score"; + words = " Words"; + testOver = "Test Complete!"; + wpm = "WPM"; + raw = " (raw)"; + accuracy = "Accuracy"; + time = "Time"; + } +} diff --git a/src/runner.java b/src/runner.java new file mode 100644 index 0000000..cb77af4 --- /dev/null +++ b/src/runner.java @@ -0,0 +1,7 @@ + +public class runner { + public static void main(String[] args) { + // TODO Auto-generated method stub + gameWindow w = new gameWindow(800, 600, "Typing Teacher Alpha v1.0"); + } +} diff --git a/src/utils.java b/src/utils.java new file mode 100644 index 0000000..8a7e233 --- /dev/null +++ b/src/utils.java @@ -0,0 +1,16 @@ + +public class utils { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + + public void generateKB() { + String x = "ASDFGHJKL"; + for(int i = 0; i < x.length(); i++) { + System.out.print("\"" + x.charAt(i) + "\", "); + } + } + +} diff --git a/src/variables.java b/src/variables.java new file mode 100644 index 0000000..ab09154 --- /dev/null +++ b/src/variables.java @@ -0,0 +1,236 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Random; +import java.util.Scanner; +import java.awt.*; + +public class variables { + public int fps = 5, lines = 3; + public boolean debug = false; + // Updating variables + private double WPM, score; + private String testString; + private String[] testWord; + private long startTime, endTime, elapsedTime; + public int typedLines, testWords, drawLines, wordMode; + public int wordModes[] = {5, 10, 25, 50, 100}; + public String userString; + public String WPMText, ScoreText; + public boolean gameRunning, testOver; + public ArrayList pressedKeys = new ArrayList(); + public ArrayList words = new ArrayList(); + public ArrayList drawStrings = new ArrayList(); + public ArrayList userInputStrings = new ArrayList(); + + // to do: + // Finish test when last word is spelled right + // calculate real WPM and actual WPM + boolean repeatWords, timerRunning; + Color typingPromptColors[], backgroundColor, textColor; + Rectangle rOptions, rScore, rWPM, rTopBar; + Random r = new Random(); + + public variables() { + loadSettings(); + loadWords(); + resetVars(); + generateNewTest(); + generateThemes(); + } + + public void resetVars() { + userString = ""; + testString = ""; + typedLines = 0; + generateNewTest(); + timerRunning = false; + elapsedTime = -1; + WPM = 0; + score = 0; + drawLines = lines; + gameRunning = true; + testOver = false; + } + + public void loadSettings() { + // This will load from a config file later. + wordMode = 1; + testWords = wordModes[wordMode]; + repeatWords = false; + } + + /** + * typingPromptColors + * 0 = not typed + * 1 = correctly typed + * 2 = incorrectly typed + */ + public void generateThemes() { + typingPromptColors = new Color[3]; + typingPromptColors[0] = new Color(128,128,128); + typingPromptColors[1] = new Color(0,0,0); + typingPromptColors[2] = new Color(255,128,128); + + backgroundColor = new Color(255,255,255); + textColor = new Color(0,0,0); + } + + public void loadWords() { + try { + File myObj = new File("words.txt"); + Scanner myReader = new Scanner(myObj); + while (myReader.hasNextLine()) { + String data = myReader.nextLine(); + words.add(data); + } + myReader.close(); + } catch (FileNotFoundException e) { + System.out.println("Could not find words file"); + e.printStackTrace(); + } + } + + /** + * Generates new test + * Called when program is first started and when user requests a new one. + */ + public void generateNewTest() { + testWord = generateRandomWords(); + testString = ""; + for (String x : testWord) + testString += x + " "; + testString = backspace(testString); + } + + /** + * Generates 'size' amount of random words + * Can only draw the same word once + */ + public String[] generateRandomWords() { + String[] toReturn = new String[testWords]; + ArrayList usedWords = new ArrayList(); + int wordChoice = r.nextInt(words.size()); + + if(!repeatWords) { + for(int i = 0; i < testWords; i++) { + while(usedWords.contains(wordChoice)) + wordChoice = r.nextInt(words.size()); + usedWords.add(wordChoice); + toReturn[i] = words.get(wordChoice); + } + } + else { + for(int i = 0; i < testWords; i++) { + wordChoice = r.nextInt(words.size()); + toReturn[i] = words.get(wordChoice); + } + } + return toReturn; + } + + /** + * Checks if user has completed test + * Called when user presses key + */ + public void checkTest() { + String lastWordOfTest = testString.substring(testString.lastIndexOf(" ") + 1); + String lastWordOfUser = userString.substring(userString.lastIndexOf(" ") + 1); + if(userString.length() == testString.length() && lastWordOfTest.equals(lastWordOfUser)) { + stopTimer(); + gameRunning = false; + testOver = true; + } + } + + public String backspace(String str) { + if (str != null && str.length() > 0) { + str = str.substring(0, str.length() - 1); + } + return str; + } + + /** + * Called when user presses key + * Updates game stats to prevent delayed info + */ + public void timingHandler() { + if(!timerRunning) { // Starts test + startTimer(); + timerRunning = true; + } + calculateGameStats(); + } + + public void startTimer() { + startTime = System.nanoTime(); + } + + public void stopTimer() { + if(timerRunning) + endTime = System.nanoTime(); + timerRunning = false; + calculateGameStats(); + } + + public void calculateGameStats() { + if(timerRunning) + elapsedTime = (System.nanoTime() - startTime)/10000; + else + elapsedTime = (endTime - startTime)/10000; + WPM = (double) userString.length() / 5 / elapsedTime * (60 / 0.00001); + WPM = round(WPM, 2); + } + + public double calculateAccuracy() { + int counter = 0; + for(int i = 0; i < testString.length(); i++) { + if(testString.charAt(i) == userString.charAt(i)) + counter++; + } + double toReturn = round((double)(counter)/testString.length(), 3); + return toReturn * 100; + } + + public double round(double number, int places) { + long shift = (long) Math.pow(10, places); + double shifted = number * shift; + shifted = Math.round(shifted); + return (double) (shifted)/shift; + } + + public void setTestSize(int x) { + testWords = x; + } + + public String getString() { + return testString; + } + + public String[] getTestWords() { + return testWord; + } + + public double getWPM() { + return WPM; + } + + public String generateElapsedTimeString() { + double time = ((double) (elapsedTime / 1000))/100; + return time + "s"; + } + public Long getElapsedTime() { + return elapsedTime; + } + + /** + * Checks if a specified point is inside a rectangle + * @param r the rectangle + * @param p the point + */ + public boolean isInRect(Rectangle r, Point p) { + return r.x <= p.x && r.x + r.width >= p.x + && r.y <= p.y && r.y + r.height >= p.y; + } + +} diff --git a/words.txt b/words.txt new file mode 100644 index 0000000..a28eef0 --- /dev/null +++ b/words.txt @@ -0,0 +1,1000 @@ +the +of +to +and +a +in +is +it +you +that +he +was +for +on +are +with +as +I +his +they +be +at +one +have +this +from +or +had +by +not +word +but +what +some +we +can +out +other +were +all +there +when +up +use +your +how +said +an +each +she +which +do +their +time +if +will +way +about +many +then +them +write +would +like +so +these +her +long +make +thing +see +him +two +has +look +more +day +could +go +come +did +number +sound +no +most +people +my +over +know +water +than +call +first +who +may +down +side +been +now +find +any +new +work +part +take +get +place +made +live +where +after +back +little +only +round +man +year +came +show +every +good +me +give +our +under +name +very +through +just +form +sentence +great +think +say +help +low +line +differ +turn +cause +much +mean +before +move +right +boy +old +too +same +tell +does +set +three +want +air +well +also +play +small +end +put +home +read +hand +port +large +spell +add +even +land +here +must +big +high +such +follow +act +why +ask +men +change +went +light +kind +off +need +house +picture +try +us +again +animal +point +mother +world +near +build +self +earth +father +head +stand +own +page +should +country +found +answer +school +grow +study +still +learn +plant +cover +food +sun +four +between +state +keep +eye +never +last +let +thought +city +tree +cross +farm +hard +start +might +story +saw +far +sea +draw +left +late +run +don't +while +press +close +night +real +life +few +north +open +seem +together +next +white +children +begin +got +walk +example +ease +paper +group +always +music +those +both +mark +often +letter +until +mile +river +car +feet +care +second +book +carry +took +science +eat +room +friend +began +idea +fish +mountain +stop +once +base +hear +horse +cut +sure +watch +color +face +wood +main +enough +plain +girl +usual +young +ready +above +ever +red +list +though +feel +talk +bird +soon +body +dog +family +direct +pose +leave +song +measure +door +product +black +short +numeral +class +wind +question +happen +complete +ship +area +half +rock +order +fire +south +problem +piece +told +knew +pass +since +top +whole +king +space +heard +best +hour +better +true +during +hundred +five +remember +step +early +hold +west +ground +interest +reach +fast +verb +sing +listen +six +table +travel +less +morning +ten +simple +several +vowel +toward +war +lay +against +pattern +slow +center +love +person +money +serve +appear +road +map +rain +rule +govern +pull +cold +notice +voice +unit +power +town +fine +certain +fly +fall +lead +cry +dark +machine +note +wait +plan +figure +star +box +noun +field +rest +correct +able +pound +done +beauty +drive +stood +contain +front +teach +week +final +gave +green +oh +quick +develop +ocean +warm +free +minute +strong +special +mind +behind +clear +tail +produce +fact +street +inch +multiply +nothing +course +stay +wheel +full +force +blue +object +decide +surface +deep +moon +island +foot +system +busy +test +record +boat +common +gold +possible +plane +stead +dry +wonder +laugh +thousand +ago +ran +check +game +shape +equate +hot +miss +brought +heat +snow +tire +bring +yes +distant +fill +east +paint +language +among +grand +ball +yet +wave +drop +heart +am +present +heavy +dance +engine +position +arm +wide +sail +material +size +vary +settle +speak +weight +general +ice +matter +circle +pair +include +divide +syllable +felt +perhaps +pick +sudden +count +square +reason +length +represent +art +subject +region +energy +hunt +probable +bed +brother +egg +ride +cell +believe +fraction +forest +sit +race +window +store +summer +train +sleep +prove +lone +leg +exercise +wall +catch +mount +wish +sky +board +joy +winter +sat +written +wild +instrument +kept +glass +grass +cow +job +edge +sign +visit +past +soft +fun +bright +gas +weather +month +million +bear +finish +happy +hope +flower +clothe +strange +gone +jump +baby +eight +village +meet +root +buy +raise +solve +metal +whether +push +seven +paragraph +third +shall +held +hair +describe +cook +floor +either +result +burn +hill +safe +cat +century +consider +type +law +bit +coast +copy +phrase +silent +tall +sand +soil +roll +temperature +finger +industry +value +fight +lie +beat +excite +natural +view +sense +ear +else +quite +broke +case +middle +kill +son +lake +moment +scale +loud +spring +observe +child +straight +consonant +nation +dictionary +milk +speed +method +organ +pay +age +section +dress +cloud +surprise +quiet +stone +tiny +climb +cool +design +poor +lot +experiment +bottom +key +iron +single +stick +flat +twenty +skin +smile +crease +hole +trade +melody +trip +office +receive +row +mouth +exact +symbol +die +least +trouble +shout +except +wrote +seed +tone +join +suggest +clean +break +lady +yard +rise +bad +blow +oil +blood +touch +grew +cent +mix +team +wire +cost +lost +brown +wear +garden +equal +sent +choose +fell +fit +flow +fair +bank +collect +save +control +decimal +gentle +woman +captain +practice +separate +difficult +doctor +please +protect +noon +whose +locate +ring +character +insect +caught +period +indicate +radio +spoke +atom +human +history +effect +electric +expect +crop +modern +element +hit +student +corner +party +supply +bone +rail +imagine +provide +agree +thus +capital +won't +chair +danger +fruit +rich +thick +soldier +process +operate +guess +necessary +sharp +wing +create +neighbor +wash +bat +rather +crowd +corn +compare +poem +string +bell +depend +meat +rub +tube +famous +dollar +stream +fear +sight +thin +triangle +planet +hurry +chief +colony +clock +mine +tie +enter +major +fresh +search +send +yellow +gun +allow +print +dead +spot +desert +suit +current +lift +rose +continue +block +chart +hat +sell +success +company +subtract +event +particular +deal +swim +term +opposite +wife +shoe +shoulder +spread +arrange +camp +invent +cotton +born +determine +quart +nine +truck +noise +level +chance +gather +shop +stretch +throw +shine +property +column +molecule +select +wrong +gray +repeat +require +broad +prepare +salt +nose +plural +anger +claim +continent +oxygen +sugar +death +pretty +skill +women +season +solution +magnet +silver +thank +branch +match +suffix +especially +fig +afraid +huge +sister +steel +discuss +forward +similar +guide +experience +score +apple +bought +led +pitch +coat +mass +card +band +rope +slip +win +dream +evening +condition +feed +tool +total +basic +smell +valley +nor +double +seat +arrive +master +track +parent +shore +division +sheet +substance +favor +connect +post +spend +chord +fat +glad +original +share +station +dad +bread +charge +proper +bar +offer +segment +slave +duck +instant +market +degree +populate +chick +dear +enemy +reply +drink +occur +support +speech +nature +range +steam +motion +path +liquid +log +meant +quotient +teeth +shell +neck \ No newline at end of file