ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュの五目並べを作っているのですが・・・。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
今、黒石と白石を交互に置くということやりたのですが、自分でやってみたプログラム↓


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
/*
<applet code="renshu3"width=800 height=800>
</applet>
*/

public class renshu3 extends Applet
implements MouseListener,MouseMotionListener{
Point p;
int flag=1;

public void init(){
addMouseListener(this);
addMouseMotionListener(this);
}
public void mouseClicked(MouseEvent me){
}

public void mouseEntered(MouseEvent me){
}

public void mouseExited(MouseEvent me){
}

public void mousePressed(MouseEvent me){
p=me.getPoint();
repaint();
}
public void mouseReleased(MouseEvent me){

}
public void mouseDragged(MouseEvent me){
}
public void mouseMoved(MouseEvent me){
}

public void paint(Graphics g){

g.setColor(new Color(255,128,3)); //背景の色指定
g.fillRect(20,20,600,600); //塗りつぶすスペース

g.setColor(Color.black); //色を元の黒に戻す
int a;
for(a=0;a<=15;a++){
g.drawLine(20,20+40*a,620,20+40*a);
g.drawLine(20+40*a,20,20+40*a,620);
}
if(flag==1){
g.setColor(Color.black);
g.fillOval(p.x,p.y,30,30);
flag*=(-1);
}
else{
g.setColor(Color.white);
g.fillOval(p.x,p.y,30,30);
flag*=(-1);
}
}
}


だと、黒石のあとに白を置こうとすると最初に置いた黒が消えてしまいます。
1度置いた石はそのまま残るようにしたいのですがどこをいじればいいでしょうか??
それとも根本的にやり方が違うのでしょうか?
よろしくおねがいします。

コメント(16)

アドバイスありがとうございます。

さっそくやってみたんですがうまくできません。。
どこにどんなプログラムをいれればいいか教えていただきたいのですがダメでしょうか??
Point pが1つでは、石は1つだけしか表示されませんよね。

Listを白黒2つ分宣言し、mousePressedでPointを格納。
paintで配列をループさせ描画。
今後五目並んだかどうかの判定をすることになりますから、
シンプルにint[][]型の配列に盤面を覚えさせたほうがいいと思います。

たとえば盤面のサイズを16x16にするなら
...
int[][] board = new int[16][16];
...
if (board[y][x] == 0) {
  board[y][x] = flag;
}
...
みたいな感じで。
>なかのさん
言われてることは分かるのですがイマイチ理解できません。
もう少し具体的に教えてください!!
おねがいします。

>ごさごささん
アドバイスありがとうございます。
先のことも考えて、作ってみたいと思います。
変更前と、後ね。動作確認はしてませんのであしからず。
面倒くさかったので白黒に分けるのはやめました。

前:Point p;
後:List stones = new ArrayList();
//------------------------------------------------
前:p=me.getPoint();
後:sones.add(me.getPoint());
//------------------------------------------------
前:
if(flag==1){
g.setColor(Color.black);
g.fillOval(p.x,p.y,30,30);
flag*=(-1);
}
else{
g.setColor(Color.white);
g.fillOval(p.x,p.y,30,30);
flag*=(-1);
}

後:
int n = 0;
for(Iterator it = stones.iterator; it.hasNext();){
Point p = (Point)it.next();
g.setColor((n % 2 == 0) ? Color.white: Color.black);
g.fillOval(p.x,p.y,30,30);
}
>なかのさん
できました!!!
本当にありがとうございます!!
まだ完成まで先は長いですが、どうにか1歩前に進めました。
本当にありがとうございます!!
迷った時にまたアドバイスを頂けたらうれしいです!!
すみません。またわからないとこがでてしまいました。
交互におけるのですが、クリックが有効ではない範囲をクリックすると、なにも置かずに次の石の色になってしまいます。
有効範囲以外をクリックしたらやり直しというようにしたいんですが・・・。。
else文に何かを入れればできるとは思うんですが、なにを書けばいいかわかりません。。


int n = 0;
int kx,ky;
int flag=1;
int i,j;
int field[][]=new int[17][17];
for(i=1;i<17;i++)
{
for(j=1;j<17;j++)
{
field[i][j]=0;
}
}


for(Iterator it = stones.iterator(); it.hasNext();){
Point p = (Point)it.next();

if(flag==1){
g.setColor(Color.black);
kx=p.x/40;
ky=p.y/40;
if(p.x-40*kx>5 && p.x-40*kx<35 &&p.y-40*ky>5 && p.y-40*ky<35 && field[kx+1][ky+1]==0)


else()

g.fillOval(5+40*kx,5+40*ky,30,30);
field[kx+1][ky+1]=flag;
flag*=(-1);
}
else{
g.setColor(Color.white);
kx=p.x/40;
ky=p.y/40;
if(p.x-40*kx>5 && p.x-40*kx<35 &&p.y-40*ky>5 && p.y-40*ky<35 && field[kx+1][ky+1]==0)

else()


g.fillOval(5+40*kx,5+40*ky,30,30);
field[kx+1][ky+1]=flag;
flag*=(-1);
}
}
}
}

よろしくお願いします。。
範囲が妥当な場合のみ
sones.add(me.getPoint());
を実行する
できました☆
ありがとうございます!!!
もう少しで完成ってとこまできました☆
昨日の今日ですみません。
いま石が5つ並んだかチェックするプログラムを作っています。
縦、横は簡単に行ったのですが、斜めのチェックがうまいことつくれません。

while(field[judgex][judgey]==field[kx+1][ky+1])judgex++,judgey++;

と書くとエラーになります。
文の作り方がダメなのはわかるのですが
自分としてはx座標もy座標もプラス1ずつして調べる。
ということがしたいのです。
どう直せばいいですか??
よろしくお願いします。
>かずきちさん、tmrさん
エラーはx++;y++;
のセミコロンはダメでしょっていうのだったんですけど{}を
使ったらエラーは消えました。ありがとうございました。
ただ実際に斜めに5つ石を置いても反応しません。
ドコがダメでしょうか??よろしくおねがいします。



int n = 0;
int kx,ky;
int flag=1;
int i,j;
int field[][]=new int[17][17];
for(i=1;i<17;i++)
{
for(j=1;j<17;j++)
{
field[i][j]=0;
}
}


for(Iterator it = stones.iterator(); it.hasNext();){
Point p = (Point)it.next();

if(flag==1){
g.setColor(Color.black);
kx=p.x/40;
ky=p.y/40;
if(p.x-40*kx>5 && p.x-40*kx<35 &&p.y-40*ky>5 && p.y-40*ky<35 && field[kx+1][ky+1]==0)
{
g.fillOval(5+40*kx,5+40*ky,30,30);
field[kx+1][ky+1]=flag;

int judgex,judgey;
int sam1,sam2,sam3,sam4,sam5,sam6,sam7,sam8;

//横チェック
judgex=kx+1;
while(field[judgex][ky+1]==field[kx+1][ky+1])judgex++;
sam1=judgex-(kx+1);
judgex=kx+1;
while(field[judgex][ky+1]==field[kx+1][ky+1])judgex--;
sam2=(kx+1)-judgex;

          //縦チェック
judgey=ky+1;
while(field[kx+1][judgey]==field[kx+1][ky+1])judgey++;
sam3=judgey-(ky+1);
judgey=ky+1;
while(field[kx+1][judgey]==field[kx+1][ky+1])judgey--;
sam4=(ky+1)-judgey;

//斜めチェック         
judgex=kx+1;
judgey=ky+1;
while(field[judgex][judgey]==field[kx+1][ky+1]){
judgex++;judgey++;

}
sam5=judgex-(kx+1);//←ここがおかしいですか??
judgex=kx+1;
judgey=ky+1;
while(field[judgex][judgey]==field[kx+1][ky+1]){
judgex--;judgey--;
}
sam6=(kx+1)-judgex;

if(sam1+sam2-1>=5||sam3+sam4-1>=5||sam5+sam6-1>=5)
g.drawString("黒の勝ち!!!",550,550);


flag*=(-1);
}
}
else{
g.setColor(Color.white);
kx=p.x/40;
ky=p.y/40;
if(p.x-40*kx>5 && p.x-40*kx<35 &&p.y-40*ky>5 && p.y-40*ky<35 && field[kx+1][ky+1]==0)
{
g.fillOval(5+40*kx,5+40*ky,30,30);
field[kx+1][ky+1]=flag;

int judgex,judgey;
int sam1,sam2,sam3,sam4,sam5,sam6,sam7,sam8;

judgex=kx+1;
while(field[judgex][ky+1]==field[kx+1][ky+1])judgex++;
sam1=judgex-(kx+1);
judgex=kx+1;
while(field[judgex][ky+1]==field[kx+1][ky+1])judgex--;
sam2=(kx+1)-judgex;

judgey=ky+1;
while(field[kx+1][judgey]==field[kx+1][ky+1])judgey++;
sam3=judgey-(ky+1);
judgey=ky+1;
while(field[kx+1][judgey]==field[kx+1][ky+1])judgey--;
sam4=(ky+1)-judgey;

judgex=kx+1;
judgey=ky+1;
while(field[judgex][judgey]==field[kx+1][ky+1]){
judgex++;judgey++;


}
sam5=judgex-(kx+1);
judgex=kx+1;
judgey=ky+1;
while(field[judgex][judgey]==field[kx+1][ky+1]){
judgex--;judgey--;
}
sam6=(kx+1)-judgex;

if(sam1+sam2-1>=5||sam3+sam4-1>=5||sam5+sam6-1>=5)
g.drawString("白の勝ち!!!",550,550);


flag*=(-1);
}
}
}
}
}
judgex++;judgey++;
と
judgex--;judgey--;

を

judgex++;judgey++;
と
judgex--;judgey++;

のように変えてみるとできると思います。

ログインすると、残り2件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。