java高手进,五子棋的问题

packagecom.game;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.event.Mou... package com.game;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

class GoBangFrame extends Frame implements MouseListener
{
//取得x和y坐标点,用于确定绘制棋子的位置
int x;
int y;

GoBangFrame()
{
this.setSize(443,443);
this.addMouseListener(this);
this.setResizable(false);
this.setVisible(true);

}

public void paint(Graphics g)
{
x = (x-6)/20*20+6; //这里为什么要这么计算棋子才能准确的画在x坐标和y坐标的交叉点上??
y = (y-62)/20*20+62; //这里也是?
g.fillOval(x-4, y-4, 14, 14);

//绘制网格
for(int i=0; i<17; i++)
{
g.drawLine(9,65+20*i,328,65+20*i);
g.drawLine(9+20*i,65,9+20*i,385);
}

}
@Override
public void mouseClicked(MouseEvent e) {
x = e.getX();
y = e.getY();
System.out.println(x + " " + y);
this.repaint();
}
//其他接口方法省略

}
主方法省略。。。。
请高手说得通俗点,我数学不是特好。
3Q
二楼,你好。你说的问题我知道,我只想知道我现在这个问题,3Q!
展开
 我来答
Guil艾lin
2012-04-27
知道答主
回答量:25
采纳率:0%
帮助的人:17.3万
展开全部
因为棋子始终是要画在棋盘线的交叉点上的,可能你选择的时候认为自己准确的点在了交叉点上,但是电脑得到的坐标确实比交叉点的坐标过或多或少,因此(x-6)/20此时算出的是整型值,比如x是16,得到结果是0,表示的是第一条棋盘线,只要x坐标值小于20,算出都是在第一条线,再乘以20,就是棋盘线在窗体上的坐标,至于再加6,以及后面的减4,是因为一个棋子是圆形的,有一定的半径,而棋子是圆心画在交叉点上的,对棋子的左上角位置进行的运算,其实算出的圆心并不一定和交叉点重合,不过一般偏差不大,看不出来的,其实不用那么麻烦的!至于y也是一样的,只是坐标值不一样而已,希望帮到楼主,全是手机键盘手打,发到后面了些!看楼主了!
追问
你好,那如果我鼠标点击的时候x和y的坐标点都是40,40,然后在绘制棋子之前,用我上面的公式:
x = (x-6)/20*20+6;
y = (y-62)/20*20+62;

拿x来计算下 :
x = (40-6)/20*20+6
到头来还不是40?

为什么要这么计算在我点击不是交叉点的时候才能确保画的是交叉点上呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-04-27
展开全部
找张纸把for(int i=0; i<17; i++)
{
g.drawLine(9,65+20*i,328,65+20*i);
g.drawLine(9+20*i,65,9+20*i,385);
}
棋盘画出来。你自己找交叉点看看。左上角第一个交叉点可以看成(0,0),在计算鼠标位置坐标。鼠标的位置不一定恰好在交叉点处,离那个交叉点进就落那。假设左上角第一个交叉点坐标是(20,10) 点与点之间距离是20,鼠标的坐标计算为:((x-20+10)/20,(y-10+5)/20)。你的数据稍微复杂一点,棋盘画出来后自己能够分析出来的。 绘制棋子时,反过来根据鼠标坐标求得交叉点位置 比如鼠标位置(32,13),鼠标坐标为(1,0),绘制棋子位置为(1*20+20,0*20+10).
追问
你好,那如果我鼠标点击的时候x和y的坐标点都是40,40,然后在绘制棋子之前,用我上面的公式:
x = (x-6)/20*20+6;
y = (y-62)/20*20+62;

拿x来计算下 :
x = (40-6)/20*20+6
到头来还不是40?

为什么要这么计算在我点击不是交叉点的时候才能确保画的是交叉点上呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友845f74e61
2012-04-27 · TA获得超过6929个赞
知道大有可为答主
回答量:4050
采纳率:50%
帮助的人:1693万
展开全部
g.fillOval(x-4, y-4, 14, 14);

因java中画圆的起点不是圆心。
比如你在 20, 20 这个点上画一个直径为 10 的 圆。
它是在 20,20 ,这个点开始,一个正方型区域内画圆,这个正方弄的四个点是
20, 20 | 30, 20 | 20, 30 , | 30 ,30
那么这个圆的圆心在 25 ,25

你的这个程序没有细看那些数字的含义,但应该是计算这个偏移量。

如果我想让我点的是圆心,那就应该感去半径 15 ,15 这个才是我举例的画圆起始点。圆心就成了20 ,20

------------------------------------------------------------------------------------------
嗯,你那个程序我看了一下。 那两个记算是为是能够得到 精确的坐标点。
因为你的鼠标点下,不可能完全是交点的坐标。
20 是线之间的间距。

6 和 62 这个我现在还没看出来。
应该是作者根据点坐标算出来的。

下边是测试的一个X点
X - 6 = 182
(x-6)/20 = 9
(x-6)/20 * 20 = 180
(x-6)/20 * 20 +6 = 186

这个应该是作都根据点反推出来的。如果线的位置不一样,这个数也应该不同。
更多追问追答
追问
你好,那如果我鼠标点击的时候x和y的坐标点都是40,40,然后在绘制棋子之前,用我上面的公式:
x = (x-6)/20*20+6;
y = (y-62)/20*20+62;

拿x来计算下 :
x = (40-6)/20*20+6
到头来还不是40?

为什么要这么计算在我点击不是交叉点的时候才能确保画的是交叉点上呢?
追答
呵呵,你进入了一个误区。
java的除是取整,如果不是double型 的,是不会有小数的。

int x = 40;
System.out.println(x - 6);
System.out.println((x - 6) / 20);
System.out.println((x - 6) / 20 * 20);
System.out.println((x - 6) / 20 * 20 + 6);
你执行一下。

34
1
20
26

上面是结果,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Eking2000
2012-04-27 · TA获得超过1228个赞
知道小有建树答主
回答量:1471
采纳率:0%
帮助的人:746万
展开全部
你的绘制有问题,如果切换一下窗口,你的除了当前棋子之外的所有棋子会消失,因此,你应该用一个数组来存储棋子,绘制的时候,遍历数组,凡是放置了棋子的地方都绘制一遍,这样确保已经在的棋子不会消失。
追问
你好,那如果我鼠标点击的时候x和y的坐标点都是40,40,然后在绘制棋子之前,用我上面的公式:
x = (x-6)/20*20+6;
y = (y-62)/20*20+62;

拿x来计算下 :
x = (40-6)/20*20+6
到头来还不是40?

为什么要这么计算在我点击不是交叉点的时候才能确保画的是交叉点上呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yandajun01
2012-04-27 · 超过11用户采纳过TA的回答
知道答主
回答量:42
采纳率:0%
帮助的人:30.7万
展开全部
x = (x-6)/20*20+6; //这里为什么要这么计算棋子才能准确的画在x坐标和y坐标的交叉点上??
这个道理很简单,因为你每次鼠标点的都是一个大概的棋子范围,如果不缓缓转换成标准的位置,那每次画出来的棋子就很不整齐。
比如要在(50,50)这个点上画个棋子,鼠标可能点到的坐标为(51,49)或(49,52)等等,总是有点误差的。
更多追问追答
追问
你好,那如果我鼠标点击的时候x和y的坐标点都是40,40,然后在绘制棋子之前,用我上面的公式:
x = (x-6)/20*20+6;
y = (y-62)/20*20+62;

拿x来计算下 :
x = (40-6)/20*20+6
到头来还不是40?

为什么要这么计算在我点击不是交叉点的时候才能确保画的是交叉点上呢?
追答
呵呵,X是int,x = (40-6)/20*20+6 结果应该是26啊
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式