NaaLaa
How to create a board game - Printable Version

+- NaaLaa (https://www.naalaa.com/forum)
+-- Forum: NaaLaa (https://www.naalaa.com/forum/forum-1.html)
+--- Forum: NaaLaa 7 Questions (https://www.naalaa.com/forum/forum-3.html)
+--- Thread: How to create a board game (/thread-74.html)

Pages: 1 2


RE: How to create a board game - aliensoldier - 02-24-2024

(02-23-2024, 09:06 PM)Marcus Wrote:
(02-23-2024, 04:34 PM)aliensoldier Wrote: I'm going to share the code I've made because I'm at an impasse and I don't know how to continue.

I have three problems:

1-there is a cursor that moves around the board and if you stand on top of a player's piece and press "z" it picks it up and you can drop it on another square with the "x" key, but the problem is that it drops it anywhere box and I want it to only be able to be dropped in the dark boxes and I don't know how to do it.

2-when I grab a player token you can grab other player tokens at the same time and I only want it to grab one token at a time but I haven't been able to do it.

3-When I have a player token I should only be able to move one square per turn but it can be moved to any square, as could be done.

I made two posts but deleted them now, after looking up the rules of Checkers.

Hopefully this code can help you:

Code:
constant GRID = 8 ' number of rows and columns.
constant SQUARE = 53 ' size of each square.

set window "test", 640, 480
set redraw off

' create 8x8 array filled with zeroes.
board = fill(0, GRID, GRID)
' place pieces.
for y = 0 to 2  for x = 0 to GRID - 1
    if (y + x)%2 = 1  board[x][y] = 1
    if (GRID - 1 - y + x)%2 = 1  board[x][GRID - 1 - y] = 2
next
' center board in window.
boardX = (width(primary) - GRID*SQUARE)/2
boardY = (height(primary) - GRID*SQUARE)/2

' set to 1 or 2 when a piece has been picked up.
holdingPiece = 0
' original position of picked up piece.
originalPieceX = 0
originalPieceY = 0

' loop until user presses escape.
while not keydown(KEY_ESCAPE, true)
    ' check if mouse is inside board.
    mx = mousex()
    my = mousey()
    gridX = mx - boardX
    gridY = my - boardY
    if gridX >= 0 and gridX < GRID*SQUARE and gridY >= 0 and gridY < GRID*SQUARE
        ' convert to grid coordinates.
        gridX = int(gridX/SQUARE)
        gridY = int(gridY/SQUARE)
        ' click?
        if mousebutton(0, true)
            ' not holding a piece?
            if not holdingPiece
                ' any piece at that position?
                if board[gridX][gridY]
                    ' store information about the piece.
                    holdingPiece = board[gridX][gridY]
                    originalPieceX = gridX
                    originalPieceY = gridY
                    ' remove piece from board.
                    board[gridX][gridY] = 0
                endif
            ' already holding piece.
            else
                ' spot empty?
                if not board[gridX][gridY]
                    ' same position or valid distance for move? here both players can move up and
                    ' down. only "kings" should be able to do that.
                    dx = |gridX - originalPieceX|
                    dy = |gridY - originalPieceY|
                    if dx = 0 and dy = 0 or dx = 1 and dy = 1
                        ' put piece down.
                        board[gridX][gridY] = holdingPiece
                        holdingPiece = 0
                    endif
                endif
            endif
        endif
    endif

    ' draw.
    set color 0, 0, 0
    cls
       
    ' draw board.
    for y = 0 to GRID - 1
        for x = 0 to GRID - 1
            ' this formula gives a chess pattern.
            if (y + x)%2  set color 64, 64, 64
            else  set color 208, 208, 208
            draw rect boardX + x*SQUARE, boardY + y*SQUARE, SQUARE, SQUARE, true
            ' any piece?
            if board[x][y]
                DrawPiece(board[x][y], boardX + (x + 0.5)*SQUARE, boardY + (y + 0.5)*SQUARE)
            endif
        next
    next
   
    ' Draw picked up piece.
    if holdingPiece  DrawPiece(holdingPiece, mx, my)
   
    redraw
    fwait 60
wend

function DrawPiece(player, x, y)
    if player = 1  set color 240, 240, 240
    else  set color 32, 32, 32
    draw ellipse x, y, SQUARE/2 - 4, SQUARE/2 - 4, true
    set color 0, 0, 0
    draw ellipse x, y, SQUARE/2 - 4, SQUARE/2 - 4, false
endfunc

As it is now, both players can always move backwards or forwards diagonally. But according to the rules, only "kings" can move backwards. board[x][y] is now either: 0 = empty, 1 = player 1 piece or 2 = player 2 piece. I guess you can simply add two more values: 3 = player 1 king piece and 4 = player 2 king piece, and make it so that only kings can move backwards.

Edit  And I'm sorry for not basing my code on yours. I'm just showing you how I would do it myself, and hopefully it can help you modify your own code Smile

Thanks Marcus, I'll try to adapt it to my code. Smile