预览效果
对角棋
游戏简介:双方执不同颜色棋子,每人3颗棋子,只要将自己的三个棋子走成一条线,并且这条直线是对角直线,对方就算输了。
完整代码部分
package demo01;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AnglesChess003 extends JFrame implements KeyListener, ActionListener, MouseListener {
// 定义一个内部类用来创建坐标
class Point{
public int x;
public int y;
public Point (int x,int y){
this.x=x;
this.y=y;
}
}
// 行数(高)
int height=3;
// 列数(宽)
int width=3;
// 格子的大小
int size=150;
// 标题栏的高度
int title=100;
// 创建一个棋盘 0表示空 1表示黑子 2表示白子
int[][]qipan ={{1,1,1},{0,0,0},{2,2,2}};
// 设置游戏状态 1表示等待黑方落子 2表示等待白方落子 3表示黑子胜 4表示白字胜
int zhuangtai =1;
// 定义一个点 记录选中的位置 初始值设置为-1-1,表示无效值(为选中)
// 记录最后一次鼠标点击的位置
int x=-1;
int y=-1;
// 选中时棋子大小改变的范围值
int size_qizi_max=105;
int size_qizi_min=100;
int size_qizi_cur=100;
// 定义棋子动画的状态 0表示动画停止 1表示棋子变小 2表示棋子变大
int zhuangtai_qizi=0;
// 棋子移动动画
int zhuangtai_moue=0;
Point point1=new Point(-1,-1);
Point point2=new Point(-1,-1);
int moue_jingdu=0;
Point point_cur=new Point(-1,-1);
// 设置图片
private Image image=null;
Graphics gf=null;
// 设置计时器
Timer timer=new Timer(30,this);
public void Tian(){
//设置窗口的宽高
this.setSize(width*size ,height*size+title);
// 设置标题
this.setTitle("对角棋");
//设置窗口能看见
this.setVisible(true);
// 设置窗口顶点坐标的位置
this.setLocation(100,100);
//设置鼠标监听事件(也就是当鼠标有什么反应都会调用此函数)
this.addMouseListener(this);
}
public void paint(Graphics g){
image=this.createImage(width*size,height*size+title);
this.gf =image.getGraphics();
// 擦除背景
gf.setColor(Color.gray);
gf.fill3DRect(0,0,width*size,title+height*size,true);
// 绘制背景
gf.setColor(Color.orange);
gf.fill3DRect(0,title+0,width*size,title+height*size,true);
// 绘制提示信息
gf.setFont(new Font("华文新魏", 10, 35)); //设置字体
if(zhuangtai==1){
gf.setColor(Color.black);
// 提示黑方移子
gf.drawString("黑方移子",width*size/2-(35*2),title-17);
}else if(zhuangtai==2){
gf.setColor(Color.white);
// 提示白方移子
gf.drawString("白方移子",width*size/2-(35*2),title-17);
}else if(zhuangtai==3){
gf.setColor(Color.black);
// 黑方获胜
gf.drawString("黑方棋赢",width*size/2-(35*2),title-17);
}else if(zhuangtai==4){
gf.setColor(Color.white);
// 白方获胜
gf.drawString("白方棋赢",width*size/2-(35*2),title-17);
}
// 绘制棋盘线
gf.setColor(new Color(109, 65, 46, 176));
int x1=0+size/2;
int y1=title+size/2;
gf.drawRect(x1,y1,2*size,2*size);
gf.drawLine(x1,y1+size,2*size+x1,y1+size);
gf.drawLine(x1+size,y1,x1+size,y1+2*size);
gf.drawLine(x1,y1,x1+2*size,y1+2*size);
gf.drawLine(x1,y1+2*size,x1+2*size,y1);
// 绘制棋子
// 设置棋子的宽度
int size_qizi=100;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if(qipan[i][j]==1){
// 当前选中的棋子
// 移动效果
if(zhuangtai_moue==1&&i==point2.y&&j==point2.x){
gf.setColor(Color.black);
double x=point1.x+((double)point2.x-point1.x)/100*moue_jingdu;
double y=point1.y+((double)point2.y-point1.y)/100*moue_jingdu;
gf.fillOval((int)(x*size+(size-size_qizi)/2),(int)(y*size+title+(size-size_qizi)/2),size_qizi,size_qizi);
} else if (y==i&&x==j){//选中效果
gf.setColor(Color.black);
gf.fillOval(j*size+(size-size_qizi_cur)/2,i*size+title+(size-size_qizi_cur)/2,size_qizi_cur,size_qizi_cur);
}else{
gf.setColor(Color.black);
gf.fillOval(j*size+(size-size_qizi)/2,i*size+title+(size-size_qizi)/2,size_qizi,size_qizi);
}
}
if(qipan[i][j]==2){
// 当前选中的棋子
// 移动效果
if(zhuangtai_moue==1&&i==point2.y&&j==point2.x){
gf.setColor(Color.white);
double x=point1.x+((double)point2.x-point1.x)/100*moue_jingdu;
double y=point1.y+((double)point2.y-point1.y)/100*moue_jingdu;
gf.fillOval((int)(x*size+(size-size_qizi)/2),(int)(y*size+title+(size-size_qizi)/2),size_qizi,size_qizi);
} else if(y==i&&x==j){
gf.setColor(Color.white);
gf.fillOval(j*size+(size-size_qizi_cur)/2,i*size+title+(size-size_qizi_cur)/2,size_qizi_cur,size_qizi_cur);
}else{
gf.setColor(Color.white);
gf.fillOval(j*size+(size-size_qizi)/2,i*size+title+(size-size_qizi)/2,size_qizi,size_qizi);
}
}
}
}
// 绘制选中棋子
int size_tishi=20;
if(x!=-1&&y!=-1){
// gf.setColor(Color.green);
// gf.fillOval(x*size+size/4,y*size+size/4+title,size/2,size/2);
Point points[]=getMove(new Point(x,y));
if(qipan[y][x]==1){
gf.setColor(new Color(0,0,0, 129));
}else if(qipan[y][x]==2){
gf.setColor(new Color(245, 241, 241, 186));
}
for (int i = 0; i <points.length ; i++) {
if(qipan[points[i].y][points[i].x]==0){
// gf.setColor(new Color(213, 119, 194, 136));
gf.fillOval(points[i].x*size+(size-size_tishi)/2,points[i].y*size+title+(size-size_tishi)/2,size_tishi,size_tishi);
}
}
}
g.drawImage(image,0,0,null);
}
public void actionPerformed(ActionEvent e) {
if(zhuangtai_qizi==1){
size_qizi_cur-=2;
if(size_qizi_cur<size_qizi_min){
zhuangtai_qizi=2;
}
}else if (zhuangtai_qizi==2){
size_qizi_cur++;
if (size_qizi_cur>size_qizi_max){
zhuangtai_qizi=1;
}
}
if (zhuangtai_moue==1){
moue_jingdu+=10;
if (moue_jingdu>100){
zhuangtai_moue=0;
}
}
repaint();
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
// 鼠标店家事件
public void mouseClicked(MouseEvent e) {
}
// 鼠标按压事件
public void mousePressed(MouseEvent e) {
// 处理鼠标左键
if(e.getButton()==e.BUTTON1){
// 鼠标点击的真实坐标
int realx=e.getX();
int realy=e.getY();
int gezix=-1;
int geziy=-1;
// 将真是坐标转换为格子坐标
if(realx<0 ||realx>width*size||realy<title||realy>height*size+title){
x=-1;
y=-1;
// 停止定时器
// 关闭计时器后恢复棋子的大小
size_qizi_cur=size_qizi_max;
// 棋子的动画状态设置为0
zhuangtai_qizi=0;
System.out.println("你点在棋盘外面了");
}else{//说明这个点在棋盘里
gezix=realx/size;
geziy=(realy-title)/size;
// 第二步移动棋子
if(x!=-1&&y!=-1){
if(qipan[geziy][gezix]==0){
Point [] points=getMove(new Point(x,y));
for (int i = 0; i < points.length; i++) {
if(points[i].x==gezix&&points[i].y==geziy){
// 移动棋子
point1.x=x;
point1.y=y;
point2.x=gezix;
point2.y=geziy;
point_cur.x=x;
point_cur.y=y;
moue_jingdu=0;
zhuangtai_moue=1;
timer.start();
qipan[geziy][gezix]=qipan[y][x];
qipan[y][x]=0;
x=-1;
y=-1;
// 改变游戏状态
if (zhuangtai==1){
zhuangtai=2;
}else if (zhuangtai==2){
zhuangtai=1;
}
// 判断胜负
if(shenfu()==1){
zhuangtai=3;
// System.out.println("黑子胜");
}else if(shenfu()==2){
zhuangtai=4;
// System.out.println("白子胜");
}
break;
}
}
}
当前选中的格子为空格
// if(qipan[geziy][gezix]==0){
当前选中的格子为空格且在之前选中的格子的附近
// if((gezix+1==x||gezix-1==x||gezix==x)&&(geziy==y||geziy+1==y||geziy-1==y)){
// }
// }
}
//第一步选中棋子
if(qipan[geziy][gezix]==zhuangtai){
x=gezix;
y=geziy;
zhuangtai_qizi=1;
timer.start();
}else{
x=-1;
y=-1;
// 关闭计时器后恢复棋子的大小
size_qizi_cur=size_qizi_max;
// 棋子的动画状态设置为0
zhuangtai_qizi=0;
}
System.out.println("你点了"+x+y);
}
}
repaint();
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
// 得到所有可以移动的格子
public Point[] getMove(Point point){
if(point.y==0){
if(point.x==0){
return new Point[]{new Point(1,0),new Point(1,1),new Point(0,1)};
}else if(point.x==1){
return new Point[]{new Point(0,0),new Point(1,1),new Point(2,0)};
}else if(point.x==2){
return new Point[]{new Point(1,0),new Point(1,1),new Point(2,1)};
}
}else if(point.y==1){
if(point.x==0){
return new Point[]{new Point(0,0),new Point(1,1),new Point(0,2)};
}else if(point.x==1){
return new Point[]{new Point(0,0),new Point(1,0),new Point(2,0),new Point(0,1),new Point(2,1),new Point(0,2),new Point(1,2),new Point(2,2)};
}else if(point.x==2){
return new Point[]{new Point(2,0),new Point(1,1),new Point(2,2)};
}
}else if(point.y==2){
if(point.x==0){
return new Point[]{new Point(0,1),new Point(1,1),new Point(1,2)};
}else if(point.x==1){
return new Point[]{new Point(0,2),new Point(1,1),new Point(2,2)};
}else if(point.x==2){
return new Point[]{new Point(1,2),new Point(1,1),new Point(2,1)};
}
}
return new Point[0];
}
public int shenfu(){
// 0表示平手 1表示黑棋胜 2表示白棋胜
// 判断黑棋是否胜利
if(qipan[0][0]==1&&qipan[1][1]==1&&qipan[2][2]==1){
return 1;
}else if(qipan[0][2]==1&&qipan[1][1]==1&&qipan[2][0]==1){
return 1;
}
// 判断白棋是否胜利
if(qipan[0][0]==2&&qipan[1][1]==2&&qipan[2][2]==2){
return 2;
}else if(qipan[0][2]==2&&qipan[1][1]==2&&qipan[2][0]==2){
return 2;
}
return 0;
}
public static void main(String[] args) {
AnglesChess003 anglesChess=new AnglesChess003();
anglesChess.Tian();
}
}