2
2
//!
3
3
//! https://en.wikipedia.org/wiki/Reversi
4
4
5
+ // To run this example, use the command: cargo run --features unstable --example reversi
6
+ #[ cfg( all( not( feature = "unstable" ) ) ) ]
7
+ compile_error ! ( "This example relies on unstable features. Run with `--features unstable`" ) ;
8
+
5
9
extern crate turtle;
6
10
7
11
mod board;
8
12
9
13
use std:: f64:: consts:: PI ;
10
14
11
- use turtle:: { Turtle , Event , Color } ;
12
- use turtle:: event:: { MouseButton } ;
15
+ use turtle:: { Drawing , Turtle , Point , Color , Event } ;
16
+ use turtle:: event:: { MouseButton , PressedState } ;
13
17
14
18
use board:: { Board , Piece } ;
15
19
@@ -24,11 +28,12 @@ struct Dimensions {
24
28
}
25
29
26
30
fn main ( ) {
27
- let mut turtle = Turtle :: new ( ) ;
28
- turtle. drawing_mut ( ) . set_background_color ( "#B3E5FC" ) ;
31
+ let mut drawing = Drawing :: new ( ) ;
32
+ let mut turtle = drawing. add_turtle ( ) ;
33
+ drawing. set_background_color ( "#B3E5FC" ) ;
29
34
turtle. set_pen_color ( "#757575" ) ;
30
35
turtle. set_pen_size ( 2.0 ) ;
31
- turtle. set_speed ( 8 ) ;
36
+ turtle. set_speed ( 23 ) ;
32
37
33
38
let width = 580.0 ;
34
39
let height = 580.0 ;
@@ -59,9 +64,9 @@ fn main() {
59
64
draw_valid_moves ( & mut turtle, & board, & dim) ;
60
65
61
66
// Get rid of any events that may have accumulated while drawing
62
- drain_events ( & mut turtle ) ;
67
+ drain_events ( & mut drawing ) ;
63
68
64
- play_game ( & mut turtle, board, & dim) ;
69
+ play_game ( & mut drawing , & mut turtle, board, & dim) ;
65
70
}
66
71
67
72
fn draw_board ( turtle : & mut Turtle , dim : & Dimensions ) {
@@ -99,21 +104,20 @@ fn draw_board_pieces(turtle: &mut Turtle, board: &Board, dim: &Dimensions) {
99
104
}
100
105
}
101
106
102
- fn play_game ( turtle : & mut Turtle , mut board : Board , dim : & Dimensions ) {
107
+ fn play_game ( drawing : & mut Drawing , turtle : & mut Turtle , mut board : Board , dim : & Dimensions ) {
103
108
println ! ( "Click on a tile to make a move." ) ;
104
109
println ! ( "Current Player: {}" , board. current( ) . name( ) ) ;
105
- turtle. set_speed ( 9 ) ;
106
110
107
- let mut mouse = [ 0.0 , 0.0 ] ;
111
+ let mut mouse = Point :: origin ( ) ;
108
112
loop {
109
- let event = turtle . drawing_mut ( ) . poll_event ( ) ;
113
+ let event = drawing . poll_event ( ) ;
110
114
// Sometimes it is more convenient to use `if let` instead of `match`. In this case, it's
111
115
// really up to your personal preference. We chose to demonstrate what `if let` would look
112
116
// like if used for this code.
113
- if let Some ( Event :: MouseMove { x , y } ) = event {
114
- mouse = [ x , y ] ;
117
+ if let Some ( Event :: MouseMove ( mouse_pos ) ) = event {
118
+ mouse = mouse_pos ;
115
119
}
116
- else if let Some ( Event :: MouseButtonReleased ( MouseButton :: Left ) ) = event {
120
+ else if let Some ( Event :: MouseButton ( MouseButton :: LeftButton , PressedState :: Released ) ) = event {
117
121
// Figure out which row and column was clicked
118
122
// If these formulas seem unclear, try some example values to see what you get
119
123
let row = ( ( 1.0 - ( mouse[ 1 ] + dim. height /2.0 ) / dim. height ) * dim. rows as f64 ) . floor ( ) as isize ;
@@ -124,15 +128,15 @@ fn play_game(turtle: &mut Turtle, mut board: Board, dim: &Dimensions) {
124
128
&& board. is_valid_move ( & ( row as usize , col as usize ) ) {
125
129
let row = row as usize ;
126
130
let col = col as usize ;
127
- erase_valid_moves ( turtle, & board, dim) ;
131
+ erase_valid_moves ( drawing , turtle, & board, dim) ;
128
132
129
133
let current = board. current ( ) ;
130
134
let flipped = board. play_piece ( ( row, col) ) ;
131
135
132
136
move_to_tile ( turtle, ( row, col) , & dim) ;
133
137
draw_piece ( turtle, current, & dim) ;
134
138
135
- let background = turtle . drawing ( ) . background_color ( ) ;
139
+ let background = drawing. background_color ( ) ;
136
140
draw_tile_circles ( turtle, 0.9 , background, dim, flipped. iter ( ) ) ;
137
141
draw_tile_circles ( turtle, 0.8 , current. color ( ) , dim, flipped. iter ( ) ) ;
138
142
@@ -141,7 +145,7 @@ fn play_game(turtle: &mut Turtle, mut board: Board, dim: &Dimensions) {
141
145
println ! ( "Current Player: {}" , board. current( ) . name( ) ) ;
142
146
143
147
// Get rid of any events that may have accumulated while drawing
144
- drain_events ( turtle ) ;
148
+ drain_events ( drawing ) ;
145
149
}
146
150
}
147
151
}
@@ -161,8 +165,8 @@ fn move_to_tile(turtle: &mut Turtle, (row, col): (usize, usize), dim: &Dimension
161
165
turtle. pen_down ( ) ;
162
166
}
163
167
164
- fn erase_valid_moves ( turtle : & mut Turtle , board : & Board , dim : & Dimensions ) {
165
- let background = turtle . drawing ( ) . background_color ( ) ;
168
+ fn erase_valid_moves ( drawing : & Drawing , turtle : & mut Turtle , board : & Board , dim : & Dimensions ) {
169
+ let background = drawing. background_color ( ) ;
166
170
draw_tile_circles (
167
171
turtle,
168
172
0.5 ,
@@ -214,13 +218,14 @@ fn tile_circle(turtle: &mut Turtle, relative_size: f64, fill: Color, dim: &Dimen
214
218
fn filled_circle ( turtle : & mut Turtle , radius : f64 , fill : Color ) {
215
219
turtle. set_fill_color ( fill) ;
216
220
turtle. pen_up ( ) ;
217
- turtle. begin_fill ( ) ;
218
221
219
222
turtle. forward ( radius) ;
220
223
turtle. right ( 90.0 ) ;
221
- circle ( turtle, radius) ;
222
224
225
+ turtle. begin_fill ( ) ;
226
+ circle ( turtle, radius) ;
223
227
turtle. end_fill ( ) ;
228
+
224
229
turtle. pen_down ( ) ;
225
230
}
226
231
@@ -238,6 +243,6 @@ fn circle(turtle: &mut Turtle, radius: f64) {
238
243
}
239
244
240
245
/// Clear out all events that may have accumulated
241
- fn drain_events ( turtle : & mut Turtle ) {
242
- while let Some ( _) = turtle . drawing_mut ( ) . poll_event ( ) { }
246
+ fn drain_events ( drawing : & mut Drawing ) {
247
+ while let Some ( _) = drawing . poll_event ( ) { }
243
248
}
0 commit comments