Покритикуйте код
20.02.2020, 12:16. Показов 1389. Ответов 10
В продолжение моей прошлой темы. Накидал тут игрушку на swing 2048, воспользовался советом который дали другому пользователю. Раньше я уже писал эту игру на матлабе, сейчас вот переписал на джаве. Внешне мне нравится всё, кроме того что цифры не двигаются а телепортируются, то есть нету анимации. Такой вариант проще, но с анимацией будет еще красивее, только вот как это сделать не знаю (думаю код придется сильно переписать).
Прикладываю код классов
App
| Java | 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
| import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class App implements KeyListener, ActionListener, MouseListener, MouseMotionListener {
private JFrame wnd = new JFrame("2048 Game");
private Render render;
private GameLogic game;
private ResourceManager rm;
private JButton newGame = new Button("New Game");
private JButton exit = new CButton("x");
private JButton minimize = new CButton("-");
private JButton play = new Button("Continue");
private int bestScore = 0;
private JLabel bScore = new Board("BEST");
private JLabel score = new Board("SCORE");
private Point mouseDownCompCoords = null;
public static void main(String[] args) {
new App();
}
App() {
rm = new ResourceManager();
game = new GameLogic();
render = new Render(rm, game.getGameField());
newGame.setBounds(320, 102, 100, 25);
exit.setLocation(5, 5);
exit.addActionListener(this);
exit.setActionCommand("Exit");
minimize.setLocation(20, 5);
minimize.addActionListener(this);
minimize.setActionCommand("Minimize");
bScore.setLocation(355, 20);
score.setLocation(250, 20);
render.setLocation(5, 150);
newGame.setActionCommand("NewGame");
newGame.addActionListener(this);
play.setBounds(180, 270, 90, 25);
play.setFocusable(false);
play.setActionCommand("Continue");
play.addActionListener(this);
play.setVisible(false);
render.setLayout(null);
render.add(play);
wnd.setUndecorated(true);
wnd.setContentPane(new JLabel(rm.getBackGroud()));
wnd.setBackground(new Color(0, 0, 0, 0));
wnd.add(render);
wnd.add(newGame);
wnd.add(bScore);
wnd.add(score);
wnd.add(exit);
wnd.add(minimize);
wnd.setLayout(null);
wnd.addKeyListener(this);
wnd.addMouseListener(this);
wnd.setOpacity(1f);
wnd.addMouseMotionListener(this);
wnd.setResizable(false);
wnd.setBounds(200, 200, 460, 605);
wnd.setIconImage(rm.getIcon());
wnd.setVisible(true);
}
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
if (!game.isGameOver() && !game.isWin()) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT: {
game.moveLeft();
break;
}
case KeyEvent.VK_RIGHT: {
game.moveRight();
break;
}
case KeyEvent.VK_UP: {
game.moveUp();
break;
}
case KeyEvent.VK_DOWN: {
game.moveDown();
break;
}
}
render.renderImage(game.getGameField(), game.isGameOver(), game.isWin());
score.setText("" + game.getScore());
play.setVisible(game.isWin());
}
}
public void keyReleased(KeyEvent e) {}
public void actionPerformed(ActionEvent ae) {
switch (ae.getActionCommand()) {
case "NewGame" : {
if (game.getScore()>bestScore && (game.isGameOver() || game.isWin())) {
bestScore = game.getScore();
bScore.setText("" + bestScore);
}
score.setText("0");
game.clear();
render.renderImage(game.getGameField(), game.isGameOver(), game.isWin());
break;
}
case "Continue" : {
game.setWin(false);
play.setVisible(game.isWin());
render.renderImage(game.getGameField(), game.isGameOver(), game.isWin());
break;
}
case "Minimize" : {
wnd.setState(JFrame.ICONIFIED);
break;
}
case "Exit" : {
System.exit(0);
}
}
}
public void mouseDragged(MouseEvent e) {
Point currCoords = e.getLocationOnScreen();
wnd.setLocation(currCoords.x - mouseDownCompCoords.x, currCoords.y - mouseDownCompCoords.y);
wnd.setOpacity(0.5f);
}
public void mouseMoved(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
mouseDownCompCoords = e.getPoint();
}
public void mouseReleased(MouseEvent e) {
mouseDownCompCoords = null;
wnd.setOpacity(1f);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
} |
|
Board
| Java | 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
32
33
34
35
| import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JLabel;
public class Board extends JLabel {
private static final long serialVersionUID = 1L;
private String label;
Board(String label) {
super("0");
this.label = label;
setSize(100, 50);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(188, 175, 161, 250));
g2d.fillRoundRect(0, 0, 100, 50, 5, 5);
g2d.fillRoundRect(0, 0, 100, 50, 5, 5);
g2d.setColor(new Color(255, 255, 255, 255));
g2d.setFont(new Font("Arial", Font.BOLD, 10));
int w = g2d.getFontMetrics().stringWidth(label);
g2d.drawString(label, (getSize().width-w)/2, 15);
g2d.setFont(new Font("Arial", Font.BOLD, 20));
w = g2d.getFontMetrics().stringWidth(getText());
g2d.drawString(getText(), (getSize().width-w)/2, 40);
}
} |
|
Button
| Java | 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
| import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
public class Button extends JButton implements MouseListener {
private static final long serialVersionUID = 1L;
private boolean onMouse = false;
private boolean onClick = false;
Button(String text) {
super(text);
setFocusable(false);
setFocusPainted(false);
setContentAreaFilled(false);
setBorder(null);
setBorderPainted(false);
addMouseListener(this);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(new Color(144, 123, 102, 255));
g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 5, 5);
g2d.setFont(new Font("Arial", Font.BOLD, 15));
g2d.setColor(Color.white);
String text = getText();
int a = g2d.getFontMetrics().getAscent();
int w = g2d.getFontMetrics().stringWidth(text);
int h = g2d.getFontMetrics().getHeight();
g2d.drawString(text, (getSize().width-w)/2, (getSize().height-h)/2+a);
if (onMouse) {
g2d.setColor(new Color(184, 163, 142, 120));
g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 5, 5);
}
if (onClick) {
g2d.setColor(new Color(104, 83, 62, 120));
g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 5, 5);
}
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
onClick = true;
}
@Override
public void mouseReleased(MouseEvent e) {
onClick = false;
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
onMouse = true;
}
@Override
public void mouseExited(MouseEvent e) {
onMouse = false;
repaint();
}
} |
|
CButtont
| Java | 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
| import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
public class CButton extends JButton implements MouseListener {
private static final long serialVersionUID = 1L;
private boolean onMouse = false;
private boolean onClick = false;
private int s = 12;
private Color color;
private String type;
CButton(String type) {
setFocusable(false);
setFocusPainted(false);
setContentAreaFilled(false);
setBorder(null);
setBorderPainted(false);
addMouseListener(this);
setSize(s, s);
this.type = type;
switch (type) {
case "x" : {
color = new Color(246, 94, 56, 255);
break;
}
case "-" : {
color = new Color(250, 248, 0, 255);
break;
}
default : {
color = new Color(0, 240, 0, 255);
}
}
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, s, s);
g2d.setColor(color);
g2d.fillOval(0, 0, s, s);
if (onMouse) {
g2d.setColor(new Color(50, 50, 50, 100));
if (type.equals("-")) {
g2d.setFont(new Font("Arial", Font.BOLD, 15));
}
g2d.drawString(type, 3, 10);
}
if (onClick) {
g2d.setColor(new Color(104, 83, 62, 120));
g2d.fillOval(0, 0, s, s);
}
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
onClick = true;
}
@Override
public void mouseReleased(MouseEvent e) {
onClick = false;
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
onMouse = true;
}
@Override
public void mouseExited(MouseEvent e) {
onMouse = false;
repaint();
}
} |
|
GameLogic
| Java | 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
| import java.util.Random;
public class GameLogic {
private int field[][];
private int score;
private boolean over;
private int width;
private int height;
private int field2[][];
private boolean win;
private boolean cont;
GameLogic() {
this(4, 4);
}
GameLogic(int height, int width) {
this.height = height;
this.width = width;
field = new int[height][width];
addNumber(true);
addNumber(true);
}
GameLogic(int[][] field, int score) {
this.field = field;
this.score = score;
}
public boolean isGameOver() {
return over;
}
public int getScore() {
return score;
}
public int[][] getGameField() {
return field;
}
public boolean isWin() {
return win;
}
public void setWin(boolean win) {
this.win = win;
}
public void moveLeft() {
field2 = copy2dArray(field);
for (int i=0; i<height; i++) {
for (int j=0; j<width; j++) {
for (int k=0; k<width-1; k++) {
if (field[i][k]==0) {
field[i][k] = field[i][k+1];
field[i][k+1] = 0;
}
}
}
for (int j=1; j<width; j++) {
if (field[i][j-1]==field[i][j]) {
field[i][j-1] = field[i][j-1] + field[i][j];
score += field[i][j-1];
field[i][j] = 0;
}
}
for (int j=0; j<width; j++) {
for (int k=0; k<width-1; k++) {
if (field[i][k]==0) {
field[i][k] = field[i][k+1];
field[i][k+1] = 0;
}
}
}
}
addNumber(isChanged());
checkWin();
checkGameOver();
}
public void moveRight() {
field2 = copy2dArray(field);
for (int i=0; i<height; i++) {
for (int j=0; j<width; j++) {
for (int k=width-1; k>0; k--) {
if (field[i][k]==0) {
field[i][k] = field[i][k-1];
field[i][k-1] = 0;
}
}
}
for (int j=width-1; j>0; j--) {
if (field[i][j-1]==field[i][j]) {
field[i][j] = field[i][j-1] + field[i][j];
score += field[i][j];
field[i][j-1] = 0;
}
}
for (int j=0; j<width; j++) {
for (int k=width-1; k>0; k--) {
if (field[i][k]==0) {
field[i][k] = field[i][k-1];
field[i][k-1] = 0;
}
}
}
}
addNumber(isChanged());
checkWin();
checkGameOver();
}
public void moveUp() {
field2 = copy2dArray(field);
for (int i=0; i<height; i++) {
for (int j=0; j<width; j++) {
for (int k=0; k<width-1; k++) {
if (field[k][i]==0) {
field[k][i] = field[k+1][i];
field[k+1][i] = 0;
}
}
}
for (int j=1; j<width; j++) {
if (field[j-1][i]==field[j][i]) {
field[j-1][i] = field[j-1][i] + field[j][i];
score += field[j-1][i];
field[j][i] = 0;
}
}
for (int j=0; j<width; j++) {
for (int k=0; k<width-1; k++) {
if (field[k][i]==0) {
field[k][i] = field[k+1][i];
field[k+1][i] = 0;
}
}
}
}
addNumber(isChanged());
checkWin();
checkGameOver();
}
public void moveDown() {
field2 = copy2dArray(field);
for (int i=0; i<height; i++) {
for (int j=0; j<width; j++) {
for (int k=width-1; k>0; k--) {
if (field[k][i]==0) {
field[k][i] = field[k-1][i];
field[k-1][i] = 0;
}
}
}
for (int j=width-1; j>0; j--) {
if (field[j-1][i]==field[j][i]) {
field[j][i] = field[j-1][i] + field[j][i];
score += field[j][i];
field[j-1][i] = 0;
}
}
for (int j=0; j<width; j++) {
for (int k=width-1; k>0; k--) {
if (field[k][i]==0) {
field[k][i] = field[k-1][i];
field[k-1][i] = 0;
}
}
}
}
addNumber(isChanged());
checkWin();
checkGameOver();
}
public void clear() {
score = 0;
field = new int[height][width];
win = false;
over = false;
cont = false;
addNumber(true);
addNumber(true);
}
private void addNumber(boolean add) {
if (!over && hasEmptyCells() && add) {
int number = getNumber();
int x, y;
do {
x = new Random().nextInt(height);
y = new Random().nextInt(width);
if (field[x][y] == 0) {
field[x][y] = number;
break;
}
} while (field[x][y] != 0);
}
}
private int getNumber() {
switch (new Random().nextInt(100)%4) {
case 0 : {
return 2;
}
case 1 : {
return 4;
}
case 2 : {
return 2;
}
case 3 : {
return 2;
}
default :
return 8;
}
}
private void checkGameOver() {
if (!hasEmptyCells()) {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width - 1; j++) {
if ((field[i][j] == field[i][j + 1]) || (field[j][i] == field[j + 1][i])) {
return;
}
}
}
over = true;
}
}
private boolean hasEmptyCells() {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (field[i][j] == 0) {
return true;
}
}
}
return false;
}
private int[][] copy2dArray(int[][] in) {
int out[][] = new int[height][width];
for (int i=0; i<height; i++) {
out[i] = in[i].clone();
}
return out;
}
private boolean isChanged() {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (field[i][j] != field2[i][j]) {
return true;
}
}
}
return false;
}
private void checkWin() {
if (!cont) {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (field[i][j] == 2048) {
win = true;
cont = true;
}
}
}
}
}
} |
|
Render
| Java | 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JPanel;
public class Render extends JPanel {
private static final long serialVersionUID = 1L;
private ResourceManager resources;
private int field[][];
private boolean over;
private boolean win;
Render(ResourceManager manager, int field[][]) {
super();
this.field = field;
resources = manager;
setSize(resources.getFieldImage().getWidth(), resources.getFieldImage().getHeight());
}
public void renderImage(int field[][], boolean over, boolean win) {
this.field = field;
this.over = over;
this.win = win;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(resources.getFieldImage(), 0, 0, null);
for (int i = 0; i < field.length; i++) {
for (int j = 0; j < field[0].length; j++) {
if (field[j][i] > 0) {
g2d.drawImage(resources.getNumberImage(field[j][i]), resources.getCoordinate(i),
resources.getCoordinate(j), null);
}
}
}
if (over) {
g2d.setColor(new Color(235, 195, 20, 120));
g2d.fillRect(0, 0, getSize().width, getSize().height);
g2d.setColor(new Color(240, 90, 50, 255));
g2d.setFont(new Font("Arial", Font.BOLD, 50));
String text = "Game Over";
int a = g2d.getFontMetrics().getAscent();
int w = g2d.getFontMetrics().stringWidth(text);
int h = g2d.getFontMetrics().getHeight();
g2d.drawString(text, (getSize().width-w)/2, (getSize().height-h)/2+a);
} else if (win) {
g2d.setColor(new Color(235, 195, 20, 120));
g2d.fillRect(0, 0, getSize().width, getSize().height);
g2d.setColor(new Color(120, 110, 101, 255));
g2d.setFont(new Font("Arial", Font.BOLD, 50));
String text = "You Win";
int a = g2d.getFontMetrics().getAscent();
int w = g2d.getFontMetrics().stringWidth(text);
int h = g2d.getFontMetrics().getHeight();
g2d.drawString(text, (getSize().width-w)/2, (getSize().height-h)/2+a);
}
}
} |
|
ResourceManager
| Java | 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
| import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.ImageIcon;
public class ResourceManager {
private int length;
private BufferedImage[] images;
private BufferedImage field;
private BufferedImage backGround;
private BufferedImage icon;
private int width;
private int height;
private int max;
private int numSize = 100;
private int space = 10;
private int rad = 5;
private Color colors[] = {
new Color(239, 229, 219, 255),
new Color(238, 225, 201, 255),
new Color(242, 179, 122, 255),
new Color(245, 150, 99, 255),
new Color(245, 127, 96, 255),
new Color(246, 94, 56, 255),
new Color(238, 208, 115, 255),
new Color(238, 205, 97, 255),
new Color(238, 201, 79, 255),
new Color(238, 198, 61, 255),
new Color(237, 197, 50, 255)};
ResourceManager() {
this(4, 4, 8192);
}
ResourceManager(int maxNumber) {
this(4, 4, maxNumber);
}
ResourceManager(int height, int width) {
this(height, width, 8192);
}
ResourceManager(int height, int width, int maxNumber) {
this.height = height;
this.width = width;
max = maxNumber;
length = log2(maxNumber);
images = new BufferedImage[length];
createGameField();
createNubersImages();
createBackGround();
createIcon();
}
private int log2(int in) {
return Integer.toBinaryString(in).length()-1;
}
public BufferedImage getFieldImage() {
return field;
}
public ImageIcon getBackGroud() {
return new ImageIcon(backGround);
}
public Image getIcon() {
return icon;
}
public BufferedImage getNumberImage(int number) throws NumberFormatException {
if (number > max) {
throw new NumberFormatException("Out of range number exceprion");
}
return images[log2(number)-1];
}
public int getCoordinate(int i) {
return (i+1)*space+i*numSize;
}
private void createGameField() {
int fieldWidth = numSize * width + (width + 1) * space;
int fieldHeight = numSize * height + (height + 1) * space;
field = new BufferedImage(fieldWidth, fieldHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) field.getGraphics();
g2d.setColor(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, fieldWidth, fieldHeight);
g2d.setColor(new Color(188, 175, 161, 255));
g2d.fillRoundRect(0, 0, fieldWidth, fieldHeight, 2*rad, 2*rad);
g2d.setColor(new Color(206, 194, 181, 255));
for (int i=0; i<width; i++) {
for (int j=0; j<height; j++) {
g2d.fillRoundRect(getCoordinate(i), getCoordinate(j), numSize, numSize, rad, rad);
}
}
}
private void createNubersImages() {
int fontSize = 50;
String text;
int w;
int h;
int a;
for (int i=0; i<length; i++) {
images[i] = new BufferedImage(numSize, numSize, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) images[i].getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, numSize, numSize);
if (i >= colors.length) {
g2d.setColor(new Color(1, new Random().nextInt(256), new Random().nextInt(256),
new Random().nextInt(256)));
} else {
g2d.setColor(colors[i]);
}
g2d.fillRoundRect(0, 0, numSize, numSize, rad, rad);
if (i<2) {
g2d.setColor(new Color(120, 110, 101, 255));
} else {
g2d.setColor(new Color(249, 246, 242, 255));
}
if (i>5 && i<9) {
fontSize = 45;
} else if (i>8 && i<12) {
fontSize = 35;
} else if (i>11){
fontSize = 30;
}
g2d.setFont(new Font("Arial", Font.BOLD, fontSize));
text = ((int)Math.pow(2, i+1))+"";
a = g2d.getFontMetrics().getAscent();
w = g2d.getFontMetrics().stringWidth(text);
h = g2d.getFontMetrics().getHeight();
g2d.drawString(text, (numSize-w)/2, (numSize-h)/2+a);
}
}
private void createBackGround() {
int w = 460;
int h = 605;
int r = 15;
backGround = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) backGround.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, w, h);
g2d.setColor(new Color(250, 248, 255, 250));
g2d.fillRoundRect(0, 0, w, h, r, r);
g2d.setColor(new Color(120, 110, 101, 250));
g2d.setFont(new Font("Arial", Font.BOLD, 80));
g2d.drawString("2048", 20, 80);
g2d.setFont(new Font("Arial", Font.TRUETYPE_FONT, 15));
String text = "Join the numbers and get to the";
g2d.drawString(text, 20, 120);
int tw = g2d.getFontMetrics().stringWidth(text);
g2d.setFont(new Font("Arial", Font.BOLD, 15));
g2d.drawString("2048 tile!", tw+23, 120);
}
private void createIcon() {
icon = new BufferedImage(128, 128, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) icon.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(237, 197, 0));
g2d.fillRect(0, 0, 128, 128);
g2d.setColor(new Color(255, 255, 255));
g2d.setFont(new Font("Arial", Font.BOLD, 40));
String text = "2048";
int a = g2d.getFontMetrics().getAscent();
int w = g2d.getFontMetrics().stringWidth(text);
int h = g2d.getFontMetrics().getHeight();
g2d.drawString(text, (128-w)/2, (128-h)/2+a);
}
} |
|
А так же приложу джарник (внутри 7z архива), мавен проект и скрин. Прошу не судить строго, эта игра написана за день.
0
|