----------------------------------- SuperGenius Tue Mar 09, 2004 8:24 pm my connect 4 ----------------------------------- This is my connect 4 project, which is finished, except that I wanted to allow the players to press y to begin another game without haveing to press run again for 3 reasons: 1. so they dont have to press run again 2. so they dont have to enter their names again 3. so that the program can keep a tally of how many games each player has won. the problem is that for some reason at the beginning of the second game the program is drawing a circle when it shouldn't be. % CONNECT 4 by Chris % stupid mistake pointed out by Paul Bian... thanks x2 setscreen ("graphics:800;600,nobuttonbar") var col, stop, tally : int var act, colchoice : string (1) := "" var actcolour, actname, checkcolour, winner : string := "" var board : array 1 .. 8, 1 .. 8 of string var height : array 1 .. 8 of int var names : array 1 .. 2 of string var wins : array 1 .. 2 of int := init (0, 0) var winlocc, winloch : array 1 .. 4 of int proc colget loop locate (33, 1) put actname, "(", actcolour, ")", " Enter col choice" .. getch (colchoice) locate (34, 1) put "" if colchoice = "1" or colchoice = "2" or colchoice = "3" or colchoice = "4" or colchoice = "5" or colchoice = "6" or colchoice = "7" or colchoice = "8" then exit else locate (34, 1) put "numbers 1-8 only" end if end loop col := strint (colchoice) end colget proc drawboard for h : 1 .. 8 for c : 1 .. 8 if board (h, c) not= " " then if board (h, c) = "RED" then Draw.FillOval (130 + c * 60, 80 + h * 60, 25, 25, red) elsif board (h, c) = "GREEN" then Draw.FillOval (130 + c * 60, 80 + h * 60, 25, 25, green) end if end if end for end for end drawboard proc switch if actcolour = "RED" then actcolour := "GREEN" actname := names (2) else actcolour := "RED" actname := names (1) end if end switch proc wincheck loop for a : 1 .. 8 for b : 1 .. 5 if board (a, b) = checkcolour and board (a, b + 1) = checkcolour and board (a, b + 2) = checkcolour and board (a, b + 3) = checkcolour then winner := checkcolour for c : 1 .. 4 winlocc (c) := a end for winloch (1) := b winloch (2) := b + 1 winloch (3) := b + 2 winloch (4) := b + 3 exit end if end for end for for a : 1 .. 5 for b : 1 .. 8 if board (a, b) = checkcolour and board (a + 1, b) = checkcolour and board (a + 2, b) = checkcolour and board (a + 3, b) = checkcolour then winner := checkcolour for c : 1 .. 4 winloch (c) := b end for winlocc (1) := a winlocc (2) := a + 1 winlocc (3) := a + 2 winlocc (4) := a + 3 exit end if end for end for for a : 1 .. 5 for b : 1 .. 5 if board (a, b) = checkcolour and board (a + 1, b + 1) = checkcolour and board (a + 2, b + 2) = checkcolour and board (a + 3, b + 3) = checkcolour then winner := checkcolour winlocc (1) := a winlocc (2) := a + 1 winlocc (3) := a + 2 winlocc (4) := a + 3 winloch (1) := b winloch (2) := b + 1 winloch (3) := b + 2 winloch (4) := b + 3 exit end if end for end for for a : 1 .. 5 for decreasing b : 8 .. 4 if board (a, b) = checkcolour and board (a + 1, b - 1) = checkcolour and board (a + 2, b - 2) = checkcolour and board (a + 3, b - 3) = checkcolour then winner := checkcolour winloch (1) := b winloch (2) := b - 1 winloch (3) := b - 2 winloch (4) := b - 3 winlocc (1) := a winlocc (2) := a + 1 winlocc (3) := a + 2 winlocc (4) := a + 3 exit end if end for end for exit end loop end wincheck process flash loop Draw.FillOval (130 + winloch (1) * 60, 80 + winlocc (1) * 60, 25, 25, 9) Draw.FillOval (130 + winloch (2) * 60, 80 + winlocc (2) * 60, 25, 25, 9) Draw.FillOval (130 + winloch (3) * 60, 80 + winlocc (3) * 60, 25, 25, 9) Draw.FillOval (130 + winloch (4) * 60, 80 + winlocc (4) * 60, 25, 25, 9) delay (100) Draw.FillOval (130 + winloch (1) * 60, 80 + winlocc (1) * 60, 25, 25, 42) Draw.FillOval (130 + winloch (2) * 60, 80 + winlocc (2) * 60, 25, 25, 42) Draw.FillOval (130 + winloch (3) * 60, 80 + winlocc (3) * 60, 25, 25, 42) Draw.FillOval (130 + winloch (4) * 60, 80 + winlocc (4) * 60, 25, 25, 42) delay (100) exit when act = "y" or act = "n" end loop end flash % process xMusic % Music.PlayFile ("lc.mp3") % end xMusic loop % Music.PlayFileStop %%%startup%%% col := 0 stop := 0 tally := 0 winner := "" for a : 1 .. 8 height (a) := 0 for b : 1 .. 8 board (a, b) := " " end for end for for a : 1 .. 4 winlocc (a) := 0 winloch (a) := 0 end for %%%get names%%% if act not= "y" then for a : 1 .. 2 put "ENTER NAME ", a get names (a) end for end if cls %%%end names act := "" actcolour := "RED" actname := names (1) %%%Draws the grid of the board%%% Draw.Line (160, 590, 160, 110, black) Draw.Line (640, 590, 640, 110, black) Draw.Line (160, 590, 640, 590, black) Draw.Line (160, 110, 640, 110, black) for a : 1 .. 7 Draw.Line (a * 60 + 160, 110, a * 60 + 160, 590, black) Draw.Line (160, a * 60 + 110, 640, a * 60 + 110, black) end for locate (32, 1) put " " : 23, "1" : 8, "2" : 7, "3" : 8, "4" : 7, "5" : 8, "6" : 7, "7" : 8, "8" %%%end grid%%% %%%end startup%%% loop loop colget if height (col) = 8 then locate (34, 1) put "That col is full." else height (col) := height (col) + 1 exit end if end loop board (height (col), col) := actcolour drawboard checkcolour := "RED" wincheck checkcolour := "GREEN" wincheck if winner = "RED" then locate (34, 1) put names (1), " WINS!" wins (1) := wins (1) + 1 exit elsif winner = "GREEN" then locate (34, 1) put names (2), " WINS!" wins (2) := wins (2) + 1 exit end if switch end loop locate (35, 1) for a : 1 .. 2 put names (a), "'s wins: ", wins (a) end for if act not= "y" and winlocc (1) not= 0 then fork flash % fork xMusic end if locate (33, 1) put "WOULD YOU LIKE TO PLAY AGAIN?(y/n)" .. loop getch (act) if act = "n" or act = "y" then exit else locate (33, 1) put "enter y or n, lower case " .. end if end loop exit when act = "n" delay (500) end loop ----------------------------------- jonos Tue Mar 09, 2004 8:26 pm ----------------------------------- could you please inlcude the whole code, even the variables or else it will not work. you have 21 errors or seomting because of that. ----------------------------------- SuperGenius Tue Mar 09, 2004 8:29 pm ----------------------------------- oops... I thought I had copied everything but i guess not... ill just edit the first post instead of taking up more space. ----------------------------------- Paul Tue Mar 09, 2004 8:30 pm ----------------------------------- Yes, do that, AND all those if statements are unneeded, like below: if board (a, b) = checkcolour then if board (a, b + 1) = checkcolour then if board (a, b + 2) = checkcolour then if board (a, b + 3) = checkcolour then winner := checkcolour exit end if end if end if end if can be if board (a,b) =checkcolour and board (a, b+1) = checkcolour and board (a, b + 2) = checkcolour and board (a, b + 3) = checkcolour then winner := checkcolour exit end if correct me if Im wrong. ----------------------------------- SuperGenius Tue Mar 09, 2004 8:37 pm ----------------------------------- i think you're correct so i made the fix you suggested, and the program still runs the same incorrect way it did before. ----------------------------------- Paul Tue Mar 09, 2004 8:51 pm ----------------------------------- Well, you I think you should be using recursion to do this (though I have no idea how to use recursion), but I think I figured out the problem, I think the program isn't even putting the "RED" or "GREEN" into the arrays, I added cls put board(8,1) delay (5000) right after the wincheck in you main loop, and nothing shows up, when you have a red piece in (8,1) ----------------------------------- SuperGenius Tue Mar 09, 2004 8:58 pm ----------------------------------- cls put board(8,1) delay (5000) this just screws it up, becuase the array holds blank spaces at the start, and as you play the array is changed to either "RED" of "GREEN", and there is a procedure that will update the board like so... proc drawboard for h : 1 .. 8 for c : 1 .. 8 if board (h, c) not= " " then if board (h, c) = "RED" then Draw.FillOval (130 + c * 60, 80 + h * 60, 25, 25, red) elsif board (h, c) = "GREEN" then Draw.FillOval (130 + c * 60, 80 + h * 60, 25, 25, green) end if end if end for end for end drawboard trying to put out board(8,1) wont work because i used a little formula to find the right place and then draw a circle of either colour in it based on the contents of the 'board' array. ----------------------------------- Paul Tue Mar 09, 2004 9:02 pm ----------------------------------- oh I see, that would complicate things cause I thought it was like this your program checks the text inside each variable in the array? so if I played on col 1, then the variable (8,1) would change from " " to RED, wouldn't it? so then you check every variable in the 2D array, and when it gets to 8,1 it should find RED right? but it doesn't, though my way of checking might be wrong. ----------------------------------- SuperGenius Tue Mar 09, 2004 9:07 pm ----------------------------------- so if I played on col 1, then the variable (8,1) would change from " " to RED, wouldn't it? i think (1,1) would change for the first play in col 1, but im not sure... i tried your suggestion with (1,1) instead and it returns RED... so the problem is not in the contents of the array for sure... becuase it it wasnt updating the array with "RED" and "GREEN" then it wouldnt be drawing the circles either ----------------------------------- Paul Tue Mar 09, 2004 9:21 pm ----------------------------------- OMFG, it freaking works, just change the checking code a bit, OMGI I cant believe this if winner = "RED" then locate (33, 1) put "RED WINS" delay (5000) %