Question

In program #4, you will further test your abilities to use pointers and pointer arithmetic, in this case to traverse and manipulate a string (array of chars). As with program #3, you are only allowed to access the array (string) using pointers and move the pointers via pointer arithmetic. Specifically, you will implement a version of the game Chutes and Ladders. In the game, players take turns rolling a 6-sided die, moving their piece on the game board and possibly moving again if they land on a chute (they slide "down" to the end of the chute, moving backward) or a ladder (they climb up the ladder moving forward)./nThis version of the game has some changes. 1. There will only be two players 2. After a player lands on a chute or ladder, the chute/ladder is removed so that it will not be used again 3. Some squares are denoted "havens" and some squares are denoted as "Back" (B) or "Forward" (F) in which case the player moves back or forward to the next available haven; upon moving forward or backward to a haven, the haven is removed; if a player lands on a haven without the B/F then nothing happens (the player does not move again and the haven is not removed); if, in moving backward there are no remaining havens then the player moves back to the beginning and if in moving forward there are no remaining havens the player does not move; 4. If a player lands on a square currently occupied by the other player than this player (the one currently moving) must move back 1 square; in moving back 1 square, if the player lands on a chute, ladder or F/B, then that additional move is ignored; on the other hand, if a player moves because of a chute/ladder/F/B and the move causes the player to land on the other player than this player is moved back 1 additional location; this requires that you test for collision only after the entire move takes place (move the player based on the die roll, test for chute/ladder/F/B and move if needed, and then test for collision) 5. The collision rule is not in effect if both players are on square 0 either at the beginning of the game or if both wind up moving back to 0 because of landing on a B and there being no more havens The game board is set up as an array of characters, as shown below. Do not copy and paste from this document, instead a copy of this code is uploaded in Canvas for you to copy from. Copy it straight into your program (copying from the pdf will cause extra blank spaces to be ignored). char board [100] =" mHk tH 1 B He Flq p H hByHlho H B jr HFB ir jH FF ku gd H pjB mH x BF i H Bm oB H1HFBhoH BB "; The characters of the board have the following meaning: *: a normal square (a player who lands here does not move again unless landing on the other player) 'B': move backward to the nearest preceding haven, stop at the beginning of the board if no more havens exist *F': move forward to the next haven, stay here if no more havens exist *H': a haven which a player might move to when landing on a 'B' or 'F'; if a player moves here because of a 'B' or 'F' then remove the haven by changing the 'H' to a *** (do not change the 'H' if the player lands on square without moving from 'B'/'F') 'a' -'m': a chute, move backward (see below), change this to after the player moves 'o' - 'z': a ladder, move forward (see below), change this to *-' after the player moves 'n': not used The distance to move from a chute or ladder ('a' - 'm', 'o' - 'z') is computed as the int value that the letter is from the letter 'n' (ASCII 110). For instance, 'm' - 'n' = -1 (109-110) so the player would move back 1 square when landing on the 'm'. Landing on 'p' would move the player forward 2 squares (112 - 110). 'n' does not appear on the board because it would result in no movement. Now for the tricky part of this program. You cannot use array accessing at all to access into the board array. You must use pointers to indicate where each player is currently on the board and to/naccess the character at that position to determine what to do (e.g., climb up, slide down, move forward/backward to a haven). You will do this through two char pointers, say *p1 and *p2 which will be initialized to the location of board[0] (you can initialize a pointer using p1 = board; or pl = &board [0];). Moving a player is a matter of pointer arithmetic such as pl-pl+move where move is the amount to move. You test the char at the position of the player using *p1/*p2 as in if (*pl=='B')... However, if a move takes a player beyond the end of the board, dereferencing that pointer may lead to a runtime error (pointer is out of bounds). You will want to make sure that the pointer is always within bounds by comparing it to both the beginning of and the end of the board by using if (pl >= board && pl < board + SIZE) where SIZE is 100 (make SIZE a constant to easily modify if you change the board). Break the program into the following functions. You may have additional functions if you find them needed or useful. • main-declare and initialize the players (char pointers), the board and a FILE pointer. Seed the random number generator. Open the FILE as an output file. Loop until a player wins: in the loop, call the function move (see below) to move p1 and then to move p2; move will output the result of each player's move and return the new location of the player; call output to output the current board to disk file (see below). o o after the loop (after the game ends), determine and output who won the game; the winner is not necessarily be the player who reaches board+100 first as both players may reach the end of the board during the same turn; the winner is the player who has gone the farthest (for instance, if p1 is at 98 and p2 is at 97, p1 rolls a 4 to reach 101, that doesn't mean p1 has won, if p2 then rolls a 6 and moves to 103 then p2 has won); do not stop a player right at board+SIZE. output-output the current game board to disk file on a single line; use a loop to iterate down the string, printing each current character (e.g., spaces and letters) but output '1' and *2* for the location of the two players; for this to work, pass the board, both player pointers, and the file pointer and use a loop that has a pointer as its loop variable; to determine if the current position, say current, is where pl is, you would test if (current==pl); the output is generated character-by-character using putc (or if you prefer, fprintf for a single char); do not use fprintf(fp,"%s", board); to output the full board); this loop can continue while current <= board + SIZE or until *current== '\0'; don't forget to output a \n at the end. • move - this function receives both player pointers, the board, the player number (1 or 2) and the size of the board and provides all output (to the console window) of what happens with the player; output the player number; randomly generate a move from 1-6; move the player by that amount; if the player is still within the board determine if the player has landed on a chute/ladder/B/F and if so call the appropriate function (see below) to further move the player; see if the player lands on the other player (p1==p2) and if so, move the player back 1 square; all output from this function goes to the console window using printf. main will call move twice, once for each player, using notation like this: pl = move (p1, p2, 1, board, SIZE); //player 1's turn p2 = move (p2, pl, 2, board, SIZE); // player 2's turn SIZE is a constant, passed as a parameter which you will use to make sure after the initial move that the pointer is still within the bounds of the board; as this function returns the new location of the pointer, it is a char * function (it returns a char pointer)./n• findHaven - call this function if the player lands on a 'B' or 'F', passing it the player's location, board and SIZE; search forward for the next 'H' or backward for the previous 'H'; if when moving backward you reach the beginning of the board (pointer==board), stop searching and move the player here; if you reach board+SIZE when moving forward, stop searching and do not move the player; if the player has been moved to an 'H' change it on the board to ***; this is another char * function as it returns the new location of the player; this function does not output anything as all printf output is handled in move. • chuteLadder - call this function if the player lands on a chute or ladder; this function receives the player's current location and computes and returns the player's new location, which is determined by player+ (int) (*player-'n'); but you will need both the player pointer and a temp pointer to remember the current location so that after moving player you can reset the letter as stored in the temp pointer) to '-'; this function does not output anything (again, all output is handled in move). Although this program requires multiple functions, write it in one file (you may have a separate header file if desired). Run your program and look over both your console and disk output to make sure it looks correct. When ready, run the program as many times as needed until you have a run which includes each of these: players landing on chutes/ladders/Bs/Fs, a move to a B or F that causes the player to move back to the beginning of the board or not move, and a collision. From this run, copy the console output and paste it at the bottom of your .c file and copy the text file output and paste it at the bottom of your .c file. Submit the one file (or two files if you have a separate .h file). Below and on the next page is an example of output from one of my runs (both console and then file). Looking at the outputs, here are some things you might notice. Player 1 immediately lands on a chute ('k') and moves back to 1 and the 'k' is change to '-'. In the next turn, player 1 moves 4 and lands on player 2 so moves back to square 4. The 'F' that player 2 lands on causes player 2 to move up to 22 and that 'H' is changed to ***. Toward the end, having removed both havens early on the board, player 1 lands on a 'B' and there are no remaining havens so player 1 moves to the beginning of the board. The game ends when player 2 moves from 98 to 101. Player 1 rolled 4 and is moved to 4 and landed on a chute and slid down to 1 Player 2 rolled 5 and is moved to 5 Player 1 rolled 4 and is moved to 5 and landed on the other player and moved back to 4 Player 2 rolled 5 and is moved to 10 Player 1 rolled 2 and is moved to 6 and landed on a ladder and climbed up to 12 Player 2 rolled 6 and is moved to 16 and landed on a 'F', and moved to 22 chute and slid down to 5 Player 1 rolled 2 and is moved to 14 and landed on a Player 2 rolled 2 and is moved to 24 Player 1 rolled 2 and is moved to 7 ladder and climbed up to 38 Player 2 rolled 3 and is moved to 27 and landed on a Player 1 rolled 4 and is moved to 11 and landed on a 'B', moved backward to 7 moved to 40 Player 2 rolled 2 and is Player 1 rolled 3 and is moved to 10 Player 2 rolled 2 and is moved to 42 and landed on a 'F', and moved to 50 Player 1 rolled 2 and is moved to 12 Player 2 rolled 1 Player 1 rolled 1 Player 2 rolled 1 and is moved to 52 and landed on a Player 1 rolled 6 and is moved to 19 and is and is moved to 51 moved to 13 'F', and moved to 62 Player 2 rolled 2 and is moved to 64 and landed on a ladder and climbed up to 66 Player 1 rolled 1 and is moved to 20 and landed on a ladder and climbed up to 22/nPlayer 2 rolled 3 and is moved to 69 Player 1 rolled 3 and is moved to 25 and landed on a chute and slid down to 19 Player 2 rolled 3 and is moved to 72 Player 1 rolled 1 Player 2 rolled 3 Player 1 rolled 6 Player 2 rolled 6 Player 1 rolled 2 Player 2 rolled 4 Player 1 rolled 5 Player 2 rolled 6 Player 1 rolled 1 and is and is and is moved to 26 and landed on a 'B', moved backward to 13 and is moved to 85 and landed on a 'B', moved backward to 69 and is moved to 15 and is moved to 73 and is moved to 20 and is moved to 79 and is moved to 21 Player 2 rolled 1 and is moved to 80 Player 1 rolled 5 and is moved to 26 and landed on a 'B', moved backward to 3 moved to 20 moved to 75 and landed on a 'F', and moved to 79 Player 2 rolled 6 and is moved to 86 Player 1 rolled 3 and is moved to 6 Player 2 rolled 3 and is moved to 89 Player 1 rolled 2 and is moved to 8 Player 2 rolled 4 and is moved to 93 and landed on a ladder and climbed up to 94 Player 1 rolled 3 and is moved to 11 and landed on a 'B', moved backward to the beginning of the board Player 2 rolled 4 and is moved to 98 Player 1 rolled 6 and is moved to 6 Player 2 rolled 3 and is moved to 101 Player 2 wins! 1m8-2tH 1 B Be Flq pH m1 t 128 Be Flq pH - - 1 818 Flq p 2 8-1-818 - Flq p H--118 - Flq p H--1 1 B H- Flq p m-118 H- Flq p m-1818- Flq p H-1B1- Flq p H-18H- Flqlp H-18H- Plq H-1 BH- Fiql- B-1 BB- Flq 1 H-1B 1- Fiq m-18-1Flq 1 H-1B Flq 1 mH-1B - Flq-1* ml-1 B - Fiq m 1 1 B - Flq - m*--*11 B-Flq - 1B Flq m*- 1 1 8 - Flq - hByHlho H B hByHlho H B hByHlho H B 2hByHlho BB hB-Hlho HB hB-Hlho H B hB-Hlho H B hB-Hlho H B hB-Hiho H B hB-Hlho HB hB-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B -B-Hlho H B jr HFB ir j H FF ku gd jr HFB ir 5 H FF ku gd jr HFB ir j H FF ku gd jr HFB ir 5 H FF ku gd 2r HFB ir H FF ku gd 5x2HFB ir HFF ku gd jr HFB ir 5 2 FF ku gd jr HFB ir j *2FF ku gd jHFB ir 3 jr HFB ir 5 jr HFB ir 5 jr HFB ir j 3 HFB ir jHFB ir 5 r HFB ir je HFB ir 5 jr HFB ir 5 jr HFB irj jr HFB ir j jr HFB ir j je HFB i j je HPB iz 5. PF ku gd FF ku gd FF ku gd FF ku gd FF ku gd FF ku gd • FF ku gd PP ku gd FF ku gd FF ku gd • FF ku gd FF ku gd ku gd FF ku gd BF 8 pjß mH x H B 8 pjBH x BF HB 8 pjBH x BF H B 8 pjBH x BF H B pjBH x BFH Bm 8 pj8 mH x BF H B 8 pj8 mH x BF H B 8pja x BF H B 2 pj8 mH x BF i H B * -j2 mH x -j8 m2 x -58 H x2 -j8 mH x -18 m2 x -58 x -18 m x -jB a* x oB HIHFBhoH BB oB HIHFBhoH BB oB HIHFBhoH BB oB HIHFBhoH BB oB HIHFBhoH BB oB HIHFBhoH BB oB HIHFBhoH BB oB H1HFBhoH BB oB HIHFBhoH BB BF H B oB H1HFBhoH BB BFH Bm oB HIHFBhoH BB BF i H Bm oB HIHFBhoH BB BF i 2 Bm oB H1HFBhoH BB BFB oB HIHFBhoH BB 28F i Bm oB H1HFBhoH BB BF 2 Bm oB HIHFBhoH BB BF2Bm oB H1HFBhoH BB Bm oB2H1HFBhoH BB Bm oB H12FBhoH BB BF -58 x BF i -58 x BF i -58 mx BF i -58 * x BF Bm OB HIHFB-2 BB B oB H1HFBB-8 BB2 Bm oB HIHFBh-H BB

Fig: 1

Fig: 2

Fig: 3

Fig: 4

Fig: 5