Report#8
戻る
プログラム connection.java
001. import java.applet.*;
002. import java.awt.*;
003. import java.awt.event.*;
004.
005. public class connection extends Applet implements Runnable{
006.
007. Thread th = null;//スレッドthを定義して、nullを入れる。
008. Image os; //イメージオブジェクトosを定義する
009. Graphics og; //グラフィックスオブジェックとogを定義する
010. int pd[][][] = {{{2,2,2,6},{4,2,4,6},{6,2,6,6},{3,2,5,2},{2,7,6,7}},
011. {{1,1,7,7},{1,2,6,7},{1,4,1,6},{1,3,1,7},{1,5,3,5}},
012. {{3,4,6,4},{6,3,6,6},{7,1,1,7},{3,5,6,5},{3,3,3,6}},
013. {{2,2,6,2},{4,3,4,7},{5,3,7,4},{2,6,6,6},{1,4,3,3}},
014. {{4,3,6,3},{4,4,4,6},{1,4,6,2},{1,5,7,7},{7,1,5,6}},
015. {{2,1,5,6},{3,5,7,7},{1,6,6,6},{5,3,1,5},{1,1,6,3}},
016. {{3,3,3,5},{5,5,5,7},{4,2,6,7},{3,2,2,7},{1,2,7,1}},
017. {{7,1,4,5},{4,3,1,7},{1,1,3,6},{5,2,7,7},{4,2,4,6}},
018. {{3,2,1,7},{3,3,6,4},{6,3,3,6},{4,4,5,7},{1,2,7,1}},
019. {{2,2,2,6},{5,2,6,4},{6,2,6,6},{2,4,6,5},{2,3,3,6}},
020. {{6,2,5,7},{1,5,4,7},{4,1,5,3},{2,2,7,7},{6,1,7,6}},
021. {{1,2,6,2},{1,1,5,3},{1,6,7,6},{2,3,5,1},{1,3,6,6}},
022. {{6,1,2,4},{1,6,3,5},{3,3,5,6},{2,6,6,2},{6,5,7,7}},
023. {{2,2,6,6},{1,4,7,6},{1,1,2,4},{1,6,4,7},{2,6,5,3}},
024. {{3,5,2,7},{2,1,6,6},{4,2,3,7},{3,2,7,4},{1,1,2,6}}};
//3次元配列pdを定義し、要素を記述している。
026. int td[][] = new int[9][9]; //二次元配列td[][]を定義し、要素数を[9][9]にする。
027. int px,py,pc; //int型の変数px,py,pcを定義する。
028. int fg,cf; //int型の変数fg,cfを定義する。
029.
030. public void init(){ //アプレットを初期化する処理
031. os = createImage(270,300); //osという名前の、横270、縦300のImageオブジェクトを返す
032. og = os.getGraphics(); //ImageオブジェクトosをGraphicsオブジェクトogとする
033. setBackground(Color.white); //背景の色は白
034.
035. d_set(); //メソッドset()を呼び出す
036.
037. addMouseListener(
038. new MouseAdapter(){
039. public void mousePressed(MouseEvent e){ //マウスが押されたとき
040. px = e.getX() / 30 ; py = e.getY() / 30 ;
//マウスの座標を30で割った値を、pxとpyにそれぞれ代入
041. if(e.getClickCount() == 2){ //マウスをクリックした回数が2ならば
042. if((px > 0)&&(px < 8)&&(py > 0)&&(py < 8)){
//pxとpyが、それぞれ0より大きく8より小さいならば
043. if((td[py][px] > 0)&&(td[py][px] < 6)){
//td[py][px]の値が0より大きく6より小さいならば
044. td[py][px] = 0; //0をtd[py][px]に代入
045. pc = 0; //pcに0を代入
046. }
047. }
048. }
049. if((px > -1)&&(px < 8)&&(py > 0)&&(py < 8)){
//pxが-1より多きく8より小さい、pyが0より大きく8より小さいならば
050. if((td[py][px] > -1)&&(td[py][px] < 6)){
//td[py][px]の値が-1より大きく6より小さいならば
051. pc = td[py][px]; //pcにtd[py][px]の値を代入
052. }else if((td[py][px] > 5)&&(td[py][px] < 11)){
//そうではなく、5より大きく11より小さいならば
053. pc = td[py][px] - 5; //pcに td[py][px] - 5 の値を代入
054. }
055. }else if((px == 2)&&(py == 8)){ //そうではなくもしpx=2,py=8ならば
056. d_set(); //メソッドd_set()をよびだす
057. }
058. repaint(); //メソッドupdate()をよびだす
059. }
060. }
061. );
062.
063. addMouseMotionListener(
064. new MouseMotionAdapter(){
065. public void mouseDragged(MouseEvent e){ //マウスをドラッグしたとき
066. px = e.getX() / 30 ; py = e.getY() / 30 ;
//マウスの座標を30で割った値を、pxとpyにそれぞれ代入
067. if((td[py][px] > -1)&&(td[py][px] < 6)){
//td[py][px]の値が-1より大きく6より小さいならば
068. td[py][px] = pc; //pcの値をtd[py][px]にに代入
069. }else if((td[py][px] > 5)&&(td[py][px] < 11)){
//td[py][px]の値が5より大きく11より小さいならば
070. pc = td[py][px] - 5; //pcに td[py][px] - 5 の値を代入
071. }
072. repaint(); //メソッドupdate()をよびだす
073. }
074. }
075. );
076. }
077.
078. public void paint(Graphics g){
079. og.setColor(Color.white); //グラフィックogの色を白にする
080. og.fillRect(0,0,270,300); //幅270、高さ300の四角形を塗りつぶして描画する
081.
082. for(int d1 = 1;d1 < 8;d1 ++){
//int型の変数d1が8未満の間は+1し続け、8になったら処理を終わる
083. for(int d2 = 1;d2 < 8;d2 ++){
//int型の変数d2が8未満の間は+1し続け、8になったら処理を終わる
084. d_rect(td[d2][d1],d1,d2);
//引数をtd[d2][d1]、d1、d2として、メソッドd_rect()をよびだす
085. }
086. }
087. og.setColor(Color.black); //色を黒にする
088. og.setFont(new Font("",Font.BOLD,15));
089. og.drawString("reset",55,270); //文字列resetを、座標(55,270)に描画する
090. og.drawRoundRect(47,250,56,30,10,10);
091. og.drawRoundRect(49,252,52,26,8,8);
092. fg = 1; //fgに1を代入
093. for(int d1 = 1;d1 < 8;d1 ++){
//整数型の変数d1を1から8まで+1し続けて、8になったら処理を終わる
094. for(int d2 = 1;d2 < 8;d2 ++){
//整数型の変数d2を1から8まで+1し続けて、8になったら処理を終わる
095. if(td[d2][d1] == 0){ //もしtd[d2][d1] == 0ならば
096. fg = 0; //fgに0を代入
097. }else if(td[d2][d1] < 6){ //そうではなくもしtd[d2][d1] < 6)ならば
098. cf = 0; //cfに0を代入
099. if((td[d2][d1] == td[d2][d1+1])||(td[d2][d1] == td[d2][d1+1]-5))cf ++;
100. if((td[d2][d1] == td[d2][d1-1])||(td[d2][d1] == td[d2][d1-1]-5))cf ++;
101. if((td[d2][d1] == td[d2+1][d1])||(td[d2][d1] == td[d2+1][d1]-5))cf ++;
102. if((td[d2][d1] == td[d2-1][d1])||(td[d2][d1] == td[d2-1][d1]-5))cf ++;
103. if(cf != 2)fg = 0;
104. }else if(td[d2][d1] < 11){ //そうではなくもしtd[d2][d1] < 11ならば
105. cf = 0; //cfに0を代入
106. if(td[d2][d1] == td[d2][d1+1]+5)cf ++;
107. if(td[d2][d1] == td[d2][d1-1]+5)cf ++;
108. if(td[d2][d1] == td[d2+1][d1]+5)cf ++;
109. if(td[d2][d1] == td[d2-1][d1]+5)cf ++;
110. if(cf != 1)fg = 0;
111. }
112. }
113. }
114. if(fg == 1){ //もしfgが1ならば
115. og.setFont(new Font("",Font.BOLD,60));
116. og.setColor(Color.black);
117. og.drawString("clear!!",52,158);
118. og.setColor(Color.red);
119. og.drawString("clear!!",50,160);
120. }
121. g.drawImage(os,0,0,this);
122. }
123.
124. public void d_rect(int cc,int xx,int yy){
125. if(cc == 0){ //もしccが0ならば
126. og.setColor(new Color(255,250,205));
//色を、赤255、緑250、青205の割合で混ぜた色にする
127. og.fillRoundRect(xx*30,yy*30,30,30,7,7);
128. og.setColor(Color.gray); //ogの色を灰色にする
129. og.drawRoundRect(xx*30,yy*30,30,30,7,7);
130. }else if(cc < 6){ //そうではなくもしcc < 6ならば
131. for(int kk = 1;kk < 16;kk ++){
//整数型の変数kkを1から16まで+1し続けて、16になったら処理を終わる
132. switch(cc){ //case1~5の中から適切なものを選ぶ
133. case 1 : og.setColor(new Color(255 - kk*10, 0, 0)) ; break ;
134. case 2 : og.setColor(new Color( 0,255 - kk*10, 0)) ; break ;
135. case 3 : og.setColor(new Color( 0, 0,255 - kk*10)) ; break ;
136. case 4 : og.setColor(new Color(255 - kk*10,255 - kk*10, 0)) ; break ;
137. case 5 : og.setColor(new Color(255 - kk*10, 0,255 - kk*10)) ; break ;
138. }
139. og.drawRect(xx*30+kk,yy*30+kk,30-kk*2,30-kk*2);
//座標(xx*30+kk,yy*30+kk)に左隅が配置されている幅30-kk*2、高さ30-kk*2の四角形を描画すし、指定された色にする
140. }
141. }else if(cc < 11){ //そうではなくもしcc < 11ならば
142. for(int kk = 1;kk < 16;kk ++){
//整数型の変数kkを1から16まで+1し続けて、16になったら処理を終わる
143. switch(cc){ //case1~5の中から適切なものを選ぶ
144. case 1 : og.setColor(new Color(255 - kk*10, 0, 0)) ; break ;
145. case 2 : og.setColor(new Color( 0,255 - kk*10, 0)) ; break ;
146. case 3 : og.setColor(new Color( 0, 0,255 - kk*10)) ; break ;
147. case 4 : og.setColor(new Color(255 - kk*10,255 - kk*10, 0)) ; break ;
148. case 5 : og.setColor(new Color(255 - kk*10, 0,255 - kk*10)) ; break ;
149. }
150. og.drawRect(xx*30+kk,yy*30+kk,30-kk*2,30-kk*2);
151. }
152.
153. for(int kk = 1;kk < 16;kk ++){
//整数型の変数kkを1から16まで+1し続けて、16になったら処理を終わる
154. switch(cc){ //case6~10の中から適切なものを選ぶ
155. case 6 : og.setColor(new Color(105 + kk*10, 0, 0)) ; break ;
156. case 7 : og.setColor(new Color( 0,105 + kk*10, 0)) ; break ;
157. case 8 : og.setColor(new Color( 0, 0,105 + kk*10)) ; break ;
158. case 9 : og.setColor(new Color(105 + kk*10,105 + kk*10, 0)) ; break ;
159. case 10 : og.setColor(new Color(105 + kk*10, 0,105 + kk*10)) ; break ;
160. }
161. og.drawRect(xx*30+kk,yy*30+kk,30-kk*2,30-kk*2);
162. }
163. }
164. }
165.
166. public void d_set(){
167. for(int s1 = 0;s1 < 9;s1 ++){
//int型の変数s1を0~9まで+1し続けて、9になったら処理を終了する
168. td[0][s1] = -1 ; td[8][s1] = -1 ; td[s1][0] = -1 ; td[s1][8] = -1 ;
169. }
170. for(int s1 = 1;s1 < 8;s1 ++){
//int型の変数s1を1~8まで+1し続けて、8になったら処理を終了する
171. for(int s2 = 1;s2 < 8;s2 ++){
//int型の変数s2を1~8まで+1し続けて、8になったら処理を終了する
172. td[s2][s1] = 0; //td[s2][s1]を0に初期化
173. }
174. }
175. for(int s1 = 0;s1 < 5;s1 ++){
//int型の変数s1を0~5まで+1し続けて、5になったら処理を終了する
176. td[pd[0][s1][1]][pd[0][s1][0]] = s1 + 6;
//td[pd[0][s1][1]][pd[0][s1][0]]にs1 + 6の値を代入
177. td[pd[0][s1][3]][pd[0][s1][2]] = s1 + 6;
//td[pd[0][s1][3]][pd[0][s1][2]]にs1 + 6の値を代入
178. }
179. }
180.
181. public void start(){
182. if(th == null){ //もしthがnullならば
183. th = new Thread(this); //新しいスレッドを作成して、それをスレッドthとする
184. th.start(); //thを始める
185. }
186. }
187.
188. public void stop(){
189. th = null; //thにnullを入れる
190. }
191.
192. public void run(){
193. while(th != null){ //thがnullでない間は、処理を続ける
194. try{
195. Thread.sleep(100); //スレッドthを100ミリ秒間待機させる
196. }
197. catch (InterruptedException e){
198. }
199. }
200. }
201.
202. public void update( Graphics g ){
203. paint( g ) ; //メソッドpaint()をよびだして、g上にコンポーネントを描画する
204. }
205. }
実行結果
connection
配列は、色を変えるパネルを指定するときに使われる。
メソッドd_rect()により、パネルの形、枚数、色が決まる。
メソッドd_set()より、td[9][9]の基本は下のとおりである。
td[9][9]={{-1,-1,-1,-1,-1,-1,-1,-1,-1}
{-1, 0, 0, 0, 0, 0, 0, 0,-1}
{-1, 0, 0, 0, 0, 0, 0, 0,-1}
{-1, 0, 0, 0, 0, 0, 0, 0,-1}
{-1, 0, 0, 0, 0, 0, 0, 0,-1}
{-1, 0, 0, 0, 0, 0, 0, 0,-1}
{-1, 0, 0, 0, 0, 0, 0, 0,-1}
{-1, 0, 0, 0, 0, 0, 0, 0,-1}
{-1,-1,-1,-1,-1,-1,-1,-1,-1}}
56行目は、Resetしたときの処理である。
switch()が使われているところは、どのタイルの色を変えておくか決める処理である。
PUZZLE