I have a 5*5 board, When I click the first time, make a blue ball, click the second, make a yellow ball , how to check when there are 3 blue or yellow ball in a row (vertically, horizontally, or diagonally)?
Develop games in your browser. Powerful, performant & highly capable.
To do this you'll want loops, an an array will make it easy too. Add an array to your project with a Width of 5, a Height of 5, and a Depth of 1. The array can be seen as a 'spreadsheet' where you store the result of each turn. When a player places a piece, fill the appropriate cell in the array with the appropriate value. For example:
The YELLOW player's turn, they have placed a piece at X: ..... .YYX. ..B.. ..B.. ..... Array > Set at x,y > X: 3, Y: 1, Value: "yellow" [/code:2s1fo3nl] Running this at the end of each turn will make it much easier to check for a win-state - which is what we check for next. There are a lot of ways to do this, but here's what I can think of: [code:2s1fo3nl] Array > For each element (xy) System > Compare two values > First Value: Array.At( Array.CurX - 1 , Array.CurY )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY ) = "yellowyellowyellow" | Array.At( Array.CurX , Array.CurY + 1 )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX , Array.CurY - 1 ) = "yellowyellowyellow" | Array.At( Array.CurX - 1 , Array.CurY )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY ) = "blueblueblue" | Array.At( Array.CurX , Array.CurY + 1 )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX , Array.CurY - 1 ) = "blueblueblue" Second Value: 1 [/code:2s1fo3nl] This seems pretty long-winded but it's actually a single event, which is nice. The 'For each element (xy)' action means the event will be run for every cell in the Array's x,y dimension. The first of the two values to compare is a long 'or' expression - each vertical line '|' character can be read as 'or'. The conditions in the expression create strings that represent the orthogonal lines through the current cell, and compare them to strings that define a win-state, eg: "blueblueblue" or "yellowyellowyellow". Because they are part of an 'or' expression, if any of the conditions in this expression are met, the output of the expression will be "1" - so the second value with which to compare the first should just be "1". Place whatever actions go in your win condition into this action - good luck! What a fun little problem.
To do this you'll want loops, an an array will make it easy too. Add an array to your project with a Width of 5, a Height of 5, and a Depth of 1. The array can be seen as a 'spreadsheet' where you store the result of each turn. When a player places a piece, fill the appropriate cell in the array with the appropriate value. For example: > The YELLOW player's turn, they have placed a piece at X: ..... .YYX. ..B.. ..B.. ..... Array > Set at x,y > X: 3, Y: 1, Value: "yellow" [/code:3o94uufb] Running this at the end of each turn will make it much easier to check for a win-state - which is what we check for next. There are a lot of ways to do this, but here's what I can think of: [code:3o94uufb] Array > For each element (xy) System > Compare two values > First Value: Array.At( Array.CurX - 1 , Array.CurY )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY ) = "yellowyellowyellow" | Array.At( Array.CurX , Array.CurY + 1 )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX , Array.CurY - 1 ) = "yellowyellowyellow" | Array.At( Array.CurX - 1 , Array.CurY )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY ) = "blueblueblue" | Array.At( Array.CurX , Array.CurY + 1 )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX , Array.CurY - 1 ) = "blueblueblue" Second Value: 1 [/code:3o94uufb] This seems pretty long-winded but it's actually a single event, which is nice. The 'For each element (xy)' action means the event will be run for every cell in the Array's x,y dimension. The first of the two values to compare is a long 'or' expression - each vertical line '|' character can be read as 'or'. The conditions in the expression create strings that represent the orthogonal lines through the current cell, and compare them to strings that define a win-state, eg: "blueblueblue" or "yellowyellowyellow". Because they are part of an 'or' expression, if any of the conditions in this expression are met, the output of the expression will be "1" - so the second value with which to compare the first should just be "1". Place whatever actions go in your win condition into this action - good luck! What a fun little problem.
> The YELLOW player's turn, they have placed a piece at X: ..... .YYX. ..B.. ..B.. ..... Array > Set at x,y > X: 3, Y: 1, Value: "yellow" [/code:3o94uufb] Running this at the end of each turn will make it much easier to check for a win-state - which is what we check for next. There are a lot of ways to do this, but here's what I can think of: [code:3o94uufb] Array > For each element (xy) System > Compare two values > First Value: Array.At( Array.CurX - 1 , Array.CurY )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY ) = "yellowyellowyellow" | Array.At( Array.CurX , Array.CurY + 1 )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX , Array.CurY - 1 ) = "yellowyellowyellow" | Array.At( Array.CurX - 1 , Array.CurY )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY ) = "blueblueblue" | Array.At( Array.CurX , Array.CurY + 1 )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX , Array.CurY - 1 ) = "blueblueblue" Second Value: 1 [/code:3o94uufb] This seems pretty long-winded but it's actually a single event, which is nice. The 'For each element (xy)' action means the event will be run for every cell in the Array's x,y dimension. The first of the two values to compare is a long 'or' expression - each vertical line '|' character can be read as 'or'. The conditions in the expression create strings that represent the orthogonal lines through the current cell, and compare them to strings that define a win-state, eg: "blueblueblue" or "yellowyellowyellow". Because they are part of an 'or' expression, if any of the conditions in this expression are met, the output of the expression will be "1" - so the second value with which to compare the first should just be "1". Place whatever actions go in your win condition into this action - good luck! What a fun little problem.
Thanks,
I did it but it only checked horizontally and vertically, but how to check in diagonally?
Congratulations! To check diagonally you'll need to add to that 'OR' condition (I didn't realise diagonals counted in gomoku!). You see how it currently checks at X/Y +/-1, like so:
Array.At( Array.CurX - 1 , Array.CurY )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY ) = "yellowyellowyellow"[/code:162de7n3] Note these lines check orthogonally. For example, X-1, X, X+1 describes a horizontal line. You'll have to add new checks to the OR expression which describe diagonal lines. Here's a starter, a diagonal line running top-left to bottom-right: [code:162de7n3]Array.At( Array.CurX - 1 , Array.CurY - 1 )&Array.At( Array.CurX , Array.CurY )&Array.At( Array.CurX + 1 , Array.CurY + 1 ) = "yellowyellowyellow"[/code:162de7n3]