Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
int units = 10; int anzhost = 7; int max_days = 500; int runs = 100; int show = 0; int pause = 0; char commit = 'n'; void usage(char *prog) { fprintf( stderr, "\n%s usage:\t%s\t" "-u (DEFAULT: 7)\n" "\t\t\t\t\t-h (DEFAULT: 10)\n" "\t\t\t\t\t-d (DEFAULT: 500)\n" "\t\t\t\t\t-r (DEFAULT: 100)\n" "\t\t\t\t\t-c (DEFAULT: n) [possible types: a(ll), s(uccess) only, m(issed) only, n(one)]\n" "\t\t\t\t\t-s (DEFAULT: 0)\n\n\t-->" "If you call -s without a time parameter it uses the default pause,\n\tbut enables the show mode. (!!THIS MUST BE THE LAST ARGUMENT!!)\n\t is on MS Windows in milliseconds and on Linux in seconds (afaik)\n" "\n\nIf you call %s without arguments, the default values will be taken.\n", prog, prog, prog); printf("\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tby 0di 2oo4\n\n"); } int options(int argc, char *argv[]) { if (argc == 1) { printf("\n\nUSE\n\t\t%s -H OR\n\t\t%s /?\nfor HELP\n\n", argv[0], argv[0]); sleep(1500); } if (argc > 13) { fprintf(stderr, "!!! too many arguments !!!\n"); exit(0); } int i; for (i = 1; i < argc; i++) { switch (argv[i][1]) { case 'H': case '?': { usage(argv[0]); exit(0); } break; case 'u': { if (argv[i + 1]) { units = atoi(argv[i + 1]); i++; break; } break; } case 'h': { if (argv[i + 1]) { anzhost = atoi(argv[i + 1]); i++; break; } break; } case 'd': { if (argv[i + 1]) { max_days = atoi(argv[i + 1]); i++; break; } break; } case 'r': { if (argv[i + 1]) { runs = atoi(argv[i + 1]); i++; break; } break; } case 's': { show = 1; if (argv[i + 1]) { pause = atoi(argv[i + 1]); printf("SHOW MODE ON\nPAUSE: %i\n", pause); i++; break; } break; } case 'c': { if (argv[i + 1]) { commit = argv[i + 1][0]; i++; break; } break; } default: fprintf(stderr, "unknown option %s\n", argv[i]); usage(argv[0]); exit(0); break; } } printf("RUNS: %i\n", runs); printf("UNITS: %i\n", units); printf("HOSTAGES: %i\n", anzhost); printf("MAX_DAYS: %i\n", max_days); printf("COMMIT: %c\n", commit); if (show == 1) { printf("SHOW MODE: ON\n"); printf("PAUSE: %i", pause); } else { printf("SHOW MODE: OFF"); } sleep(1500); return 0; } int main(int argc, char *argv[]) { options(argc, argv); int host_know[anzhost][units]; //Remember the knowledge of each hostage int dayc; //Count the total days int unitc; //Count the Units (weeks), initalise with 0, so the game begins in the 0th week (unit) int hostunit; //Hostage Unit int light; //The light is off at the beginning int release; //If the hostages could be released this si set to 1 int x, y, z; int hod; //Number of the "Hostage of the day" int miss = 0; //Counts all missed runs int suc = 0; //Counts sucessful runs float sucper, missper; //stores the percent of suc and miss (relative to runs) int days[runs]; //Counts how many days it took for a sucessful run //Initialize Day-Array with 0 for (x = 0; x < runs; x++) { days[x] = 0; } //Hostages are named like that: 0-6, therefore the weeks (UNITS) are also 0-6 or higher, depeneding on the constance values. //Choose the HOD (hostage of the day :-) ) --> Number between 0 and 6; //Turn on the light if it's the unit of the hostage. //Add Knowledge to the hostage (Check the week and check if the light is on). Check if the hostage has enought knowlegde to win the game //WARNING: DON'T DELETE ANY KNOWLEDGE!!! //Make rand() more random srand(time(NULL)); //Increase runs to get the user wished result... (1 of n instead of 0 of n) and to get the correct iteration number runs++; for (y = 1; y < runs; y++) { x = 0; z = 0; release = 0; light = 0; hostunit = 0; unitc = 0; dayc = 0; //Initalise Knowledege (nobody knows anything ;-) ) while (x < anzhost) { while (z < units) { host_know[x][z] = 0; z++; } x++; z = 0; } while (dayc < max_days) { if (release == 1) { break; } //If a new Unit begins, reset the light and increase the unit counters if (dayc % units == 0) { hostunit++; unitc++; light = 0; } dayc++; if (hostunit == anzhost) { hostunit = 0; } //It's more randomly if you pass a pseudo random number to srand (the System time in this case) //After that you can call rand() which should be more randomly... hod = rand() % anzhost; //Turn on the light if it's the HOU (Hostage of the Unit[Week]). if (hostunit == hod) { light = 1; } //If the light is turned on, the knowledge of the HUD will increase if (light == 1) { host_know[hod][hostunit] = 1; } //Check if the knowledge is as big as he can release all hostages x = 0; while (x < units) { if (host_know[hod][x] == 1) { x++; } //If the HOD has no info about one other hostage, the test will fail else break; if (x == 7) { suc++; days[y] = dayc; release = 1; } } if (show == 1) { //Print Status of each day runs--; printf( "Current Hostage:\t%i\nHostage Unit:\t\t%i\nUNITS:\t\t\t%i\nTotal Days:\t\t%i\nLIGHT:\t\t\t%i\t\t\t\tHOD(%i): %i %i %i %i %i %i %i\nRUN: %i of %i\n\n", hod, hostunit, unitc, dayc, light, hod, host_know[hod][0], host_know[hod][1], host_know[hod][2], host_know[hod][3], host_know[hod][4], host_know[hod][5], host_know[hod][6], y, runs); runs++; //Sleep 1 second (1000 millisecond [MS WINDOWS style]), to get surely a random number (time(NULL)) sleep(pause); } //Print out SUCCESS-Message if (release == 1) { printf( "\n\nHOSTAGES WERE RELEASED!!! After %i days (%i. run)\n\n", dayc, y); if (commit == 's' || commit == 'a') { system("pause"); } } } //Count the tries where the hostages won't be released within "max_tries" times if (release != 1) { miss++; printf( "MISSED! The Hostage weren't released within %i days (%i. run)\n\n", max_days, y); if (commit == 'm' || commit == 'a') { system("pause"); } dayc = max_days; } } //If there are no successful runs, there are no days to count if (suc > 0) { //Reset the day counter to reuse it for some other purpose dayc = 0; //Count all days for every release for (x = 0; x < runs; x++) { if (days[x] > 0) { dayc = dayc + days[x]; } } //Calculate the average dayc = dayc / suc; } //Calucalte the percent of success and miss //runs = 100% runs--; //Correct the Display-Fake from above missper = miss * 100 / runs; sucper = suc * 100 / runs; //Print out the FAZIT printf("\n\n\n------------------TOTAL-------------------------------"); printf( "\n\nMISS: %i (%f %%)\n\nSUCESS: %i (%f %%)\n\n\nAverage days: %i\n\n\n", miss, missper, suc, sucper, dayc); return 0; }
This paste will be private.
From the Design Piracy series on my blog: