1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 char copyright[] = 20 "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 21 All rights reserved.\n"; 22 #endif /* not lint */ 23 24 #ifndef lint 25 static char sccsid[] = "@(#)monop.c 5.6 (Berkeley) 06/18/88"; 26 #endif /* not lint */ 27 28 # include "monop.def" 29 30 /* 31 * This program implements a monopoly game 32 */ 33 main(ac, av) 34 reg int ac; 35 reg char *av[]; { 36 37 38 srand(getpid()); 39 if (ac > 1) { 40 if (!rest_f(av[1])) 41 restore(); 42 } 43 else { 44 getplayers(); 45 init_players(); 46 init_monops(); 47 } 48 num_luck = sizeof lucky_mes / sizeof (char *); 49 init_decks(); 50 signal(2, quit); 51 for (;;) { 52 printf("\n%s (%d) (cash $%d) on %s\n", cur_p->name, player + 1, 53 cur_p->money, board[cur_p->loc].name); 54 printturn(); 55 force_morg(); 56 execute(getinp("-- Command: ", comlist)); 57 } 58 } 59 /* 60 * This routine gets the names of the players 61 */ 62 getplayers() { 63 64 reg char *sp; 65 reg int i, j; 66 char buf[257]; 67 68 blew_it: 69 for (;;) { 70 if ((num_play=get_int("How many players? ")) <= 0 || 71 num_play > MAX_PL) 72 printf("Sorry. Number must range from 1 to 9\n"); 73 else 74 break; 75 } 76 cur_p = play = (PLAY *) calloc(num_play, sizeof (PLAY)); 77 for (i = 0; i < num_play; i++) { 78 over: 79 printf("Player %d's name: ", i + 1); 80 for (sp = buf; (*sp=getchar()) != '\n'; sp++) 81 continue; 82 if (sp == buf) 83 goto over; 84 *sp++ = '\0'; 85 strcpy(name_list[i]=play[i].name=(char *)calloc(1,sp-buf),buf); 86 play[i].money = 1500; 87 } 88 name_list[i++] = "done"; 89 name_list[i] = 0; 90 for (i = 0; i < num_play; i++) 91 for (j = i + 1; j < num_play; j++) 92 if (strcasecmp(name_list[i], name_list[j]) == 0) { 93 if (i != num_play - 1) 94 printf("Hey!!! Some of those are IDENTICAL!! Let's try that again....\n"); 95 else 96 printf("\"done\" is a reserved word. Please try again\n"); 97 for (i = 0; i < num_play; i++) 98 cfree(play[i].name); 99 cfree(play); 100 goto blew_it; 101 } 102 } 103 /* 104 * This routine figures out who goes first 105 */ 106 init_players() { 107 108 reg int i, rl, cur_max; 109 bool over; 110 int max_pl; 111 112 again: 113 putchar('\n'); 114 for (cur_max = i = 0; i < num_play; i++) { 115 printf("%s (%d) rolls %d\n", play[i].name, i+1, rl=roll(2, 6)); 116 if (rl > cur_max) { 117 over = FALSE; 118 cur_max = rl; 119 max_pl = i; 120 } 121 else if (rl == cur_max) 122 over++; 123 } 124 if (over) { 125 printf("%d people rolled the same thing, so we'll try again\n", 126 over + 1); 127 goto again; 128 } 129 player = max_pl; 130 cur_p = &play[max_pl]; 131 printf("%s (%d) goes first\n", cur_p->name, max_pl + 1); 132 } 133 /* 134 * This routine initalizes the monopoly structures. 135 */ 136 init_monops() { 137 138 reg MON *mp; 139 reg int i; 140 141 for (mp = mon; mp < &mon[N_MON]; mp++) { 142 mp->name = mp->not_m; 143 for (i = 0; i < mp->num_in; i++) 144 mp->sq[i] = &board[mp->sqnums[i]]; 145 } 146 } 147