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