From 929ff4618ac56c4db601c53558bc91c864ede163 Mon Sep 17 00:00:00 2001 From: "R.T. Lechow" Date: Thu, 24 Feb 2022 01:30:04 -0500 Subject: [PATCH 01/10] 47_Hi-Lo Ruby --- 47_Hi-Lo/ruby/README.md | 2 +- 47_Hi-Lo/ruby/hi_lo.rb | 59 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 47_Hi-Lo/ruby/hi_lo.rb diff --git a/47_Hi-Lo/ruby/README.md b/47_Hi-Lo/ruby/README.md index fb32811e..241656ad 100644 --- a/47_Hi-Lo/ruby/README.md +++ b/47_Hi-Lo/ruby/README.md @@ -1,3 +1,3 @@ Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html) -Conversion to [Ruby](https://www.ruby-lang.org/en/) +Conversion to [Ruby](https://www.ruby-lang.org/en/) by [R.T. Lechow](https://github.com/rtlechow) diff --git a/47_Hi-Lo/ruby/hi_lo.rb b/47_Hi-Lo/ruby/hi_lo.rb new file mode 100644 index 00000000..02989a91 --- /dev/null +++ b/47_Hi-Lo/ruby/hi_lo.rb @@ -0,0 +1,59 @@ +#!/usr/bin/env ruby +MAX_TRIES = 6 +RANGE = (1..100) + +def intro + puts <<~END_OF_INTRO + #{'HI LO'.center(74)} + #{"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n".center(76)} + THIS IS THE GAME OF HI LO.\n + YOU WILL HAVE #{MAX_TRIES} TRIES TO GUESS THE AMOUNT OF MONEY IN THE + HI LO JACKPOT, WHICH IS BETWEEN #{RANGE.min} AND #{RANGE.max} DOLLARS. IF YOU + GUESS THE AMOUNT, YOU WIN ALL THE MONEY IN THE JACKPOT! + THEN YOU GET ANOTHER CHANCE TO WIN MORE MONEY. HOWEVER, + IF YOU DO NOT GUESS THE AMOUNT, THE GAME ENDS.\n\n + END_OF_INTRO +end + +def make_guess + puts 'YOUR GUESS?' + @guess = gets.to_i +end + +def check_guess + if @guess == @number + @guessed_correctly = true + @total_winnings += @number + puts <<~END_OF_WIN_TEXT + GOT IT!!!!!!!!!! YOU WIN #{@number} DOLLARS. + YOUR TOTAL WINNINGS ARE NOW #{@total_winnings} DOLLARS. + END_OF_WIN_TEXT + else + puts "YOUR GUESS IS TOO #{@guess > @number ? 'HIGH' : 'LOW'}.\n\n" + end +end + +def blew_it + @total_winnings = 0 + puts "YOU BLEW IT...TOO BAD...THE NUMBER WAS #{@number}" +end + +def outro + puts "\nSO LONG. HOPE YOU ENJOYED YOURSELF!!!" +end + +intro +@total_winnings = 0 +loop do + @guessed_correctly = false + @number = rand(RANGE) + MAX_TRIES.times do + make_guess + check_guess + break if @guessed_correctly + end + blew_it unless @guessed_correctly + puts "\nPLAY AGAIN (YES OR NO)?" + break if gets.start_with?(/n/i) +end +outro From 69944fecc1ea083f90bf656e81c15319d823a477 Mon Sep 17 00:00:00 2001 From: Gabry Date: Thu, 24 Feb 2022 19:20:23 +0100 Subject: [PATCH 02/10] Ported [79 - Slalom] to python --- 79_Slalom/python/slalom.py | 165 +++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 79_Slalom/python/slalom.py diff --git a/79_Slalom/python/slalom.py b/79_Slalom/python/slalom.py new file mode 100644 index 00000000..aab08e68 --- /dev/null +++ b/79_Slalom/python/slalom.py @@ -0,0 +1,165 @@ +from random import random + +print("SLALOM".rjust(39)) +print("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n".rjust(57)) + +medals = { + "gold": 0, + "silver": 0, + "bronze": 0, +} +max_speeds = [14,18,26,29,18,25,28,32,29,20,29,29,25,21,26,29,20,21,20,18,26,25,33,31,22] + +def ask(question): + print(question, end="? ") + return input().upper() + +def ask_int(question): + reply = ask(question) + return int(reply) if reply.isnumeric() else -1 + +def pre_run(): + print("\nTYPE \"INS\" FOR INSTRUCTIONS") + print("TYPE \"MAX\" FOR APPROXIMATE MAXIMUM SPEEDS") + print("TYPE \"RUN\" FOR THE BEGINNING OF THE RACE") + cmd = ask("COMMAND--") + while cmd != "RUN": + if cmd == "INS": + print("\n*** SLALOM: THIS IS THE 1976 WINTER OLYMPIC GIANT SLALOM. YOU ARE") + print(" THE AMERICAN TEAM'S ONLY HOPE OF A GOLD MEDAL.\n") + print(" 0 -- TYPE THIS IS YOU WANT TO SEE HOW LONG YOU'VE TAKEN.") + print(" 1 -- TYPE THIS IF YOU WANT TO SPEED UP A LOT.") + print(" 2 -- TYPE THIS IF YOU WANT TO SPEED UP A LITTLE.") + print(" 3 -- TYPE THIS IF YOU WANT TO SPEED UP A TEENSY.") + print(" 4 -- TYPE THIS IF YOU WANT TO KEEP GOING THE SAME SPEED.") + print(" 5 -- TYPE THIS IF YOU WANT TO CHECK A TEENSY.") + print(" 6 -- TYPE THIS IF YOU WANT TO CHECK A LITTLE.") + print(" 7 -- TYPE THIS IF YOU WANT TO CHECK A LOT.") + print(" 8 -- TYPE THIS IF YOU WANT TO CHEAT AND TRY TO SKIP A GATE.\n") + print(" THE PLACE TO USE THESE OPTIONS IS WHEN THE COMPUTER ASKS:\n") + print("OPTION?\n") + print(" GOOD LUCK!\n") + cmd = ask("COMMAND--") + elif cmd == "MAX": + print("GATE MAX") + print(" # M.P.H.") + print("----------") + for i in range(0, gates): + print(f" {i + 1} {max_speeds[i]}") + cmd = ask("COMMAND--") + else: + cmd = ask(f"\"{cmd}\" IS AN ILLEGAL COMMAND--RETRY") + +def run(): + global medals + print("THE STARTER COUNTS DOWN...5...4...3...2...1...GO!") + time = 0 + speed = int(random() * (18 - 9) + 9) + print("YOU'RE OFF") + for i in range(0, gates): + while True: + print(f"\nHERE COMES GATE #{i + 1}:") + print(f" {int(speed)}M.P.H.") + old_speed = speed + opt = ask_int("OPTION") + while opt < 1 or opt > 8: + if(opt == 0): + print(f"YOU'VE TAKEN {int(time)}SECONDS.") + else: + print("WHAT?") + opt = ask_int("OPTION") + + if opt == 8: + print("***CHEAT") + if random() < .7: + print("AN OFFICIAL CAUGHT YOU!") + print(f"YOU TOOK {int(time + random())}SECONDS.") + return + else: + print("YOU MADE IT!") + time += 1.5 + else: + match opt: + case 1: + speed += int(random() * (10 - 5) + 5) + + case 2: + speed += int(random() * (5 - 3) + 3) + + case 3: + speed += int(random() * (4 - 1) + 1) + + case 5: + speed -= int(random() * (4 - 1) + 1) + + case 6: + speed -= int(random() * (5 - 3) + 3) + + case 7: + speed -= int(random() * (10 - 5) + 5) + print(f" {int(speed)}M.P.H.") + if speed > max_speeds[i]: + if random() < ((speed - max_speeds[i]) * .1) + .2: + print(f"YOU WENT OVER THE MAXIMUM SPEED AND {'SNAGGED A FLAG' if random() < .5 else 'WIPED OUT'}!") + print(f"YOU TOOK {int(time + random())}SECONDS") + return + else: + print("YOU WENT OVER THE NAXIMUM SPEED AND MADE IT!") + if speed > max_speeds[i] - 1: + print("CLOSE ONE!") + if speed < 7: + print("LET'S BE REALISTIC, OK? LET'S GO BACK AND TRY AGAIN...") + speed = old_speed + else: + time += max_speeds[i] - speed + 1 + if speed > max_speeds[i]: + time += .5 + break + print(f"\nYOU TOOK {int(time + random())}SECONDS.") + avg = time / gates + if avg < 1.5 - (lvl * .1): + print("YOU WON A GOLD MEDAL!") + medals["gold"] += 1 + elif avg < 2.9 - (lvl * .1): + print("YOU WON A SILVER MEDAL!") + medals["silver"] += 1 + elif avg < 4.4 - (lvl * .01): + print("YOU WON A BRONZE MEDAL!") + medals["bronze"] += 1 + +while True: + gates = ask_int("HOW MANY GATES DOES THIS COURSE HAVE (1 TO 25)") + if gates < 1: + print("TRY AGAIN,") + else: + if(gates > 25): + print("25 IS THE LIMIT.") + break + +pre_run() + +while True: + lvl = ask_int("RATE YOURSELF AS A SKIER, (1=WORST, 3=BEST)") + if lvl < 1 or lvl > 3: + print("THE BOUNDS ARE 1-3.") + else: + break + +while True: + run() + while True: + answer = ask("DO YOU WANT TO PLAY AGAIN?") + if answer == "YES" or answer == "NO": + break + else: + print("PLEASE TYPE 'YES' OR 'NO'") + if answer == "NO": + break + +print("THANKS FOR THE RACE") +if medals["gold"] > 0: + print(f"GOLD MEDALS: {medals['gold']}") +if medals["silver"] > 0: + print(f"SILVER MEDALS: {medals['silver']}") +if medals["bronze"] > 0: + print(f"BRONZE MEDALS: {medals['bronze']}") From 74ad6e9ea7c5263b8fc739430113c6a8920370ba Mon Sep 17 00:00:00 2001 From: Gabry Date: Thu, 24 Feb 2022 19:34:26 +0100 Subject: [PATCH 03/10] Formatted the output texts to follow a more modern style --- 79_Slalom/python/slalom.py | 114 ++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/79_Slalom/python/slalom.py b/79_Slalom/python/slalom.py index aab08e68..44ce0fde 100644 --- a/79_Slalom/python/slalom.py +++ b/79_Slalom/python/slalom.py @@ -1,7 +1,7 @@ from random import random -print("SLALOM".rjust(39)) -print("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n".rjust(57)) +print("Slalom".rjust(39)) +print("Creative Computing Morristown, New Jersey\n\n\n".rjust(57)) medals = { "gold": 0, @@ -19,64 +19,64 @@ def ask_int(question): return int(reply) if reply.isnumeric() else -1 def pre_run(): - print("\nTYPE \"INS\" FOR INSTRUCTIONS") - print("TYPE \"MAX\" FOR APPROXIMATE MAXIMUM SPEEDS") - print("TYPE \"RUN\" FOR THE BEGINNING OF THE RACE") - cmd = ask("COMMAND--") + print("\nType \"INS\" for instructions") + print("Type \"MAX\" for approximate maximum speeds") + print("Type \"RUN\" for the beginning of the race") + cmd = ask("Command--") while cmd != "RUN": if cmd == "INS": - print("\n*** SLALOM: THIS IS THE 1976 WINTER OLYMPIC GIANT SLALOM. YOU ARE") - print(" THE AMERICAN TEAM'S ONLY HOPE OF A GOLD MEDAL.\n") - print(" 0 -- TYPE THIS IS YOU WANT TO SEE HOW LONG YOU'VE TAKEN.") - print(" 1 -- TYPE THIS IF YOU WANT TO SPEED UP A LOT.") - print(" 2 -- TYPE THIS IF YOU WANT TO SPEED UP A LITTLE.") - print(" 3 -- TYPE THIS IF YOU WANT TO SPEED UP A TEENSY.") - print(" 4 -- TYPE THIS IF YOU WANT TO KEEP GOING THE SAME SPEED.") - print(" 5 -- TYPE THIS IF YOU WANT TO CHECK A TEENSY.") - print(" 6 -- TYPE THIS IF YOU WANT TO CHECK A LITTLE.") - print(" 7 -- TYPE THIS IF YOU WANT TO CHECK A LOT.") - print(" 8 -- TYPE THIS IF YOU WANT TO CHEAT AND TRY TO SKIP A GATE.\n") - print(" THE PLACE TO USE THESE OPTIONS IS WHEN THE COMPUTER ASKS:\n") - print("OPTION?\n") - print(" GOOD LUCK!\n") - cmd = ask("COMMAND--") + print("\n*** Slalom: This is the 1976 Winter Olypic Giant Slalom. You are") + print(" the American team's only hope for a gold medal.\n") + print(" 0 -- Type this if you want to see how long you've taken.") + print(" 1 -- Type this if you want to speed up a lot.") + print(" 2 -- Type this if you want to speed up a little.") + print(" 3 -- Type this if you want to speed up a teensy.") + print(" 4 -- Type this if you want to keep going the same speed.") + print(" 5 -- Type this if you want to check a teensy.") + print(" 6 -- Type this if you want to check a little.") + print(" 7 -- Type this if you want to check a lot.") + print(" 8 -- Type this if you want to cheat and try to skip a gate.\n") + print(" The place to use these options is when the Computer asks:\n") + print("Option?\n") + print(" Good Luck!\n") + cmd = ask("Command--") elif cmd == "MAX": - print("GATE MAX") + print("Gate Max") print(" # M.P.H.") print("----------") for i in range(0, gates): print(f" {i + 1} {max_speeds[i]}") - cmd = ask("COMMAND--") + cmd = ask("Command--") else: - cmd = ask(f"\"{cmd}\" IS AN ILLEGAL COMMAND--RETRY") + cmd = ask(f"\"{cmd}\" is an illegal command--Retry") def run(): global medals - print("THE STARTER COUNTS DOWN...5...4...3...2...1...GO!") + print("The starter counts down...5...4...3...2...1...Go!") time = 0 speed = int(random() * (18 - 9) + 9) - print("YOU'RE OFF") + print("You're off") for i in range(0, gates): while True: - print(f"\nHERE COMES GATE #{i + 1}:") - print(f" {int(speed)}M.P.H.") + print(f"\nHere comes gate #{i + 1}:") + print(f" {int(speed)} M.P.H.") old_speed = speed - opt = ask_int("OPTION") + opt = ask_int("Option") while opt < 1 or opt > 8: if(opt == 0): - print(f"YOU'VE TAKEN {int(time)}SECONDS.") + print(f"You've taken {int(time)} seconds.") else: - print("WHAT?") - opt = ask_int("OPTION") + print("What?") + opt = ask_int("Option") if opt == 8: - print("***CHEAT") + print("***Cheat") if random() < .7: - print("AN OFFICIAL CAUGHT YOU!") - print(f"YOU TOOK {int(time + random())}SECONDS.") + print("An official caught you!") + print(f"You took {int(time + random())} seconds.") return else: - print("YOU MADE IT!") + print("You made it!") time += 1.5 else: match opt: @@ -97,69 +97,69 @@ def run(): case 7: speed -= int(random() * (10 - 5) + 5) - print(f" {int(speed)}M.P.H.") + print(f" {int(speed)} M.P.H.") if speed > max_speeds[i]: if random() < ((speed - max_speeds[i]) * .1) + .2: - print(f"YOU WENT OVER THE MAXIMUM SPEED AND {'SNAGGED A FLAG' if random() < .5 else 'WIPED OUT'}!") - print(f"YOU TOOK {int(time + random())}SECONDS") + print(f"You went over the maximum speed and {'snagged a flag' if random() < .5 else 'wiped out'}!") + print(f"You took {int(time + random())} seconds") return else: - print("YOU WENT OVER THE NAXIMUM SPEED AND MADE IT!") + print("You went over the maximum speed and made it!") if speed > max_speeds[i] - 1: - print("CLOSE ONE!") + print("Close one!") if speed < 7: - print("LET'S BE REALISTIC, OK? LET'S GO BACK AND TRY AGAIN...") + print("Let's be realistic, ok? Let's go back and try again...") speed = old_speed else: time += max_speeds[i] - speed + 1 if speed > max_speeds[i]: time += .5 break - print(f"\nYOU TOOK {int(time + random())}SECONDS.") + print(f"\nYou took {int(time + random())} seconds.") avg = time / gates if avg < 1.5 - (lvl * .1): - print("YOU WON A GOLD MEDAL!") + print("Yout won a gold medal!") medals["gold"] += 1 elif avg < 2.9 - (lvl * .1): - print("YOU WON A SILVER MEDAL!") + print("You won a silver medal!") medals["silver"] += 1 elif avg < 4.4 - (lvl * .01): - print("YOU WON A BRONZE MEDAL!") + print("You won a bronze medal!") medals["bronze"] += 1 while True: - gates = ask_int("HOW MANY GATES DOES THIS COURSE HAVE (1 TO 25)") + gates = ask_int("How many gates does this course have (1 to 25)") if gates < 1: - print("TRY AGAIN,") + print("Try again,") else: if(gates > 25): - print("25 IS THE LIMIT.") + print("25 is the limit.") break pre_run() while True: - lvl = ask_int("RATE YOURSELF AS A SKIER, (1=WORST, 3=BEST)") + lvl = ask_int("Rate yourself as a skier, (1=Worst, 3=Best)") if lvl < 1 or lvl > 3: - print("THE BOUNDS ARE 1-3.") + print("The bounds are 1-3.") else: break while True: run() while True: - answer = ask("DO YOU WANT TO PLAY AGAIN?") + answer = ask("Do you want to play again?") if answer == "YES" or answer == "NO": break else: - print("PLEASE TYPE 'YES' OR 'NO'") + print("Please type \"YES\" or \"NO\"") if answer == "NO": break -print("THANKS FOR THE RACE") +print("Thanks for the race") if medals["gold"] > 0: - print(f"GOLD MEDALS: {medals['gold']}") + print(f"Gold medals: {medals['gold']}") if medals["silver"] > 0: - print(f"SILVER MEDALS: {medals['silver']}") + print(f"Silver medals: {medals['silver']}") if medals["bronze"] > 0: - print(f"BRONZE MEDALS: {medals['bronze']}") + print(f"Bronze medals: {medals['bronze']}") From 10af3318d66d7314c0b49023447f0970b716a140 Mon Sep 17 00:00:00 2001 From: Gabry Date: Thu, 24 Feb 2022 19:35:40 +0100 Subject: [PATCH 04/10] Formatted the output texts to follow a more modern style --- 79_Slalom/python/slalom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/79_Slalom/python/slalom.py b/79_Slalom/python/slalom.py index 44ce0fde..a764e84a 100644 --- a/79_Slalom/python/slalom.py +++ b/79_Slalom/python/slalom.py @@ -76,7 +76,7 @@ def run(): print(f"You took {int(time + random())} seconds.") return else: - print("You made it!") + print("You made it!") time += 1.5 else: match opt: From ee141149f7fde96c28d44c3decdbc5f0267aba23 Mon Sep 17 00:00:00 2001 From: masykur Date: Sat, 26 Feb 2022 08:47:53 +0700 Subject: [PATCH 05/10] Bug fix of C# logic and ignore .vscode/ folder --- .gitignore | 1 + 89_Tic-Tac-Toe/csharp/tictactoe1/Program.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index d2115efc..f23bcbe8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.class */.vs *.suo +.vscode/ bin/ obj/ diff --git a/89_Tic-Tac-Toe/csharp/tictactoe1/Program.cs b/89_Tic-Tac-Toe/csharp/tictactoe1/Program.cs index 58f7d36f..d4955a40 100644 --- a/89_Tic-Tac-Toe/csharp/tictactoe1/Program.cs +++ b/89_Tic-Tac-Toe/csharp/tictactoe1/Program.cs @@ -33,13 +33,15 @@ while(true) { d = move(c + 3); computerMoves(d); s = readYourMove(); - if (s != move(d + 4)) { + if (s == move(d + 4)) { + e = move(d + 6); + computerMoves(e); + Console.WriteLine("THE GAME IS A DRAW."); + } else { e = move(d + 4); computerMoves(e); + Console.WriteLine("AND WINS ********"); } - e = move(d + 6); - computerMoves(e); - Console.WriteLine("THE GAME IS A DRAW."); } else { d = move(c + 7); computerMoves(d); From 744bafebf1d828931308768b3a56afbf04caab4d Mon Sep 17 00:00:00 2001 From: masykur Date: Sat, 26 Feb 2022 09:54:21 +0700 Subject: [PATCH 06/10] Added tictactoe1 in Golang --- .gitignore | 1 - 89_Tic-Tac-Toe/go/src/tictactoe1.go | 88 +++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 89_Tic-Tac-Toe/go/src/tictactoe1.go diff --git a/.gitignore b/.gitignore index 43cfcf3f..2675262f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ buildJvm/*/build/ *.class */.vs *.suo -.vscode/ bin/ obj/ diff --git a/89_Tic-Tac-Toe/go/src/tictactoe1.go b/89_Tic-Tac-Toe/go/src/tictactoe1.go new file mode 100644 index 00000000..a6dcbb69 --- /dev/null +++ b/89_Tic-Tac-Toe/go/src/tictactoe1.go @@ -0,0 +1,88 @@ +package main + +import ( + "fmt" + "strconv" +) + +func main() { + fmt.Printf("Hello, World!\n") + // Print text on the screen with 30 spaces before text + fmt.Printf("%30s\n", "TIC TAC TOE") + // Print text on screen with 15 spaces before text + // And print three lines break on screen + fmt.Printf("%15s\n\n\n\n", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY") + // THIS PROGRAM PLAYS TIC TAC TOE + // THE MACHINE GOES FIRST + fmt.Printf("THE GAME BOARD IS NUMBERED:\n\n") + fmt.Println("1 2 3") + fmt.Println("8 9 4") + fmt.Println("7 6 5") + + // Main program + for { + var ( + a, b, c, d, e int + p, q, r, s int + ) + a = 9 + fmt.Printf("\n\n") + computerMoves(a) + p = readYourMove() + b = move(p + 1) + computerMoves(b) + q = readYourMove() + if q == move(b+4) { + c = move(b + 2) + computerMoves(c) + r = readYourMove() + if r == move(c+4) { + if p%2 != 0 { + d = move(c + 3) + computerMoves(d) + s = readYourMove() + if s == move(d+4) { + e = move(d + 6) + computerMoves(e) + fmt.Println("THE GAME IS A DRAW.") + } else { + e = move(d + 4) + computerMoves(e) + fmt.Println("AND WINS ********") + } + } else { + d = move(c + 7) + computerMoves(d) + fmt.Println("AND WINS ********") + } + } else { + d = move(c + 4) + computerMoves(d) + fmt.Println("AND WINS ********") + } + } else { + c = move(b + 4) + computerMoves(c) + fmt.Println("AND WINS ********") + } + } +} +func computerMoves(move int) { + fmt.Printf("COMPUTER MOVES %v\n", move) +} + +func readYourMove() int { + for { + fmt.Printf("YOUR MOVE?") + var input string + fmt.Scan(&input) + number, err := strconv.Atoi(input) + if err == nil { + return number + } + } +} + +func move(number int) int { + return number - 8*(int)((number-1)/8) +} From 1e082e8650965eec210284f3a8b3511b4fba0373 Mon Sep 17 00:00:00 2001 From: masykur Date: Sat, 26 Feb 2022 11:32:49 +0700 Subject: [PATCH 07/10] Added tictactoe1 in Pascal --- 89_Tic-Tac-Toe/go/README.md | 3 + 89_Tic-Tac-Toe/pascal/tictactoe1.pas | 103 +++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 89_Tic-Tac-Toe/go/README.md create mode 100644 89_Tic-Tac-Toe/pascal/tictactoe1.pas diff --git a/89_Tic-Tac-Toe/go/README.md b/89_Tic-Tac-Toe/go/README.md new file mode 100644 index 00000000..aa1b3ae5 --- /dev/null +++ b/89_Tic-Tac-Toe/go/README.md @@ -0,0 +1,3 @@ +Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html) + +Conversion to [Pascal](https://en.wikipedia.org/wiki/Pascal_(programming_language)) diff --git a/89_Tic-Tac-Toe/pascal/tictactoe1.pas b/89_Tic-Tac-Toe/pascal/tictactoe1.pas new file mode 100644 index 00000000..2329ce79 --- /dev/null +++ b/89_Tic-Tac-Toe/pascal/tictactoe1.pas @@ -0,0 +1,103 @@ +program tictactoe1; +var + a, b, c, d, e: integer; + p, q, r, s: integer; +procedure computerMoves(m: integer); +begin + write('COMPUTER MOVES '); + writeln(m); +end; + +function readYourMove() : integer; +var number: integer; +begin + write('YOUR MOVE?'); + readln(number); + readYourMove := number; +end; + +function move(number: integer): integer; +begin + move := number - 8 * trunc((number - 1) / 8); +end; + +function padLeft(m: string; n: integer): string; +var tmp: string; +begin + tmp := ''; + repeat + tmp := tmp + ' '; + n := n - 1; + until n = 0; + tmp := tmp + m; + padLeft := tmp; +end; + +begin + writeln(padLeft('TIC TAC TOE', 30)); + writeln(padLeft('CREATIVE COMPUTING MORRISTOWN, NEW JERSEY', 15)); + writeln(''); + writeln(''); + writeln(''); + writeln('THE GAME BOARD IS NUMBERED:'); + writeln(''); + writeln('1 2 3'); + writeln('8 9 4'); + writeln('7 6 5'); + while(true) do + begin + writeln(''); + writeln(''); + a := 9; + computerMoves(a); + p := readYourMove(); + b := move(p + 1); + computerMoves(b); + q := readYourMove(); + if (q = move(b + 4)) then + begin + c := move(b + 2); + computerMoves(c); + r := readYourMove(); + if (r = move(c + 4)) then + begin + if (p mod 2 <> 0) then + begin + d := move(c + 3); + computerMoves(d); + s := readYourMove(); + if (s = move(d + 4)) then + begin + e := move(d + 6); + computerMoves(e); + writeln('THE GAME IS A DRAW.'); + end + else + begin + e := move(d + 4); + computerMoves(e); + writeln('AND WINS ********'); + end + end + else + begin + d := move(c + 7); + computerMoves(d); + writeln('AND WINS ********'); + end + end + else + begin + d := move(c + 4); + computerMoves(d); + writeln('AND WINS ********'); + end + end + else + begin + c := move(b + 4); + computerMoves(c); + writeln('AND WINS ********'); + end; + end; +end. \ No newline at end of file From 66881c731340f162c6a9267aeac25aa1f1a0af16 Mon Sep 17 00:00:00 2001 From: David Lotts Date: Sun, 27 Feb 2022 03:02:27 -0500 Subject: [PATCH 08/10] Completed Rust version of Rocket --- 59_Lunar_LEM_Rocket/rust/README.md | 6 ++ 59_Lunar_LEM_Rocket/rust/rocket/Cargo.toml | 10 ++ 59_Lunar_LEM_Rocket/rust/rocket/src/main.rs | 107 ++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 59_Lunar_LEM_Rocket/rust/README.md create mode 100644 59_Lunar_LEM_Rocket/rust/rocket/Cargo.toml create mode 100644 59_Lunar_LEM_Rocket/rust/rocket/src/main.rs diff --git a/59_Lunar_LEM_Rocket/rust/README.md b/59_Lunar_LEM_Rocket/rust/README.md new file mode 100644 index 00000000..d05c9af4 --- /dev/null +++ b/59_Lunar_LEM_Rocket/rust/README.md @@ -0,0 +1,6 @@ +README.md + +Original source downloaded from Vintage Basic + +Conversion to Rust + diff --git a/59_Lunar_LEM_Rocket/rust/rocket/Cargo.toml b/59_Lunar_LEM_Rocket/rust/rocket/Cargo.toml new file mode 100644 index 00000000..e22d3e14 --- /dev/null +++ b/59_Lunar_LEM_Rocket/rust/rocket/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "rocket" +version = "1.0.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +text_io = "0.1.10" +num-integer = "0.1" diff --git a/59_Lunar_LEM_Rocket/rust/rocket/src/main.rs b/59_Lunar_LEM_Rocket/rust/rocket/src/main.rs new file mode 100644 index 00000000..5aa9a9f4 --- /dev/null +++ b/59_Lunar_LEM_Rocket/rust/rocket/src/main.rs @@ -0,0 +1,107 @@ +//Goal of this port is to keep Basic lang idioms where possible. Gotta have those single letter capital variables! +use num_integer::{sqrt}; +use std::io::{self, Write}; +use text_io::{read, try_read}; +#[allow(non_snake_case)] +fn main() { + println!("{:>30}", "ROCKET"); + println!("{:>15}", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + println!();println!();println!(); + println!("LUNAR LANDING SIMULATION"); + println!("----- ------- ----------");println!(); + let A= input("DO YOU WANT INSTRUCTIONS (YES OR NO) "); + if !(A=="NO") { + println!(); + println!("YOU ARE LANDING ON THE MOON AND AND HAVE TAKEN OVER MANUAL"); + println!("CONTROL 1000 FEET ABOVE A GOOD LANDING SPOT. YOU HAVE A DOWN-"); + println!("WARD VELOCITY OF 50 FEET/SEC. 150 UNITS OF FUEL REMAIN."); + println!(); + println!("HERE ARE THE RULES THAT GOVERN YOUR APOLLO SPACE-CRAFT:"); println!(); + println!("(1) AFTER EACH SECOND THE HEIGHT, VELOCITY, AND REMAINING FUEL"); + println!(" WILL BE REPORTED VIA DIGBY YOUR ON-BOARD COMPUTER."); + println!("(2) AFTER THE REPORT A '?' WILL APPEAR. ENTER THE NUMBER"); + println!(" OF UNITS OF FUEL YOU WISH TO BURN DURING THE NEXT"); + println!(" SECOND. EACH UNIT OF FUEL WILL SLOW YOUR DESCENT BY"); + println!(" 1 FOOT/SEC."); + println!("(3) THE MAXIMUM THRUST OF YOUR ENGINE IS 30 FEET/SEC/SEC"); + println!(" OR 30 UNITS OF FUEL PER SECOND."); + println!("(4) WHEN YOU CONTACT THE LUNAR SURFACE. YOUR DESCENT ENGINE"); + println!(" WILL AUTOMATICALLY SHUT DOWN AND YOU WILL BE GIVEN A"); + println!(" REPORT OF YOUR LANDING SPEED AND REMAINING FUEL."); + println!("(5) IF YOU RUN OUT OF FUEL THE '?' WILL NO LONGER APPEAR"); + println!(" BUT YOUR SECOND BY SECOND REPORT WILL CONTINUE UNTIL"); + println!(" YOU CONTACT THE LUNAR SURFACE.");println!(); + } + loop { + println!("BEGINNING LANDING PROCEDURE..........");println!(); + println!("G O O D L U C K ! ! !"); + println!();println!(); + println!("SEC FEET SPEED FUEL PLOT OF DISTANCE"); + println!(); + let mut T=0;let mut H:i32=1000;let mut V=50;let mut F=150; + let D:i32; let mut V1:i32; let mut B:i32; + 'falling: loop { + println!(" {:<4}{:<11}{:<10}{:<8}I{capsule:>high$}", T,H,V,F,high=(H/15) as usize,capsule="*"); + B = input_int(""); + if B<0 { B=0 } + else { if B>30 { B=30 } } + if B>F { B=F } + 'nofuel: loop { + V1=V-B+5; + F=F-B; + H=H- (V+V1)/2; + if H<=0 { break 'falling} + T=T+1; + V=V1; + if F>0 { break 'nofuel } + if B!=0 { + println!("**** OUT OF FUEL ****"); + } + println!(" {:<4}{:<11}{:<10}{:<8}I{capsule:>high$}", T,H,V,F,high=(H/12+29) as usize,capsule="*"); + B=0; + } + } + H=H+ (V1+V)/2; + if B==5 { + D=H/V; + } else { + D=(-V+sqrt(V*V+H*(10-2*B)))/(5-B); + V1=V+(5-B)*D; + } + println!("***** CONTACT *****"); + println!("TOUCHDOWN AT {} SECONDS.",T+D); + println!("LANDING VELOCITY={} FEET/SEC.",V1); + println!("{} UNITS OF FUEL REMAINING.", F); + if V1==0 { + println!("CONGRATULATIONS! A PERFECT LANDING!!"); + println!("YOUR LICENSE WILL BE RENEWED.......LATER."); + } + if V1.abs()>=2 { + println!("***** SORRY, BUT YOU BLEW IT!!!!"); + println!("APPROPRIATE CONDOLENCES WILL BE SENT TO YOUR NEXT OF KIN."); + } + println!();println!();println!(); + let A = input("ANOTHER MISSION"); + if !(A=="YES") { break }; + } + println!();println!( "CONTROL OUT.");println!(); +} + + +fn input(prompt:&str) -> String { + loop { + print!("{} ? ",prompt);io::stdout().flush().unwrap(); + let innn:String=read!("{}\n"); + let out:String = innn.trim().to_string(); + if out!="" {return out} + } +} +fn input_int(prompt:&str) -> i32 { + loop { + print!("{} ? ",prompt);io::stdout().flush().unwrap(); + match try_read!() { + Ok(n) => return n, + Err(_) => println!("Enter a number 0-30"), + } + } +} \ No newline at end of file From a12a5687037a6a4414e2ed30eba14ad6a30bc383 Mon Sep 17 00:00:00 2001 From: David Lotts Date: Sun, 27 Feb 2022 12:16:00 -0500 Subject: [PATCH 09/10] Add description of the three game folders. --- 59_Lunar_LEM_Rocket/rust/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/59_Lunar_LEM_Rocket/rust/README.md b/59_Lunar_LEM_Rocket/rust/README.md index d05c9af4..9ecf50dc 100644 --- a/59_Lunar_LEM_Rocket/rust/README.md +++ b/59_Lunar_LEM_Rocket/rust/README.md @@ -2,5 +2,11 @@ README.md Original source downloaded from Vintage Basic -Conversion to Rust +This folder for chapter #59 contains three different games. Three folders here contain the three games: + + - Rocket + - LEM + - lunar + +Conversion to [Rust](https://www.rust-lang.org) From 33008a1a68a83d19984c0c9c4ee6bdcbe392dc13 Mon Sep 17 00:00:00 2001 From: uMetalooper Date: Sun, 27 Feb 2022 21:57:41 +0000 Subject: [PATCH 10/10] Civil War Python added --- 27_Civil_War/python/Civilwar.py | 441 ++++++++++++++++++++++++++++++++ 1 file changed, 441 insertions(+) create mode 100644 27_Civil_War/python/Civilwar.py diff --git a/27_Civil_War/python/Civilwar.py b/27_Civil_War/python/Civilwar.py new file mode 100644 index 00000000..956abe1f --- /dev/null +++ b/27_Civil_War/python/Civilwar.py @@ -0,0 +1,441 @@ +import math +import random + + +def tab(n): + return " "*n + + +battles = [["JULY 21, 1861. GEN. BEAUREGARD, COMMANDING THE SOUTH, MET", + "UNION FORCES WITH GEN. MCDOWELL IN A PREMATURE BATTLE AT", + "BULL RUN. GEN. JACKSON HELPED PUSH BACK THE UNION ATTACK."], + + ["APRIL 6-7, 1862. THE CONFEDERATE SURPRISE ATTACK AT", + "SHILOH FAILED DUE TO POOR ORGANIZATION."], + + ["JUNE 25-JULY 1, 1862. GENERAL LEE (CSA) UPHELD THE", + "OFFENSIVE THROUGHOUT THE BATTLE AND FORCED GEN. MCCLELLAN", + "AND THE UNION FORCES AWAY FROM RICHMOND."], + + ["AUG 29-30, 1862. THE COMBINED CONFEDERATE FORCES UNDER LEE", + "AND JACKSON DROVE THE UNION FORCES BACK INTO WASHINGTON."], + + ["SEPT 17, 1862. THE SOUTH FAILED TO INCORPORATE MARYLAND", + "INTO THE CONFEDERACY."], + + ["DEC 13, 1862. THE CONFEDERACY UNDER LEE SUCCESSFULLY", + "REPULSED AN ATTACK BY THE UNION UNDER GEN. BURNSIDE."], + + ["DEC 31, 1862. THE SOUTH UNDER GEN. BRAGG WON A CLOSE BATTLE."], + + ["MAY 1-6, 1863. THE SOUTH HAD A COSTLY VICTORY AND LOST", + "ONE OF THEIR OUTSTANDING GENERALS, 'STONEWALL' JACKSON."], + + ["JULY 4, 1863. VICKSBURG WAS A COSTLY DEFEAT FOR THE SOUTH", + "BECAUSE IT GAVE THE UNION ACCESS TO THE MISSISSIPPI."], + + ["JULY 1-3, 1863. A SOUTHERN MISTAKE BY GEN. LEE AT GETTYSBURG", + "COST THEM ONE OF THE MOST CRUCIAL BATTLES OF THE WAR."], + + ["SEPT. 15, 1863. CONFUSION IN A FOREST NEAR CHICKAMAUGA LED", + "TO A COSTLY SOUTHERN VICTORY."], + + ["NOV. 25, 1863. AFTER THE SOUTH HAD SIEGED GEN. ROSENCRANS'", + "ARMY FOR THREE MONTHS, GEN. GRANT BROKE THE SIEGE."], + + ["MAY 5, 1864. GRANT'S PLAN TO KEEP LEE ISOLATED BEGAN TO", + "FAIL HERE, AND CONTINUED AT COLD HARBOR AND PETERSBURG."], + + ["AUGUST, 1864. SHERMAN AND THREE VETERAN ARMIES CONVERGED", + "ON ATLANTA AND DEALT THE DEATH BLOW TO THE CONFEDERACY."]] + +historical_data = [ + [], + ["BULL RUN", 18000, 18500, 1967, 2708, 1], + ["SHILOH", 40000., 44894., 10699, 13047, 3], + ["SEVEN DAYS", 95000., 115000., 20614, 15849, 3], + ["SECOND BULL RUN", 54000., 63000., 10000, 14000, 2], + ["ANTIETAM", 40000., 50000., 10000, 12000, 3], + ["FREDERICKSBURG", 75000., 120000., 5377, 12653, 1], + ["MURFREESBORO", 38000., 45000., 11000, 12000, 1], + ["CHANCELLORSVILLE", 32000, 90000., 13000, 17197, 2], + ["VICKSBURG", 50000., 70000., 12000, 19000, 1], + ["GETTYSBURG", 72500., 85000., 20000, 23000, 3], + ["CHICKAMAUGA", 66000., 60000., 18000, 16000, 2], + ["CHATTANOOGA", 37000., 60000., 36700., 5800, 2], + ["SPOTSYLVANIA", 62000., 110000., 17723, 18000, 2], + ["ATLANTA", 65000., 100000., 8500, 3700, 1]] +sa = {} +da = {} +fa = {} +ha = {} +ba = {} +oa = {} +print(tab(26) + "CIVIL WAR") +print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY") +print() +print() +print() +# Original game design: Cram, Goodie, Hibbard Lexington H.S. +# Modifications: G. Paul, R. Hess (Ties), 1973 +# Union info on likely confederate strategy +sa[1] = 25 +sa[2] = 25 +sa[3] = 25 +sa[4] = 25 +d = -1 # number of players in the game +print() +while True: + X = input("DO YOU WANT INSTRUCTIONS? ") + if (X == "YES" or X == "NO"): + break + print("YES OR NO -- ") + +if X == "YES": + print() + print() + print() + print() + print("THIS IS A CIVIL WAR SIMULATION.") + print("TO PLAY TYPE A RESPONSE WHEN THE COMPUTER ASKS.") + print("REMEMBER THAT ALL FACTORS ARE INTERRELATED AND THAT YOUR") + print("RESPONSES COULD CHANGE HISTORY. FACTS AND FIGURES USED ARE") + print("BASED ON THE ACTUAL OCCURRENCE. MOST BATTLES TEND TO RESULT") + print("AS THEY DID IN THE CIVIL WAR, BUT IT ALL DEPENDS ON YOU!!") + print() + print("THE OBJECT OF THE GAME IS TO WIN AS MANY BATTLES AS ") + print("POSSIBLE.") + print() + print("YOUR CHOICES FOR DEFENSIVE STRATEGY ARE:") + print(" (1) ARTILLERY ATTACK") + print(" (2) FORTIFICATION AGAINST FRONTAL ATTACK") + print(" (3) FORTIFICATION AGAINST FLANKING MANEUVERS") + print(" (4) FALLING BACK") + print(" YOUR CHOICES FOR OFFENSIVE STRATEGY ARE:") + print(" (1) ARTILLERY ATTACK") + print(" (2) FRONTAL ATTACK") + print(" (3) FLANKING MANEUVERS") + print(" (4) ENCIRCLEMENT") + print("YOU MAY SURRENDER BY TYPING A '5' FOR YOUR STRATEGY.") + +print() +print() +print() +print("ARE THERE TWO GENERALS PRESENT ", end="") +while True: + bs = input("(ANSWER YES OR NO) ") + if bs == "YES": + d = 2 + break + elif bs == "NO": + d = 1 + print() + print("YOU ARE THE CONFEDERACY. GOOD LUCK!") + print() + break + +print("SELECT A BATTLE BY TYPING A NUMBER FROM 1 TO 14 ON") +print("REQUEST. TYPE ANY OTHER NUMBER TO END THE SIMULATION.") +print("BUT '0' BRINGS BACK EXACT PREVIOUS BATTLE SITUATION") +print("ALLOWING YOU TO REPLAY IT") +print() +print("NOTE: A NEGATIVE FOOD$ ENTRY CAUSES THE PROGRAM TO ") +print("USE THE ENTRIES FROM THE PREVIOUS BATTLE") +print() +print("AFTER REQUESTING A BATTLE, DO YOU WISH ", end="") +print("BATTLE DESCRIPTIONS ", end="") +while True: + xs = input("(ANSWER YES OR NO) ") + if xs == "YES" or xs == "NO": + break +l = 0 +w = 0 +r1 = 0 +q1 = 0 +m3 = 0 +m4 = 0 +p1 = 0 +p2 = 0 +t1 = 0 +t2 = 0 +for i in range(1, 3): + da[i] = 0 + fa[i] = 0 + ha[i] = 0 + ba[i] = 0 + oa[i] = 0 +r2 = 0 +q2 = 0 +c6 = 0 +f = 0 +w0 = 0 +y = 0 +y2 = 0 +u = 0 +u2 = 0 +while True: + print() + print() + print() + a = int(input("WHICH BATTLE DO YOU WISH TO SIMULATE? ")) + if a < 1 or a > 14: + break + if a != 0 or r == 0: + cs = historical_data[a][0] + m1 = historical_data[a][1] + m2 = historical_data[a][2] + c1 = historical_data[a][3] + c2 = historical_data[a][4] + m = historical_data[a][5] + u = 0 + # Inflation calc + i1 = 10 + (l - w) * 2 + i2 = 10 + (w - l) * 2 + # Money available + da[1] = 100 * math.floor((m1 * (100 - i1) / 2000) + * (1 + (r1 - q1) / (r1 + 1)) + 0.5) + da[2] = 100 * math.floor(m2 * (100 - i2) / 2000 + 0.5) + if bs == "YES": + da[2] = 100 * math.floor((m2 * (100 - i2) / 2000) + * (1 + (r2 - q2) / (r2 + 1)) + 0.5) + # Men available + m5 = math.floor(m1 * (1 + (p1 - t1) / (m3 + 1))) + m6 = math.floor(m2 * (1 + (p2 - t2) / (m4 + 1))) + f1 = 5 * m1 / 6 + print() + print() + print() + print() + print() + print(f"THIS IS THE BATTLE OF {cs}") + if xs != "NO": + print("\n".join(battles[a-1])) + + else: + print(cs + " INSTANT REPLAY") + + print() + print(" \tCONFEDERACY\t UNION") + print(f"MEN\t {m5}\t\t {m6}") + print(f"MONEY\t ${da[1]}\t\t${da[2]}") + print(f"INFLATION\t {i1 + 15}%\t {i2}%") + print() + # ONLY IN PRINTOUT IS CONFED INFLATION = I1 + 15 % + # IF TWO GENERALS, INPUT CONFED, FIRST + for i in range(1, d+1): + if bs == "YES" and i == 1: + print("CONFEDERATE GENERAL---", end="") + print("HOW MUCH DO YOU WISH TO SPEND FOR") + while True: + f = int(input(" - FOOD...... ? ")) + if f < 0: + if r1 == 0: + print("NO PREVIOUS ENTRIES") + continue + print("ASSUME YOU WANT TO KEEP SAME ALLOCATIONS") + print() + break + fa[i] = f + while True: + ha[i] = int(input(" - SALARIES.. ? ")) + if ha[i] >= 0: + break + print("NEGATIVE VALUES NOT ALLOWED.") + while True: + ba[i] = int(input(" - AMMUNITION ? ")) + if ba[i] >= 0: + break + print("NEGATIVE VALUES NOT ALLOWED.") + print() + if fa[i] + ha[i] + ba[i] > da[i]: + print("THINK AGAIN! YOU HAVE ONLY $" + da[i]) + else: + break + + if bs != "YES" or i == 2: + break + print("UNION GENERAL---", end="") + + for z in range(1, d+1): + if bs == "YES": + if z == 1: + print("CONFEDERATE ", end="") + else: + print(" UNION ", end="") + # Find morale + o = ((2 * math.pow(fa[z], 2) + + math.pow(ha[z], 2)) / math.pow(f1, 2) + 1) + if o >= 10: + print("MORALE IS HIGH") + elif o >= 5: + print("MORALE IS FAIR") + else: + print("MORALE IS POOR") + if bs != "YES": + break + oa[z] = o + + o2 = oa[2] + o = oa[1] + print("CONFEDERATE GENERAL---") + # Actual off/def battle situation + if m == 3: + print("YOU ARE ON THE OFFENSIVE") + elif m == 1: + print("YOU ARE ON THE DEFENSIVE") + else: + print("BOTH SIDES ARE ON THE OFFENSIVE") + + print() + # Choose strategies + if bs != "YES": + while True: + y = int(input("YOUR STRATEGY ")) + if (abs(y - 3) < 3): + break + print(f"STRATEGY {y} NOT ALLOWED.") + if y == 5: + print("THE CONFEDERACY HAS SURRENDERED.") + break + # Union strategy is computer chosen + if a == 0: + while True: + y2 = int(input("UNION STRATEGY IS ")) + if y2 > 0 and y2 < 5: + break + print("ENTER 1, 2, 3, OR 4 (USUALLY PREVIOUS UNION STRATEGY)") + else: + s0 = 0 + r = math.random() * 100 + for i in range(1, 5): + s0 += sa[i] + # If actual strategy info is in program data statements + # then r-100 is extra weight given to that strategy. + if r < s0: + break + y2 = i + print(y2) + else: + for i in range(1, 3): + if (i == 1): + print("CONFEDERATE STRATEGY ? ", end="") + while True: + y = int(input()) + if abs(y - 3) < 3: + break + print(f"STRATEGY {y} NOT ALLOWED.") + print("YOUR STRATEGY ? ", end="") + if (i == 2): + y2 = y + y = y1 + if (y2 != 5): + break + else: + y1 = y + print("UNION STRATEGY ? ", end="") + # Simulated losses - North + c6 = (2 * c2 / 5) * (1 + 1 / (2 * (abs(y2 - y) + 1))) + c6 = c6 * (1.28 + (5 * m2 / 6) / (ba[2] + 1)) + c6 = math.floor(c6 * (1 + 1 / o2) + 0.5) + # If loss > men present, rescale losses + e2 = 100 / o2 + if math.floor(c6 + e2) >= m6: + c6 = math.floor(13 * m6 / 20) + e2 = 7 * c6 / 13 + u2 = 1 + # Calculate simulated losses + print() + print() + print() + print("\t\tCONFEDERACY\tUNION") + c5 = (2 * c1 / 5) * (1 + 1 / (2 * (abs(y2 - y) + 1))) + c5 = math.floor(c5 * (1 + 1 / o) * (1.28 + f1 / (ba[1] + 1)) + 0.5) + e = 100 / o + if c5 + 100 / o >= m1 * (1 + (p1 - t1) / (m3 + 1)): + c5 = math.floor(13 * m1 / 20 * (1 + (p1 - t1) / (m3 + 1))) + e = 7 * c5 / 13 + u = 1 + + if (d == 1): + c6 = math.floor(17 * c2 * c1 / (c5 * 20)) + e2 = 5 * o + + print("CASUALTIES\t" + str(c5) + "\t\t" + str(c6)) + print("DESERTIONS\t" + str(math.floor(e)) + "\t\t" + str(math.floor(e2))) + print() + if (bs == "YES"): + print("COMPARED TO THE ACTUAL CASUALTIES AT " + str(cs)) + print("CONFEDERATE: " + str(math.floor(100 * + (c5 / c1) + 0.5)) + "% OF THE ORIGINAL") + print("UNION: " + str(math.floor(100 * + (c6 / c2) + 0.5)) + "% OF THE ORIGINAL") + + print() + # Find who won + if (u == 1 and u2 == 1 or (u != 1 and u2 != 1 and c5 + e == c6 + e2)): + print("BATTLE OUTCOME UNRESOLVED") + w0 += 1 + elif (u == 1 or (u != 1 and u2 != 1 and c5 + e > c6 + e2)): + print("THE UNION WINS " + str(cs)) + if a != 0: + l += 1 + else: + print("THE CONFEDERACY WINS " + str(cs)) + if (a != 0): + w += 1 + + # Lines 2530 to 2590 from original are unreachable. + if (a != 0): + t1 += c5 + e + t2 += c6 + e2 + p1 += c1 + p2 += c2 + q1 += fa[1] + ha[1] + ba[1] + q2 += fa[2] + ha[2] + ba[2] + r1 += m1 * (100 - i1) / 20 + r2 += m2 * (100 - i2) / 20 + m3 += m1 + m4 += m2 + # Learn present strategy, start forgetting old ones + # present startegy of south gains 3*s, others lose s + # probability points, unless a strategy falls below 5 % . + s = 3 + s0 = 0 + for i in range(1, 5): + if (sa[i] <= 5): + continue + sa[i] -= 5 + s0 += s + sa[y] += s0 + + u = 0 + u2 = 0 + print("---------------") + continue + +print() +print() +print() +print() +print() +print() +print(f"THE CONFEDERACY HAS WON {w} BATTLES AND LOST {l}") +if (y == 5 or (y2 != 5 and w <= l)): + print("THE UNION HAS WON THE WAR") +else: + print("THE CONFEDERACY HAS WON THE WAR") +print() +if (r1 > 0): + print(f"FOR THE {w + l + w0} BATTLES FOUGHT (EXCLUDING RERUNS)") + print(" \t \t ") + print("CONFEDERACY\t UNION") + print(f"HISTORICAL LOSSES\t{math.floor(p1 + 0.5)}\t{math.floor(p2 + 0.5)}") + print(f"SIMULATED LOSSES\t{math.floor(t1 + 0.5)}\t{math.floor(t2 + 0.5)}") + print() + print( + f" % OF ORIGINAL\t{math.floor(100 * (t1 / p1) + 0.5)}\t{math.floor(100 * (t2 / p2) + 0.5)}") + if (bs != "YES"): + print() + print("UNION INTELLIGENCE SUGGEST THAT THE SOUTH USED") + print("STRATEGIES 1, 2, 3, 4 IN THE FOLLOWING PERCENTAGES") + print(f"{sa[1]} {sa[2]} {sa[3]} {sa[4]}")