New method for Euler 13, code not working properly - java
Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.
I have basically tried to add the last digit of the each number and then keep the last digit of the sum in an array while the remaining digits get added to the second last digit and so on..
For some reason I cannot get the correct output, I have been looking for 2 hours but cannot find the an error.
This is the code:
public class Thirteen
{
public static void main(String[] args)
{
String numbers[] = {"37107287533902102798797998220837590246510135740250 ",
"46376937677490009712648124896970078050417018260538 ",
"74324986199524741059474233309513058123726617309629 ",
"91942213363574161572522430563301811072406154908250 ",
"23067588207539346171171980310421047513778063246676 ",
"89261670696623633820136378418383684178734361726757 ",
"28112879812849979408065481931592621691275889832738 ",
"44274228917432520321923589422876796487670272189318 ",
"47451445736001306439091167216856844588711603153276 ",
"70386486105843025439939619828917593665686757934951 ",
"62176457141856560629502157223196586755079324193331 ",
"64906352462741904929101432445813822663347944758178 ",
"92575867718337217661963751590579239728245598838407 ",
"58203565325359399008402633568948830189458628227828 ",
"80181199384826282014278194139940567587151170094390 ",
"35398664372827112653829987240784473053190104293586 ",
"86515506006295864861532075273371959191420517255829 ",
"71693888707715466499115593487603532921714970056938 ",
"54370070576826684624621495650076471787294438377604 ",
"53282654108756828443191190634694037855217779295145 ",
"36123272525000296071075082563815656710885258350721 ",
"45876576172410976447339110607218265236877223636045 ",
"17423706905851860660448207621209813287860733969412 ",
"81142660418086830619328460811191061556940512689692 ",
"51934325451728388641918047049293215058642563049483 ",
"62467221648435076201727918039944693004732956340691 ",
"15732444386908125794514089057706229429197107928209 ",
"55037687525678773091862540744969844508330393682126 ",
"18336384825330154686196124348767681297534375946515 ",
"80386287592878490201521685554828717201219257766954 ",
"78182833757993103614740356856449095527097864797581 ",
"16726320100436897842553539920931837441497806860984 ",
"48403098129077791799088218795327364475675590848030 ",
"87086987551392711854517078544161852424320693150332 ",
"59959406895756536782107074926966537676326235447210 ",
"69793950679652694742597709739166693763042633987085 ",
"41052684708299085211399427365734116182760315001271 ",
"65378607361501080857009149939512557028198746004375 ",
"35829035317434717326932123578154982629742552737307 ",
"94953759765105305946966067683156574377167401875275 ",
"88902802571733229619176668713819931811048770190271 ",
"25267680276078003013678680992525463401061632866526 ",
"36270218540497705585629946580636237993140746255962 ",
"24074486908231174977792365466257246923322810917141 ",
"91430288197103288597806669760892938638285025333403 ",
"34413065578016127815921815005561868836468420090470 ",
"23053081172816430487623791969842487255036638784583 ",
"11487696932154902810424020138335124462181441773470 ",
"63783299490636259666498587618221225225512486764533 ",
"67720186971698544312419572409913959008952310058822 ",
"95548255300263520781532296796249481641953868218774 ",
"76085327132285723110424803456124867697064507995236 ",
"37774242535411291684276865538926205024910326572967 ",
"23701913275725675285653248258265463092207058596522 ",
"29798860272258331913126375147341994889534765745501 ",
"18495701454879288984856827726077713721403798879715 ",
"38298203783031473527721580348144513491373226651381 ",
"34829543829199918180278916522431027392251122869539 ",
"40957953066405232632538044100059654939159879593635 ",
"29746152185502371307642255121183693803580388584903 ",
"41698116222072977186158236678424689157993532961922 ",
"62467957194401269043877107275048102390895523597457 ",
"23189706772547915061505504953922979530901129967519 ",
"86188088225875314529584099251203829009407770775672 ",
"11306739708304724483816533873502340845647058077308 ",
"82959174767140363198008187129011875491310547126581 ",
"97623331044818386269515456334926366572897563400500 ",
"42846280183517070527831839425882145521227251250327 ",
"55121603546981200581762165212827652751691296897789 ",
"32238195734329339946437501907836945765883352399886 ",
"75506164965184775180738168837861091527357929701337 ",
"62177842752192623401942399639168044983993173312731 ",
"32924185707147349566916674687634660915035914677504 ",
"99518671430235219628894890102423325116913619626622 ",
"73267460800591547471830798392868535206946944540724 ",
"76841822524674417161514036427982273348055556214818 ",
"97142617910342598647204516893989422179826088076852 ",
"87783646182799346313767754307809363333018982642090 ",
"10848802521674670883215120185883543223812876952786 ",
"71329612474782464538636993009049310363619763878039 ",
"62184073572399794223406235393808339651327408011116 ",
"66627891981488087797941876876144230030984490851411 ",
"60661826293682836764744779239180335110989069790714 ",
"85786944089552990653640447425576083659976645795096 ",
"66024396409905389607120198219976047599490197230297 ",
"64913982680032973156037120041377903785566085089252 ",
"16730939319872750275468906903707539413042652315011 ",
"94809377245048795150954100921645863754710598436791 ",
"78639167021187492431995700641917969777599028300699 ",
"15368713711936614952811305876380278410754449733078 ",
"40789923115535562561142322423255033685442488917353 ",
"44889911501440648020369068063960672322193204149535 ",
"41503128880339536053299340368006977710650566631954 ",
"81234880673210146739058568557934581403627822703280 ",
"82616570773948327592232845941706525094512325230608 ",
"22918802058777319719839450180888072429661980811197 ",
"77158542502016545090413245809786882778948721859617 ",
"72107838435069186155435662884062257473692284509516 ",
"20849603980134001723930671666823555245252804609722 ",
"53503534226472524250874054075591789781264330331690 " };
String final_sum[]=new String[50];
int sum=0;
for(int x=49;x>=0;x--)
{
for(int y=0;y<100;y++)
{
int temp=Integer.parseInt(numbers[y].substring(x,x+1));
if(y==0)
{
temp=temp+sum;
sum=0;
}
sum=sum+temp;
}
String s=String.valueOf(sum)+" ";
int len=s.length();
final_sum[x]=s.substring(len-2,len-1);
sum=Integer.parseInt(s.substring(0,len-2));
}
System.out.println("ANSWER");
for(int x=0;x<50;x++)
{
System.out.print(final_sum[x]);
}
}
}
You can use BigInteger to work with such data.
Related
Java Printing out exceptions thrown and no exceptions throw in different places
I was not sure how to formulate the title however I have the following problem. I'm making a program which reads out things out of a CSV file and types it out. In a file where there are no problem I get my results normally. When I run my other file which has errors thrown my program still prints out the things I have in catch but not in a order I want it to- I want to put all parts with errors throw on top and the ones which have no errors on the bottom of the print. How can i do that? This is the code I currently have String []arrayS = line.split(","); if(arrayS.length==7){ String fName = ""; String lName = ""; //String int bDay; int bMonth; int bYear; int weight; double height; try{ //System.out.printf("%15s%15s%15s%15s \n", fnlName , birthDate, sWeight, sHeight); fName = arrayS[0];//gets first line in csv- name lName = arrayS[1];//gets second line in csv- last name try{ bDay = Integer.parseInt(arrayS[2].trim());//gets third line in csv- birth day }catch (NumberFormatException nfe){ System.err.println("Error found in" + arrayS[0] + ", " + arrayS[1] + ", " + arrayS[2] + ", " + arrayS[3] + ", " + arrayS[4] + ", " + arrayS[5] + ", " + arrayS[6] +"\n Offending item is: Birth day"); continue; }try{ bMonth = Integer.parseInt(arrayS[3].trim());//gets four line in csv- birth month }catch (NumberFormatException nfe){ System.err.println("Error found in" + arrayS[0] + ", " + arrayS[1] + ", " + arrayS[2] + ", " + arrayS[3] + ", " + arrayS[4] + ", " + arrayS[5] + ", " + arrayS[6] +"\n Offending item is: Birth month"); continue; }try{ bYear = Integer.parseInt(arrayS[4].trim());//gets fifth line in csv- birth year }catch (NumberFormatException nfe){ System.err.println("Error found in" + arrayS[0] + ", " + arrayS[1] + ", " + arrayS[2] + ", " + arrayS[3] + ", " + arrayS[4] + ", " + arrayS[5] + ", " + arrayS[6] +"\n Offending item is: Birth year"); continue; }try{ weight = Integer.parseInt( arrayS[5].trim());//gets sixth line in csv- weight }catch (NumberFormatException nfe){ System.err.println("Error found in" +arrayS[0] + ", " + arrayS[1] + ", " + arrayS[2] + ", " + arrayS[3] + ", " + arrayS[4] + ", " + arrayS[5] + ", " + arrayS[6] +"\n Offending item is: Weight"); continue; }try{ height = Double.parseDouble(arrayS[6].trim());//gets seventh line in csv- height }catch (NumberFormatException nfe){ System.err.println("Error found in" + arrayS[0] + ", " + arrayS[1] + ", " + arrayS[2] + ", " + arrayS[3] + ", " + arrayS[4] + ", " + arrayS[5] + ", " + arrayS[6] +"\n Offending item is: Height"); continue; } System.out.printf("%15s%15s%02d/%02d/%4d %d %.1f\n" , fName , lName , bDay , bMonth , bYear , weight , height); }catch(NumberFormatException nfe ){ System.out.println("Cannot read student:" + fName); continue; }}```
Do not write the output directly to System.out and System.err but instead collect them first. You can use different approaches like using a List<String> or use a StringBuilder. When you have read the CSV file completely you can finally output the result you have collected at the end, first the errors and then the error-free entries. The code can look like this: List<String> errors = new ArrayList<String>(); List<String> output = new ArrayList<String>(); while (/*reading a line */) { /* [...] */ try { /* [...] */ output.add(String.format("...", a, b, c, d, ...); } catch (...) { errors.add(...); } } // now show the result, but show the errors first if (!errors.isEmpty()) { System.err.println("There were errors:"); for (String str: errors) { System.err.println(str); } } System.out.println("Your result"); for (String str: output) { System.out.println(str); }
How to prompt user to enter which [row][column]
I want the user to enter which row and which column in order to read the data in it for example if the user enter row = 6 column = 0, it will print out Pw1 static String fullChessBoard[][] = { {"Rb1", "Kb1", "Bb1", "Qb1", "Ab1", "Bb2", "Kb2", "Rb2"}, {"Pb1", "Pb2", "Pb3", "Pb4", "Pb5", "Pb6", "Pb7", "Pb8"}, {" ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " "}, {"Pw1", "Pw2", "Pw3", "Pw4", "Pw5", "Pw6", "Pw7", "Pw8"}, {"Rw1", "Kw1", "Bw1", "Qw1", "Aw1", "Bw2", "Kw2", "Rw2"}, }; System.out.println(Player1W + ", please make a move"); int row = scan.nextInt(); int column = scan.nextInt();
Try this code import java.util.Scanner; public class HelloChess{ static String fullChessBoard[][] = { {"Rb1", "Kb1", "Bb1", "Qb1", "Ab1", "Bb2", "Kb2", "Rb2"}, {"Pb1", "Pb2", "Pb3", "Pb4", "Pb5", "Pb6", "Pb7", "Pb8"}, {" ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " "}, {"Pw1", "Pw2", "Pw3", "Pw4", "Pw5", "Pw6", "Pw7", "Pw8"}, {"Rw1", "Kw1", "Bw1", "Qw1", "Aw1", "Bw2", "Kw2", "Rw2"}, }; public static void main(String []args){ Scanner scan = new Scanner(System.in); System.out.print("Enter Row: "); int row = scan.nextInt(); System.out.print("Enter Column: "); int column = scan.nextInt(); System.out.println("Result : "+fullChessBoard[row][column]); scan.close(); } }
I'm assuming this program you are writing is a command line program, where the user puts information into the command prompt and your program responds. If it's not, please let me know, as my answer operates under that assumption. There's more than one way to get input from the command line in Java. The following link has a few great examples: [https://www.geeksforgeeks.org/ways-to-read-input-from-console-in-java/][1] Here's a quick example I chalked up that outputs the first repeated letter from a string the user enters, it uses the BufferedReader class set to get input from the System.in object wrapped by an InputStreamReader. I'm sure that sounds complicated, but the code explains it better: import java.io.BufferedReader; import java.io.Console; import java.io.IOException; import java.io.InputStreamReader; import java.util.Set; import java.util.TreeSet; public class FirstRecurringCharacter { /** * #param args the command line arguments */ public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter your string: "); String toAnalyze = reader.readLine(); returnFirstRecurring(toAnalyze); } private static Character returnFirstRecurring(String toAnalyze) { String toSearch = toAnalyze; Set<Character> seenCharacters = new TreeSet<>(); for (int i = 0; i < toSearch.length(); i++) { if (seenCharacters.contains(toSearch.charAt(i))) { System.out.println(toSearch.charAt(i)); return toSearch.charAt(i); } else { seenCharacters.add(toSearch.charAt(i)); } } System.out.println("No repeating characters."); return null; } } The .readLine() method gets the users input after they hit enter on the console. Try it yourself! With your program, you might want to prompt them, one at a time, to insert a row index, then a column index, you can cast their input to integers if needed, and then use them in the remainder of the program. I hope this helps!
Code Not Producing Expected Results
I'm fairly new to Java. I am coding a Symmetric-Key Encryption Program that encrypts a string entered at command line. For some reason, this section is not giving me the results I was looking for: String[] replaceNum = { " 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 ", " 10 ", " 11 ", " 12 ", " 13 ", " 14 ", " 15 ", " 16 ", " 17 ", " 18 ", " 19 ", " 20 ", " 21 ", " 22 ", " 23 ", " 24 ", " 25 ", " 26 ", " 27 ", " 28 ", " 29 ", " 30 ", " 31 "}; String[] replaceChar = { " A ", " B ", " C ", " D ", " E ", " F ", " G ", " H ", " I ", " J ", " K ", " L ", " M ", " N ", " O ", " P ", " Q ", " R ", " S ", " T ", " U ", " V ", " W ", " X ", " Y ", " Z ", " . ", " //, ", " //! ", " //? ", " _ "}; message = message.toUpperCase(); message = message.replaceAll(" ", "_"); message = " " + message.replaceAll(".(?=.)", "$0 ") + " "; for (int x=0; x<=30; x++) { message = message.replaceAll(replaceChar[x], replaceNum[x]); } Basically, I want to replace the characters in the message string with numbers from 1 to 31. When I compile, the output will be something like some# 27 some# 27 some# 27... It worked fine when I used 31 lines of message = message.replaceAll("character", "number"); Also, if I include any punctuation, I get an error. Not very familiar with "//", and don't really understand "Regex". Please help!
it's supposed to be \\? or \\! because \\ is used to escape special character like ? and ! in regex and treat them like normal character so you want to change it to \\ instead of //
clearing a JLabel not working [closed]
Closed. This question needs details or clarity. It is not currently accepting answers. Want to improve this question? Add details and clarify the problem by editing this post. Closed 9 years ago. Improve this question I have read several posts suggesting to clear a JLabel (displayEntered) on a panel (display) with text by using the setText(" "). However, I have tried this and the outcome is it is just posting the array entered twice and does not clear the first set. I have an action shown below when a button is pressed both times; the first is to enter the data entered (I have the same code 4 times for the 4 different possible objects to enter but just put in the one since it's basically the same), which works fine and the second is to remove a specific one shown. My code is long, so am just putting that in. If someone wants something else please let me know. Thanks, I'd appreciate any input! //adds the Herb data to the Array and list enterHerbData.addActionListener(new ActionListener(){ #Override public void actionPerformed(ActionEvent e){ if(e.getActionCommand().equals("Enter")){ Name = NameTxt.getText(); Colors = ColorTxt.getText(); ID = (int) IDCmbo.getSelectedItem(); Flavor = FlavorTxt.getText(); if(((String) MedicinalCmbo.getSelectedItem()).equals("Yes")) Medicinal = true; else Medicinal = false; if(((String) SeasonalCmbo.getSelectedItem()).equals("Yes")) Seasonal = true; else Seasonal = false; plants[count] = new Herb(Name, ID, Colors, Flavor, Medicinal, Seasonal); String displayArraytemp = " "; if(plants[count] != null){ if(plants[count] instanceof Flower){ displayArraytemp = ((count + 1) + ": " + plants[count].getID() + ", " + plants[count].getName() + ", " + ((Flower)plants[count]).getColor() + ", " + ((Flower)plants[count]).getSmell() + ", Thorny: " + ((Flower)plants[count]).getThorns() + "\n"); } else if(plants[count] instanceof Fungus){ displayArraytemp = ((count + 1) + ": " + plants[count].getID() + ", " + plants[count].getName() + ", " + ((Fungus)plants[count]).getColor() + ", Poisonous: " + ((Fungus)plants[count]).getPoisonous() + "\n"); } else if(plants[count] instanceof Weed){ displayArraytemp = ((count + 1) + ": " + plants[count].getID() + ", " + plants[count].getName() + ", " + ((Weed)plants[count]).getColor() + ", Edible: " + ((Weed)plants[count]).getEdible() + ", Medicinal: " + ((Weed)plants[count]).getMedicinal() + ", Poisonous: " + ((Weed)plants[count]).getPoisonous() + "\n"); } else if(plants[count] instanceof Herb){ displayArraytemp = ((count + 1) + ": " + plants[count].getID() + ", " + plants[count].getName() + ", " + ((Herb)plants[count]).getColor() + ", " + ((Herb)plants[count]).getFlavor() + ", Medicinal: " + ((Herb)plants[count]).getMedicinal() + ", Poisonous: " + ((Herb)plants[count]).getSeasonal() + "\n"); } sb.append("<html>" + displayArraytemp). append("<br> "); displayArray = sb.toString(); } displayEntered.setText(displayArray); count++; frameB.setVisible(false); } } }); //removes the data to the Array and panel ActionListener RemoveAction = new ActionListener(){ #Override public void actionPerformed(ActionEvent RemoveAction){ if(RemoveAction.getActionCommand().equals("Enter")){ if((Btn1).isSelected()){ String displayArraytemp2 = " "; if(count >= 1){ for(int n = 0; n < count; n++){ plants[n] = plants[n+1]; } count--; frameB.setVisible(false); displayEntered.setOpaque(true); for(int n = 0; n < 25; n++){ if(plants[n] != null){ if(plants[n] instanceof Flower){ displayArraytemp2 = ((n + 1) + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Flower)plants[n]).getColor() + ", " + ((Flower)plants[n]).getSmell() + ", Thorny: " + ((Flower)plants[n]).getThorns() + "\n"); } else if(plants[n] instanceof Fungus){ displayArraytemp2 = ((n + 1) + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Fungus)plants[n]).getColor() + ", Poisonous: " + ((Fungus)plants[n]).getPoisonous() + "\n"); } else if(plants[n] instanceof Weed){ displayArraytemp2 = ((n + 1) + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Weed)plants[n]).getColor() + ", Edible: " + ((Weed)plants[n]).getEdible() + ", Medicinal: " + ((Weed)plants[n]).getMedicinal() + ", Poisonous: " + ((Weed)plants[n]).getPoisonous() + "\n"); } else if(plants[n] instanceof Herb){ displayArraytemp2 = ((n + 1) + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Herb)plants[n]).getColor() + ", " + ((Herb)plants[n]).getFlavor() + ", Medicinal: " + ((Herb)plants[n]).getMedicinal() + ", Poisonous: " + ((Herb)plants[n]).getSeasonal() + "\n"); } sb.append("<html>" + displayArraytemp2). append("<br> "); displayArray = sb.toString(); } } } displayEntered.setText(" "); displayEntered.setText(displayArray); } } }};
Your real problem is that you are re-using sb without clearing it.
For a tile-based side-scroller, how can I make a character stop when it hits a block after it jumps?
All right, so I have made a basic game, in which I made a character go left and right (using a and d) and allowed it to jump. What I'm trying to do right now is get it so that the terrain generated will allow the character to stop on top of it. For example, if the character jumps, then it will stop on top of a block when it touches it. What I really need is just some basic code that will work well for the code I have already written, not an entire re-writing. And as a side note, many have said to use KeyBindings instead of KeyListener, but the KeyListener works a lot better in the way I'm handling this coding. Thanks for your help! import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.io.*; import java.net.*; import java.lang.*; import static java.lang.Math.*; import static java.lang.System.out; import java.util.Random.*; import java.util.*; import javax.swing.JApplet; import java.awt.Graphics; public class Ultima extends JFrame implements KeyListener { String map [][] = {{" ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", "#", "#", " ", " ", " ", " ", " ", " ", " ", " ", "#", "#", " ", " ", " ", " ", " ", " ", " "}, {" ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {" ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", "#", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {" ", " ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {" ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}, {"#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}}; int score = 0; double gravity = 1; boolean jumping = false; boolean moveRight = false; boolean moveLeft = false; boolean jumpRight = false; boolean jumpLeft = false; boolean moveRightWhileJumping = false; boolean moveLeftWhileJumping = false; final int WIDTH = 900; final int HEIGHT = 650; int RESPAWNX = WIDTH/20; int RESPAWNY = HEIGHT/2; Rectangle charRect = new Rectangle( RESPAWNX, RESPAWNY, 20, 32 ); JLabel character = new JLabel( new ImageIcon( "characterg.gif" ) ); JLabel scoreLabel = new JLabel( "Score: " + score ); JMenuBar mb = new JMenuBar( ); JMenu menuFile = new JMenu("File"); JMenuItem menuItemSave = new JMenuItem("Save"); JMenuItem menuItemLoad = new JMenuItem("Load"); ArrayList trailList = new ArrayList( ); Runner runner; Container cont; JLabel spaceLabel = null; public static void main( String args[] ) { new Ultima( ); } public Ultima( ) { super( "Ultima" ); setSize( WIDTH, HEIGHT ); setVisible( true ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); cont = getContentPane( ); cont.setLayout( null ); addKeyListener( this ); cont.setBackground( Color.WHITE ); cont.add( mb ); setJMenuBar( mb ); menuFile.add( menuItemSave ); menuFile.add( menuItemLoad ); mb.add( menuFile ); cont.add( scoreLabel ); scoreLabel.setBounds( 50, 50, 100, 30 ); scoreLabel.setFont( new Font( "arial", Font.BOLD, 13 ) ); scoreLabel.setForeground( Color.BLACK ); cont.add( character ); character.setBounds( charRect.x, charRect.y, 20, 32 ); for( int row = 0; row < map.length; row++ ) { for( int col = 0; col < map[0].length; col++ ) { if( map[row][col].equals( "#" ) ) { spaceLabel = new JLabel( new ImageIcon( "block.png" ) ); } else if( map[row][col].equals( " " ) ) { spaceLabel = new JLabel(new ImageIcon( "air.png" ) ); } else { } trailList.add( spaceLabel ); cont.add( spaceLabel ); cont.setComponentZOrder( spaceLabel, 1 ); spaceLabel.setBounds( col*30, row*30, 30, 30 ); } } repaint( ); cont.validate( ); runner = new Runner( ); runner.start( ); setContentPane( cont ); } public void keyPressed( KeyEvent e ) { if( e.getKeyChar( ) == 'd' || e.getKeyChar( ) == 'D' ) { moveRight = true; } if( e.getKeyChar( ) == 'a' || e.getKeyChar( ) == 'A' ) { moveLeft = true; } } public void keyReleased( KeyEvent e ) { if( e.getKeyChar( ) == 'd' || e.getKeyChar( ) == 'D' ) { moveRight = false; } if( e.getKeyChar( ) == 'a' || e.getKeyChar( ) == 'A' ) { moveLeft = false; } } public void keyTyped( KeyEvent e ) { if( e.getKeyChar( ) == KeyEvent.VK_SPACE ) { jumping = true; } } public class Runner extends Thread { public void run( ) { while( true ) { try { int j = 10; double t = 0; while( jumping ) { charRect.y = ( int ) ( charRect.y - j + gravity ); gravity *= 1.2; character.setBounds( charRect.x, charRect.y, 20, 32 ); repaint( ); cont.validate( ); t++; Thread.sleep( 30 );//basically, lower #, faster, and higher fps } if( moveLeft ) { charRect.x = charRect.x - ( int ) ( j/5 ); character.setBounds( charRect.x, charRect.y, 20, 32 ); repaint( ); cont.validate( ); t++; Thread.sleep( 30 ); } if( moveRight ) { charRect.x = charRect.x + ( int ) ( j/5 ); character.setBounds( charRect.x, charRect.y, 20, 32 ); t++; Thread.sleep( 30 ); repaint( ); cont.validate( ); } scoreLabel.setText( "Score: " + score ); } catch( Exception e ) { break; } } } } }
I think you will find this guide on implementing 2d platformers useful.