Develop and Download Open Source Software

Browse CVS Repository

Contents of /cube45/src/Cube45Applet.java

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1.1.1 - (show annotations) (download) (as text) (vendor branch)
Wed Apr 20 18:26:16 2005 UTC (18 years, 11 months ago) by junneko
Branch: MAIN, vendor
CVS Tags: start, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: text/x-java

1 import java.applet.Applet;
2 import java.awt.*;
3 import java.util.*;
4 import java.awt.event.*;
5 import java.lang.*;
6 import java.text.*;
7 import java.net.*;
8
9 public class Cube45Applet extends Applet implements Runnable, MouseListener, MouseMotionListener
10 {
11
12 // 定数
13 final static int NONE = -1;
14 final static int SIZE_CUBE = 32;
15
16 // モード
17 final static int MODE_TITLE = 0;
18 final static int MODE_GAMEON = 1;
19 final static int MODE_CLEAR = 2;
20 private int mode = MODE_TITLE;
21
22 // ゲームモード
23 final static int GAMEMODE_FLOWER = 0;
24 final static int GAMEMODE_CROSS = 1;
25 final static int GAMEMODE_FIVE = 2;
26 private int gamemode = GAMEMODE_FLOWER;
27
28 // 位置
29 private int mx = 0; // 座標
30 private int my = 0;
31 private int lockonmx = NONE;
32 private int lockonmy = NONE;
33 private int[][] basepoint = {{SIZE_CUBE * 3,0}, {0, SIZE_CUBE*3}, {SIZE_CUBE*3,SIZE_CUBE*3},
34 {SIZE_CUBE*6,SIZE_CUBE*3}, {SIZE_CUBE*3,SIZE_CUBE*6}};
35 private CubeObject[][] cubetbl = new CubeObject[5][9];
36
37 // マウス
38 private boolean mouseonflg = false;
39 private boolean mouseenterflg = true;
40
41 // 得点
42 private int[] hightime = new int[3];
43 private long starttime = NONE;
44 private int nowtime = NONE;
45
46 // 画面描写用
47 Dimension dm = null;
48 Image offs = null;
49 Graphics grf = null;
50
51 // スレッド
52 private Thread kicker = null;
53 private boolean loop = false;
54 final static int threadspeed = 100;
55
56 public void init() {
57
58 // 変数の初期化
59 for(int i=0;i<hightime.length;i++)
60 hightime[i] = 9999;
61
62 // 背景色設定、サイズ設定
63 setBackground(Color.black);
64 setSize(SIZE_CUBE*9, SIZE_CUBE*9);
65
66 // マウスイベント追加
67 addMouseListener(this);
68 addMouseMotionListener(this);
69 requestFocus();
70
71 // タイトルモード設定
72 mode = MODE_TITLE;
73
74 // スレッドスタート
75 start();
76
77 }
78
79 public void destroy(){
80 // スレッドエンド
81 stop();
82 }
83
84 ////////////////////////////////////////////////////////////////
85 // 画面描画
86 ////////////////////////////////////////////////////////////////
87 public void paint(Graphics g) {
88 update(g);
89 }
90
91 public void update(Graphics g) {
92
93 // オフスクリーン作成
94 if(grf==null){
95 dm = getSize(); // 表示領域の取得
96 offs = createImage( dm.width, dm.height);
97 grf = offs.getGraphics();
98 }
99
100 // 画面を塗りつぶす
101 grf.setColor(Color.black);
102 grf.fillRect(0,0,dm.width,dm.height);
103
104 if(mode==MODE_TITLE){
105 int x = NONE;
106 int y = NONE;
107 grf.setColor(Color.red);
108 grf.fillRect(SIZE_CUBE*3+1, 1,SIZE_CUBE*3-2,SIZE_CUBE*3-2);
109 grf.fillRect( 1, SIZE_CUBE*3+1,SIZE_CUBE*3-2,SIZE_CUBE*3-2);
110 grf.fillRect(SIZE_CUBE*3+1, SIZE_CUBE*3+1,SIZE_CUBE*3-2,SIZE_CUBE*3-2);
111 grf.fillRect(SIZE_CUBE*6+1, SIZE_CUBE*3+1,SIZE_CUBE*3-2,SIZE_CUBE*3-2);
112 grf.fillRect(SIZE_CUBE*3+1, SIZE_CUBE*6+1,SIZE_CUBE*3-2,SIZE_CUBE*3-2);
113
114 grf.setColor(Color.white);
115 grf.setFont(new Font("Monospaced", Font.BOLD, 16));
116 grf.drawString("CUBE45", 96+24, 48);
117 grf.drawString("FLOWER", 0+24, 96 + 48);
118 grf.drawString(String.valueOf(hightime[GAMEMODE_FLOWER]), 0+24, 96 + 72);
119 grf.drawString("CROSS", 96+24, 96 + 48);
120 grf.drawString(String.valueOf(hightime[GAMEMODE_CROSS]), 96+24, 96 + 72);
121 grf.drawString("FIVE", 192+24, 96 + 48);
122 grf.drawString(String.valueOf(hightime[GAMEMODE_FIVE]), 192+24, 96 + 72);
123
124 // カーソルの表示
125 if((mx>=0)&&(mx<9)&&(my>=0)&&(my<9)){
126 grf.setColor(Color.white);
127 x = mx / 3;
128 y = my / 3;
129 grf.drawRect(x*3*SIZE_CUBE,y*3*SIZE_CUBE,SIZE_CUBE*3,SIZE_CUBE*3);
130 }
131
132 }
133 else {
134 // CUBEの描写
135 for(int i=0;i<basepoint.length;i++){
136 int cnt = 0;
137 for(int wky=0;wky<3;wky++){
138 for( int wkx=0;wkx<3;wkx++){
139 grf.setColor(cubetbl[i][cnt++].getColor());
140 grf.fillRect(basepoint[i][0]+wkx*SIZE_CUBE+1,basepoint[i][1]+wky*SIZE_CUBE*+1,
141 SIZE_CUBE-2,SIZE_CUBE-2);
142 }
143 }
144 }
145 }
146 if(mode==MODE_CLEAR){
147 grf.setColor(Color.white);
148 grf.drawString("CLEAR!!", 24, 48);
149 if(hightime[gamemode]>=nowtime)
150 grf.drawString("New Record", 3, 48+24);
151
152 }
153
154 if((mode==MODE_GAMEON)||(mode==MODE_CLEAR)){
155 grf.setColor(Color.white);
156 grf.drawString(String.valueOf(nowtime), 192+32, 48);
157 }
158
159 if(mode==MODE_GAMEON){
160 // カーソルの表示
161 if((mx>=0)&&(mx<9)&&(my>=0)&&(my<9)){
162 if(mouseonflg)
163 grf.setColor(Color.yellow);
164 else
165 grf.setColor(Color.white);
166 grf.drawRect(mx*SIZE_CUBE,my*SIZE_CUBE,SIZE_CUBE,SIZE_CUBE);
167 }
168 }
169
170
171 // オフスクリーンのイメージを一挙に実際の表示領域に描く
172 g.drawImage(offs, 0, 0, this);
173 }
174
175
176 ////////////////////////////////////////////////////////////////
177 // マウス管理
178 ////////////////////////////////////////////////////////////////
179 public void mouseClicked(MouseEvent e){}
180 public void mouseEntered(MouseEvent e){
181 mouseenterflg = true;
182 }
183 public void mouseExited(MouseEvent e){
184 mouseenterflg = false;
185 }
186 public void mouseDragged(MouseEvent e){
187 if(!mouseenterflg) return;
188 mx = e.getX() / SIZE_CUBE;
189 my = e.getY() / SIZE_CUBE;
190 if(mode==MODE_GAMEON)
191 moveCube(mx, my, lockonmx, lockonmy);
192 lockonmx = mx;
193 lockonmy = my;
194 repaint();
195 }
196 public void mousePressed(MouseEvent e){
197 if(!mouseenterflg) return;
198 lockonmx = e.getX() / SIZE_CUBE;
199 lockonmy = e.getY() / SIZE_CUBE;
200 mouseonflg = true;
201 repaint();
202 }
203 public void mouseReleased(MouseEvent e){
204 mouseonflg = false;
205 if(mode==MODE_TITLE){
206 int x = mx / 3;
207 int y = my / 3;
208 if((x==0)&&(y==1))
209 initGame(GAMEMODE_FLOWER);
210 if((x==1)&&(y==1))
211 initGame(GAMEMODE_CROSS);
212 if((x==2)&&(y==1))
213 initGame(GAMEMODE_FIVE);
214 else
215 return;
216 }
217 else if(mode==MODE_GAMEON){
218 if(isCheckClear()){
219 mode=MODE_CLEAR;
220 // ハイスコアの処理
221 if(hightime[gamemode]>nowtime)
222 hightime[gamemode]=nowtime;
223 }
224 }
225 else if(mode==MODE_CLEAR){
226 mode = MODE_TITLE;
227 }
228 repaint();
229 }
230
231 public void mouseMoved(MouseEvent e){
232 if(!mouseenterflg) return;
233 mx = e.getX() / SIZE_CUBE;
234 my = e.getY() / SIZE_CUBE;
235 repaint();
236 }
237
238
239 ////////////////////////////////////////////////////////////////
240 // スレッド管理
241 ////////////////////////////////////////////////////////////////
242 public void start() {
243 if(kicker == null) {
244 // スレッドを実行させる
245 loop = true;
246 kicker = new Thread(this);
247 kicker.start();
248 }
249 }
250
251 public void stop() {
252 // スレッドを止める
253 if ( kicker != null ) {
254 //kicker.stop();
255 loop = false;
256 try {
257 kicker.join();
258 } catch(Exception e){};
259 kicker = null;
260 }
261 }
262
263 public void run() {
264
265 // 描画オブジェクトの確定
266
267 while(loop){
268
269 // 時間の取得
270 if(mode==MODE_GAMEON)
271 nowtime = (int)((System.currentTimeMillis() - starttime) / 1000);
272 repaint();
273
274 // スレッド待機
275 try {
276 kicker.sleep(threadspeed);
277 } catch(Exception e) {
278 System.out.println("--- THREAD ERROR:" + e.toString() + " ---");
279 }
280
281 }
282 }
283
284 ////////////////////////////////////////////////////////////////
285 // 初期化
286 ////////////////////////////////////////////////////////////////
287 public void initGame(int valgamemode){
288 gamemode = valgamemode;
289
290 ArrayList<CubeObject> vec = new ArrayList<CubeObject>();
291
292 // 配列の構成
293 switch(gamemode){
294 case GAMEMODE_FLOWER:
295 for(int i=0;i<9;i++)
296 vec.add(new CubeObject(0));
297 for(int i=0;i<(9*4);i++)
298 vec.add(new CubeObject(1));
299 break;
300 case GAMEMODE_CROSS:
301 for(int i=0;i<9;i++)
302 vec.add(new CubeObject(0));
303 for(int i=0;i<(9*2);i++)
304 vec.add(new CubeObject(1));
305 for(int i=0;i<(9*2);i++)
306 vec.add(new CubeObject(2));
307 break;
308 default:
309 for(int i=0;i<9;i++)
310 vec.add(new CubeObject(0));
311 for(int i=0;i<9;i++)
312 vec.add(new CubeObject(1));
313 for(int i=0;i<9;i++)
314 vec.add(new CubeObject(2));
315 for(int i=0;i<9;i++)
316 vec.add(new CubeObject(3));
317 for(int i=0;i<9;i++)
318 vec.add(new CubeObject(4));
319 break;
320 }
321
322 // 乱数で並べ替えを行い、画面に設定
323 int index = NONE;
324 for(int i=0;i<5;i++){
325 for(int j=0;j<9;j++){
326 index = (int)(Math.random() * vec.size());
327 cubetbl[i][j]= (CubeObject) vec.get(index);
328 vec.remove(index);
329 }
330 }
331
332 // 開始時間
333 starttime = System.currentTimeMillis();
334 mode = MODE_GAMEON;
335 }
336
337 ////////////////////////////////////////////////////////////////
338 // Cube移動
339 ////////////////////////////////////////////////////////////////
340 private void moveCube(int valmx, int valmy, int vallockonmx, int vallockonmy){
341 // 移動できるか否か
342 if(((valmx-vallockonmx)!=1)&&((valmx-vallockonmx)!=-1)&&
343 ((valmy-vallockonmy)!=1)&&((valmy-vallockonmy)!=-1))
344 return;
345
346 // 移動
347 int side;
348 int pos;
349 int horizontal;
350 int vertical;
351 CubeObject[] wkcubetbl = null;
352 CubeObject wkobj = null;
353
354 // 座標をside、posに変換
355 if((valmx>=3)&&(valmx<6)&&(valmy>=0)&&(valmy<3)){
356 side = 0;
357 pos = valmy * 3 + (valmx - 3);
358 }
359 else if((valmx>=0)&&(valmx<3)&&(valmy>=3)&&(valmy<6)){
360 side = 1;
361 pos = (valmy-3) * 3 + valmx;
362 }
363 else if((valmx>=3)&&(valmx<6)&&(valmy>=3)&&(valmy<6)){
364 side = 2;
365 pos = (valmy-3) * 3 + (valmx-3);
366 }
367 else if((valmx>=6)&&(valmx<9)&&(valmy>=3)&&(valmy<6)){
368 side = 3;
369 pos = (valmy-3) * 3 + (valmx-6);
370 }
371 else if((valmx>=3)&&(valmx<6)&&(valmy>=6)&&(valmy<9)){
372 side = 4;
373 pos = (valmy-6) * 3 + (valmx-3);
374 }
375 else
376 return;
377
378 // 変数の設定
379 horizontal = valmx - vallockonmx;
380 vertical = valmy - vallockonmy;
381 wkcubetbl = getCubeLine(side,pos,(horizontal!=0));
382 wkobj = new CubeObject();
383
384 // 配列の並べ替え
385 if((horizontal==1)||(vertical==1)){
386 // 下にずらす
387 wkobj.copy(wkcubetbl[wkcubetbl.length-1]);
388 for(int i=wkcubetbl.length-1;i>0;i--){
389 wkcubetbl[i].copy(wkcubetbl[i-1]);
390 }
391 wkcubetbl[0].copy(wkobj);
392 }
393 else {
394 // 上にずらす
395 wkobj.copy(wkcubetbl[0]);
396 for(int i=0;i<wkcubetbl.length-1;i++){
397 wkcubetbl[i].copy(wkcubetbl[i+1]);
398 }
399 wkcubetbl[wkcubetbl.length-1].copy(wkobj);
400 }
401 }
402
403 // CUBEの配列を取得
404 private CubeObject[] getCubeLine(int valside, int valpos, boolean valhorizontalflg){
405
406 CubeObject[] wkcubetbl = null;
407 int posy = valpos / 3;
408 int posx = valpos - posy * 3;
409
410 // 配列を取得
411 if((valside==0)||(valside==4)){
412 // 0, 4 のテーブル
413 if(valhorizontalflg){
414 // 水平
415 wkcubetbl = new CubeObject[3];
416 for(int i=0;i<3;i++)
417 wkcubetbl[i] = cubetbl[valside][posy*3+i];
418 }
419 else {
420 // 垂直
421 wkcubetbl = new CubeObject[9];
422 for(int i=0;i<3;i++)
423 wkcubetbl[i] = cubetbl[0][i*3+posx];
424 for(int i=0;i<3;i++)
425 wkcubetbl[i+3] = cubetbl[2][i*3+posx];
426 for(int i=0;i<3;i++)
427 wkcubetbl[i+6] = cubetbl[4][i*3+posx];
428 }
429 }
430 else if((valside==1)||(valside==3)){
431 // 1, 3 のテーブル
432 if(valhorizontalflg){
433 // 水平
434 wkcubetbl = new CubeObject[9];
435 for(int i=0;i<3;i++)
436 wkcubetbl[i] = cubetbl[1][posy*3+i];
437 for(int i=0;i<3;i++)
438 wkcubetbl[i+3] = cubetbl[2][posy*3+i];
439 for(int i=0;i<3;i++)
440 wkcubetbl[i+6] = cubetbl[3][posy*3+i];
441 }
442 else {
443 // 垂直
444 wkcubetbl = new CubeObject[3];
445 for(int i=0;i<3;i++)
446 wkcubetbl[i] = cubetbl[valside][i*3+posx];
447 }
448 }
449 else{
450 if(valhorizontalflg){
451 // 水平
452 wkcubetbl = new CubeObject[9];
453 for(int i=0;i<3;i++)
454 wkcubetbl[i] = cubetbl[1][posy*3+i];
455 for(int i=0;i<3;i++)
456 wkcubetbl[i+3] = cubetbl[2][posy*3+i];
457 for(int i=0;i<3;i++)
458 wkcubetbl[i+6] = cubetbl[3][posy*3+i];
459 }
460 else {
461 // 垂直
462 wkcubetbl = new CubeObject[9];
463 for(int i=0;i<3;i++)
464 wkcubetbl[i] = cubetbl[0][i*3+posx];
465 for(int i=0;i<3;i++)
466 wkcubetbl[i+3] = cubetbl[2][i*3+posx];
467 for(int i=0;i<3;i++)
468 wkcubetbl[i+6] = cubetbl[4][i*3+posx];
469 }
470 }
471
472 return wkcubetbl;
473
474 }
475
476 ////////////////////////////////////////////////////////////////
477 // 判定
478 ////////////////////////////////////////////////////////////////
479 private boolean isCheckClear(){
480 int wkkind = NONE;
481
482 // gamemodeによりクリア条件が変わる
483 if(gamemode==GAMEMODE_FLOWER){
484 for(int i=0;i<9;i++){
485 if(cubetbl[2][i].kind!=0) return false;
486 }
487 return true;
488 }
489 else if(gamemode==GAMEMODE_CROSS){
490 for(int i=0;i<9;i++)
491 if(cubetbl[2][i].kind!=0) return false;
492 wkkind = cubetbl[0][0].kind;
493 for(int i=0;i<9;i++)
494 if(cubetbl[0][i].kind!=wkkind) return false;
495 for(int i=0;i<9;i++)
496 if(cubetbl[4][i].kind!=wkkind) return false;
497 return true;
498 }
499 else {
500 for(int i=0;i<4;i++){
501 wkkind = cubetbl[i][0].kind;
502 for(int j=0;j<9;j++)
503 if(cubetbl[i][j].kind!=wkkind) return false;
504 }
505 return true;
506 }
507
508 }
509
510 ////////////////////////////////////////////////////////////////
511 // 内部クラス
512 ////////////////////////////////////////////////////////////////
513 private class CubeObject extends Object {
514 int kind = NONE;
515
516 public CubeObject(){
517 super();
518 }
519
520 public CubeObject(int valkind){
521 super();
522 kind = valkind;
523 }
524
525 public void copy(CubeObject valobj){
526 kind = valobj.kind;
527 }
528
529 public Color getColor(){
530 switch(kind){
531 case 0:
532 return Color.red;
533 case 1:
534 return Color.yellow;
535 case 2:
536 return Color.blue;
537 case 3:
538 return Color.white;
539 default:
540 return Color.gray;
541 }
542 }
543 };
544 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26