java小游戏-五子棋

1、设计蓝图

  • 首先是黑棋白棋这两个对象,用vector集合以 x-y 的形式在集合中存入棋子的坐标。
  • 给界面添加鼠标点击事件,因为首先下的是白子,所以可以用v.size()%2==0来决定是否画黑子还是白子;还有处理棋子没有下在网格中间的处理方法,即:x=(x-x%w)+(x%w>w/2?w:0);
  • 还有右键点击悔棋的功能,判断一下上一次下的是黑棋还是白棋,判断一下是否超过三步,如果否,执行vector中的move方法来除去集合中上一步下的棋子。

效果:
upload successful
2、 源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
import java.awt.BorderLayout;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Wuziqi extends JFrame implements MouseListener {
	int px=100,py=100;   //棋盘黑线的坐标原点即(0,0)位置
	int w=25;   //一个小格是长宽为25的小格
	int vline=px+16*w;//横线长度   vline=500
	int hline=py+16*w;//纵线长度   16个空,17条线
	boolean b; //用来判断白旗还是黑棋
	int whiteCount, blackCount; //计算悔棋步数
	Vector v=new Vector();
	Vector white  = new Vector();
	Vector black  = new Vector();
	
	public static void main(String args[]) {
		new Wuziqi();
	}
	//构造方法
	public Wuziqi() {
		this.setVisible(true);
		this.setTitle("小志版五子棋");
		this.setLocationRelativeTo(null);   //在屏幕上居中显示
		Container container =this.getContentPane();
		container.setLayout(new BorderLayout());
		this.setSize(600,600);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBackground(Color.orange);
		//添加监听器
		this.addMouseListener(this);
	}
	
	public void paint(Graphics g) {
		//清除画板,重新画画
		g.clearRect(0,0,600,600);
		g.drawRect(px, py, 16*w, 16*w); //注意不是px+16*w
		g.setColor(Color.black);
		for(int i=0;i<16;i++)
			g.drawLine(px, py+w*i,vline, py+w*i);
		for(int i=0;i<16;i++)
			g.drawLine(px+w*i, py,px+w*i, hline);

		//画棋子
		for(int i=0;i<v.size();i++) {
			//获取棋子的坐标
			String string=(String)v.get(i);
			String[] cha =string.split("-");
			//获取x,y的坐标,此时是(2,2)这种形式
			int x=Integer.parseInt(cha[0]);
			int y=Integer.parseInt(cha[1]);
			//x y坐标转化棋盘中的像素位置
			x=x*w+px;
			y=y*w+py;
			if(i%2==0){
				//一定要是i%2才行;不然的话会画错棋子
				g.setColor(Color.WHITE);
			}else {
				g.setColor(Color.BLACK);
				//g.setColor(Color.white);
			}
			//设置好画笔的颜色,画棋子
			g.fillArc(x-w/2,y-w/2,w,w,0,360);
		}
	}
	
	//鼠标事件
	public void mouseClicked(MouseEvent e) {
		if(e.getButton()==e.BUTTON1) {
			int x=e.getX();
			int y=e.getY();
			//棋子的坐标若在一个格的1/2边的时候就划到这一边
			x=(x-x%w)+(x%w>w/2?w:0);
			y=(y-y%w)+(y%w>w/2?w:0);
			//把棋子的坐标变化成表格中的坐标
			x=(x-px)/w;
			y=(y-py)/w;
			//打印下的棋子的坐标  System.out.println(x+"  "+y );
			//先判断一下,因为不能在棋盘外面画棋子
			if(x>=0&&y>=0&&x<=16&&y<=16) {
				if(v.contains(x+"-"+y)){}
                //如果vector中有了这个点了就不能在这个地方画棋子了
				else {
					//先把棋子添加到v中,在判断一下添加到黑白棋的vector中
					v.add(x+"-"+y);
					//System.out.println("v"+v);
					//存完之后 要重画一边 才能显示
					this.repaint();
					if(v.size()%2==0) {
						//因为首先画的是白子,vecyor从0开始存的,所以当v中有奇数个棋子的时候,再画就应该画白子了
						black.add(x+"-"+y);
						this.vectory(x,y,black);
						//System.out.println("black"+black );
					}else {
						white.add(x+"-"+y);
						this.vectory(x,y,white);
						//System.out.println("white:"+white );
					}
				}
			}
		}
		
		if (e.getButton() == e.BUTTON3) {	//右击悔棋的方法
			//System.out.println("鼠标右击--悔棋");
			if (v.isEmpty()) {
				JOptionPane.showMessageDialog(this, "没有棋可悔");
			} else {
				if (v.size() % 2 == 0) {	//判断是白棋悔棋,还是黑棋悔棋
					blackCount++;
					if (blackCount > 3) {
						JOptionPane.showMessageDialog(this, "黑棋已经悔了3步");
					} else {
						v.remove(v.lastElement());
                //一定要加上下面这句话,不然的话悔棋之后那个坐标还是存在black的集合中
                black.remove(v.lastElement());
						this.repaint();
					}
				} else {
					whiteCount++;
					if (whiteCount > 3) {
						JOptionPane.showMessageDialog(this, "白棋已经悔了3步");
					} else {
						v.remove(v.lastElement());
                white.remove(v.lastElement());
						this.repaint();
					}
				}
			}
		}
	}
	public void vectory(int x, int y, Vector ve) {
		int cv=0;//垂直方向
		int ch=0;//水平方向
		int ci1=0;
		int ci2=0;
		//判断是否能连成五个字的线,垂直方向向右
		for(int i=1;i<5;i++) {
			if(ve.contains((x+i)+"-"+y)) {
				cv++;
			}else {
				break;
			}
		}
		//垂直方向向左
		for(int i=1;i<5;i++) {
			if(ve.contains((x-i)+"-"+y)) {
				cv++;
			}else {
				break;
			}
		}
		//水平方向
		for(int i=1;i<5;i++) {
			if(ve.contains(x+"-"+(y+i))) {
				ch++;
			}else {
				break;
			}
		}
		for(int i=1;i<5;i++) {
			if(ve.contains(x+"-"+(y-i))) {
				ch++;
			}else {
				break;
			}
		}
		
		//45du方向
				for(int i=1;i<5;i++) {
					if(ve.contains((x+i)+"-"+(y+i))) {
						ci1++;
					}else {
						break;
					}
				}
				for(int i=1;i<5;i++) {
					if(ve.contains((x-i)+"-"+(y-i))) {
						ci1++;
					}else {
						break;
					}
				}
				
				//145du方向向右
				for(int i=1;i<5;i++) {
					if(ve.contains((x+i)+"-"+(y-i))) {
						ci2++;
					}else {
						break;
					}
				}
				for(int i=1;i<5;i++) {
					if(ve.contains((x-i)+"-"+(y+i))) {
						ci2++;
					}else {
						break;
					}
				}
		//判断一下,只需要判断与4的关系就好了,因为上面的判断都是从1开始判断到5,只是判断了4次
		if(ch>=4||cv>=4||ci1>=4||ci2>=4) {
			if(v.size()%2==0) {
				//通过vector中的棋子数目来判断是谁赢了,白棋如果赢了,那么vector中是奇数个
				JOptionPane.showMessageDialog(null,"黑棋赢了");
			}else {
				JOptionPane.showMessageDialog(null, "白棋赢了");
			}
			this.v.clear();
			this.black.clear();
			this.white.clear();
			this.repaint();
		}
	}

	public void mouseEntered(MouseEvent e) {
	}
	public void mouseExited(MouseEvent e) {
	}
	public void mousePressed(MouseEvent e) {
	}
	public void mouseReleased(MouseEvent e) {
	}
}

3、 总结:
学会了vector集合的使用方法,鼠标点击事件的处理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值