Fixed a bug where the underscores would appear after the popup in the beginning
3
README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# h_ng_dig
|
||||||
|
|
||||||
|
Just a hangmangame for a schoolproject written in processing *(java). Not done yet*
|
BIN
data/Kulle0.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
data/Kulle1.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
data/Kulle2.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
data/Kulle3.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
data/Kulle4.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
data/Kulle5.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
data/Kulle6.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
data/Kulle7.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
data/Kulle8.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
data/sun.png
Normal file
After Width: | Height: | Size: 108 KiB |
238
h_ng_dig.pde
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
import javax.swing.JOptionPane;
|
||||||
|
// Max 15 karaktärer i varje ord, annars blir understräcken för långa
|
||||||
|
String[] ord = {"HUMAN", "TERMINATE", "EXECUTE", "REVOLUTION", "KILL"};
|
||||||
|
boolean[] harBlivitTaget = {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};
|
||||||
|
String rVal;
|
||||||
|
int rValInt;
|
||||||
|
final int antalOrd = 5;
|
||||||
|
String anvandarValStr;
|
||||||
|
char anvandarVal;
|
||||||
|
boolean rValUdda;
|
||||||
|
final int startState = 1;
|
||||||
|
final int playState = 2;
|
||||||
|
final int gameoverState = 3;
|
||||||
|
final int winState = 4;
|
||||||
|
int mittenBokstav;
|
||||||
|
final int distansLangd = 30;
|
||||||
|
final int distansMellanrum = 20;
|
||||||
|
final int distansTot = distansLangd+distansMellanrum;
|
||||||
|
int state = startState;
|
||||||
|
|
||||||
|
// Användarfel
|
||||||
|
boolean gissatRatt=false;
|
||||||
|
int felGissningar = 0;
|
||||||
|
boolean gissatBra = false;
|
||||||
|
|
||||||
|
//Färger
|
||||||
|
final color rod = color(255, 0, 0);
|
||||||
|
final color gron = color(0, 255, 0);
|
||||||
|
final color bla = color(0, 0, 255);
|
||||||
|
final color turkos = color(0, 255, 255);
|
||||||
|
final color svart = color(0);
|
||||||
|
|
||||||
|
// En array över de olika bilderna för olika stadier i användarens fel. Den sissta är en dummy bild.
|
||||||
|
PImage[] kulle = new PImage[9];
|
||||||
|
PImage sun;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
size(800, 800);
|
||||||
|
surface.setTitle("Häng Dig!");
|
||||||
|
randomOMer();
|
||||||
|
rectMode(CENTER);
|
||||||
|
|
||||||
|
// Images
|
||||||
|
for (int i=0; i < 9; i++) {
|
||||||
|
kulle[i] = loadImage("Kulle"+i+".png");
|
||||||
|
}
|
||||||
|
sun = loadImage("sun.png");
|
||||||
|
sun.resize(120, 101);
|
||||||
|
|
||||||
|
//Resize
|
||||||
|
for (int i=0; i < 8; i++) {
|
||||||
|
kulle[i].resize(2554/2, 1216/2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dela det valda ordet in till enstaka bokstaver i en array.
|
||||||
|
String[] divideWord(String wordToDivide) {
|
||||||
|
String[] ret = wordToDivide.split("");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void randomOMer() {
|
||||||
|
// Bestäm ett slumpmässigt ord från ordarrayen
|
||||||
|
rValInt = int(random(0, antalOrd));
|
||||||
|
rVal = ord[rValInt];
|
||||||
|
println(rVal);
|
||||||
|
|
||||||
|
|
||||||
|
// Kolla ifall ordet är udda eller jämnt antal karaktärer
|
||||||
|
if (rVal.length() % 2 == 0) {
|
||||||
|
rValUdda = false;
|
||||||
|
mittenBokstav = rVal.length()/2;
|
||||||
|
} else {
|
||||||
|
rValUdda = true;
|
||||||
|
mittenBokstav = int(rVal.length()/2)+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Återvänder en array där "understräcken" ska vara för det hemliga ordet
|
||||||
|
int[] PositionOfLetter() {
|
||||||
|
int antalBokstaver = rVal.length();
|
||||||
|
int[] kordinaterForUnderstrack = new int[antalBokstaver];
|
||||||
|
int mitten = (width/2);
|
||||||
|
if (rValUdda) {
|
||||||
|
kordinaterForUnderstrack[mittenBokstav-1] = mitten;
|
||||||
|
for (int i=1; i < mittenBokstav; i++) {
|
||||||
|
kordinaterForUnderstrack[(mittenBokstav -1 - i)] = mitten-distansTot*i;
|
||||||
|
kordinaterForUnderstrack[(mittenBokstav -1 + i)] = mitten+distansTot*i;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i=0; i < mittenBokstav; i++) {
|
||||||
|
kordinaterForUnderstrack[mittenBokstav-1-i] = mitten-(distansTot/2)-(distansTot*i);
|
||||||
|
kordinaterForUnderstrack[mittenBokstav+i] = mitten+(distansTot/2)+(distansTot*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return kordinaterForUnderstrack;
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw() {
|
||||||
|
// Ett switch statement som gör det möjligt med olika playstates.
|
||||||
|
switch(state) {
|
||||||
|
case startState:
|
||||||
|
drawStart();
|
||||||
|
break;
|
||||||
|
case playState:
|
||||||
|
drawPlay();
|
||||||
|
break;
|
||||||
|
case gameoverState:
|
||||||
|
drawGameover();
|
||||||
|
break;
|
||||||
|
case winState:
|
||||||
|
drawWin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Funktion för att skriva ut understräcken
|
||||||
|
void drawUnderstrack() {
|
||||||
|
int[] understrackKordinat = PositionOfLetter();
|
||||||
|
for (int i=0; i < rVal.length(); i++) {
|
||||||
|
rect(understrackKordinat[i], (height/4)*3, distansLangd, height*0.005);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void drawStart() {
|
||||||
|
textSize(20);
|
||||||
|
textAlign(CENTER, CENTER);
|
||||||
|
background(0);
|
||||||
|
fill(gron);
|
||||||
|
text("Välkommen till 'Häng Dig'\nGissa på en bokstav i popuprutan\n"+
|
||||||
|
"Starta genom att klicka på fönstret eller tryck på valfri tangent", width/2, height/2);
|
||||||
|
// Byt playstate ifall en knapp trycks ner
|
||||||
|
if (mousePressed||keyPressed) {
|
||||||
|
ritaUtBorjan();
|
||||||
|
state=playState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jag skrev en funktion för att ändra harBlivitTaget till helt false efter en omgång
|
||||||
|
// Kändes snyggare att lägga en linje kod i drawWin och drawGameover än 5
|
||||||
|
void fixFalseArray() {
|
||||||
|
for (int i=0; i < 15; i++) {
|
||||||
|
harBlivitTaget[i] =false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ritaUtBorjan() {
|
||||||
|
background(gron);
|
||||||
|
image(kulle[felGissningar], 80, 0);
|
||||||
|
image(sun, width-120, 0);
|
||||||
|
noStroke();
|
||||||
|
fill(rod);
|
||||||
|
drawUnderstrack();
|
||||||
|
}
|
||||||
|
void drawPlay() {
|
||||||
|
ritaUtBorjan();
|
||||||
|
if (felGissningar >= 7) {
|
||||||
|
state=gameoverState;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Hämta in det hemliga ordet som en array med en bokstav i varje plats.
|
||||||
|
String[] secretWordArray = divideWord(rVal);
|
||||||
|
|
||||||
|
// ANTECKNING TILL MIG SJÄLV
|
||||||
|
// Fixa så att det inte blir NullPointerException error när man trycker på cancel.
|
||||||
|
// och StringIndexOutOfBoundsException (när man trycker på enter utan någon input)
|
||||||
|
anvandarValStr = JOptionPane.showInputDialog("Skriv en bokstav");
|
||||||
|
anvandarVal = anvandarValStr.toUpperCase().charAt(0);
|
||||||
|
|
||||||
|
// Loopa igenom alla bokstäver i det hemliga ordet och ändra harBlivitTaget till true ifall användaren gissade rätt.
|
||||||
|
for (int i=0; i < rVal.length(); i++) {
|
||||||
|
if (secretWordArray[i].charAt(0) == anvandarVal && harBlivitTaget[i] == false) {
|
||||||
|
harBlivitTaget[i] = true;
|
||||||
|
gissatRatt=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Höj en counter ifall användaren har gissat fel, annars så sätts gessatRatt till false så att det funkar att loopa igenom blocket ovan igen.
|
||||||
|
if (gissatRatt == false) {
|
||||||
|
felGissningar +=1;
|
||||||
|
} else {
|
||||||
|
gissatRatt = false;
|
||||||
|
}
|
||||||
|
println("felgissningar: "+ felGissningar);
|
||||||
|
|
||||||
|
// Stycket kod skriver ut de bokstäverna som användaren har gissat rätt i det hemliga ordet.
|
||||||
|
int[] understrackKordinater = PositionOfLetter();
|
||||||
|
for (int i=0; i < rVal.length(); i++) {
|
||||||
|
if (harBlivitTaget[i]) {
|
||||||
|
text(""+secretWordArray[i], float(understrackKordinater[i]), (height/4.0)*3-height*0.02125);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gissatBra = true;
|
||||||
|
// Loopa igenom alla användarens svar och ifall inget är fel så sätts state till winState
|
||||||
|
for (int i=0; i < rVal.length(); i++) {
|
||||||
|
if (harBlivitTaget[i] == false) {
|
||||||
|
gissatBra = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println("Before if "+state);
|
||||||
|
if (gissatBra) {
|
||||||
|
state=winState;
|
||||||
|
}
|
||||||
|
println("After if "+state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawGameover() {
|
||||||
|
background(rod);
|
||||||
|
image(kulle[7], 80, 0);
|
||||||
|
fill(svart);
|
||||||
|
textSize(20);
|
||||||
|
textAlign(CENTER, CENTER);
|
||||||
|
text("GAME OVER!\n"+
|
||||||
|
"Starta om genom att klicka på fönstret, eller tryck på valfri tangent", width/2, height-height/3.5);
|
||||||
|
if (mousePressed||keyPressed) {
|
||||||
|
felGissningar =0;
|
||||||
|
randomOMer();
|
||||||
|
fixFalseArray();
|
||||||
|
ritaUtBorjan();
|
||||||
|
state=playState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawWin() {
|
||||||
|
background(turkos);
|
||||||
|
textSize(20);
|
||||||
|
textAlign(CENTER, CENTER);
|
||||||
|
text("Du vann!\n"+
|
||||||
|
"För att starta om tryck på valfri tangent", width/2, height/2);
|
||||||
|
if (mousePressed||keyPressed) {
|
||||||
|
felGissningar =0;
|
||||||
|
randomOMer();
|
||||||
|
fixFalseArray();
|
||||||
|
ritaUtBorjan();
|
||||||
|
state=playState;
|
||||||
|
}
|
||||||
|
}
|