4つの言語での車の番号。 パート2







8037とは何ですか?



これは小さな数学的なゲームです。あなたは通りを歩いていて、車の番号の数字の合計を数えるだけです。 このゲームは、Swift、Objective-C、Java、C#の4つの言語でコンソール版に実装しています。







最初の部分では、ユーザーがアプリケーションを終了する単語を入力するまでユーザーに答えを求めるアプリケーションの一部を作成しました。 コメントで合理的に指摘されているように、この場合、再帰の代わりにループを使用する方がより正確です。 したがって、最初に行うことは、再帰を削除し、 startGame



メソッドstartGame



ループを書き込むstartGame



です。











スイフト:



 func startGame() { var inputWord: String repeat { print(GreetingMessage.replacingOccurrences(of: ExitWordPlaceholder, with: self.exitWord)) inputWord = readLine() ?? "" } while check(inputWord: inputWord) } private func check(inputWord: String) -> Bool { let isExitWord = (inputWord == self.exitWord) print(isExitWord ? GoodByeMessage : InputAcceptMessage.replacingOccurrences(of: InputWordPlaceholder, with: inputWord)) return !isExitWord }
      
      





Objective-C:



 - (void)startGame { NSString *inputWord; do { NSLog(GreetingMessage, self.exitWord); inputWord = [self readLine]; } while ([self checkInputWord:inputWord]); } - (BOOL)checkInputWord:(NSString *)inputWord { BOOL isExitWord = [inputWord isEqualToString:self.exitWord]; isExitWord ? NSLog(@"%@", GoodByeMessage) : NSLog(InputAcceptMessage, inputWord); return !isExitWord; }
      
      





Java:



 void startGame() { String inputWord; do { System.out.println(String.format(GreetingMessage, exitWord)); inputWord = readLine(); } while (checkInputWord(inputWord)); } private boolean checkInputWord(String inputWord) { boolean isExitWord = inputWord.equals(exitWord); System.out.println(isExitWord ? GoodByeMessage : String.format(InputAcceptMessage, inputWord)); return !isExitWord; }
      
      





C#:



 public void startGame() { string inputWord; do { Console.WriteLine(string.Format(GreetingMessage, exitWord)); inputWord = Console.ReadLine(); } while (checkInputWord(inputWord)); } bool checkInputWord(string inputWord) { bool isExitWord = inputWord.Equals(exitWord); Console.WriteLine(isExitWord ? GoodByeMessage : string.Format(InputAcceptMessage, inputWord)); return !isExitWord; }
      
      





それでは、最終的にゲームのクラスを作成します(覚えているように、 Game



インターフェイス(プロトコル)を特別に作成しました。これをクラスに実装する必要があります)。







 class Game8037: Game { // MARK: - Game func greet(with exitWord: String) { } func check(userAnswer: String) { } }
      
      





ここでは、プロトコルメソッドを空のままにして、クラスの機能を整理します。 まず、難易度レベルの列挙が必要です。







 private enum Level: String { case easy case normal case hard1 case hard2 func forSelect() -> String { return LevelForSelect.replacingOccurrences(of: LevelPlaceholder, with: self.rawValue) .replacingOccurrences(of: LevelNumberPlaceholder, with: "\(self.hashValue+1)") } }
      
      





列挙型にforSelect()



メソッドを追加しましたforSelect()



各難易度レベルに対して、 1 - easy



(レベル番号とその名前)の形式の行を作成します。 これは、ユーザーに難易度を選択してもらうために役立ちます。 次に、選択したレベルとタスクに対する正しい答えを含む2つのプロパティが必要です。







 private var level: Level private var result: UInt32
      
      





これでイニシャライザを書くことができます







 init?() { self.result = 0 let levels = Level.easy.forSelect() + Level.normal.forSelect() + Level.hard1.forSelect() + Level.hard2.forSelect() print(StartGreeting.replacingOccurrences(of: LevelsPlaceholder, with: levels)) let selectedLevel = readLine() ?? "" switch selectedLevel { case "\(Level.easy.hashValue+1)", Level.easy.rawValue: self.level = .easy case "\(Level.normal.hashValue+1)", Level.normal.rawValue: self.level = .normal case "\(Level.hard1.hashValue+1)", Level.hard1.rawValue: self.level = .hard1 case "\(Level.hard2.hashValue+1)", Level.hard2.rawValue: self.level = .hard2 default: print(ErrorLevelMessage) return nil } }
      
      





ご覧のとおり、まず最初に、 result



プロパティのデフォルト値を設定します(まだゼロのままです)。 次に、難易度を選択する必要性に関するユーザー向けの情報行を作成します。 コンソールでは、次のようになります。













それでは、ユーザーが入力した複雑さのレベルを読み取り、それが正しい場合は、 level



プロパティに保存します。







次に、レベルに応じてタスクに対する正しい答えを計算する方法が必要です。







 private func result(with level: Level, and randomizer: Randomizer) -> UInt32 { let result: UInt32 switch level { case .easy: result = randomizer.firstNumber + randomizer.secondNumber + randomizer.thirdNumber + randomizer.fourthNumber case .normal: result = randomizer.firstNumber*10 + randomizer.secondNumber + randomizer.thirdNumber*10 + randomizer.fourthNumber case .hard1: let firstNumber = (randomizer.firstNumber == 0) ? 1 : randomizer.firstNumber let secondNumber = (randomizer.secondNumber == 0) ? 1 : randomizer.secondNumber let thirdNumber = (randomizer.thirdNumber == 0) ? 1 : randomizer.thirdNumber let fourthNumber = (randomizer.fourthNumber == 0) ? 1 : randomizer.fourthNumber result = firstNumber * secondNumber * thirdNumber * fourthNumber case .hard2: result = (randomizer.firstNumber*10 + randomizer.secondNumber) * (randomizer.thirdNumber*10 + randomizer.fourthNumber) } return result }
      
      





そして最後に、 Game



プロトコルのメソッドを実装する必要があります。

greet(with exitWord: String)



メソッドgreet(with exitWord: String)









 func greet(with exitWord: String) { let randomizer = Randomizer() self.result = self.result(with: self.level, and: randomizer) let task = BaseGreeting.replacingOccurrences(of: FirstNumberPlaceholder, with: "\(randomizer.firstNumber)") .replacingOccurrences(of: SecondNumberPlaceholder, with: "\(randomizer.secondNumber)") .replacingOccurrences(of: ThirdNumberPlaceholder, with: "\(randomizer.thirdNumber)") .replacingOccurrences(of: FourthNumberPlaceholder, with: "\(randomizer.fourthNumber)") print(TaskMessage.replacingOccurrences(of: TaskPlaceholder, with: task) .replacingOccurrences(of: ExitWordPlaceholder, with: exitWord)) }
      
      





ここで、新しいRandomizer



を作成し、現在の難易度の正解を計算します。 次に、ユーザーにタスクを表示します。







check(userAnswer: String)



メソッドcheck(userAnswer: String)









 func check(userAnswer: String) { if self.result == UInt32(userAnswer) { print(CorrectMessage) } else { print(WrongMessage) } }
      
      





ここではすべてが単純です。正しい答えをユーザーが入力したものと比較し、情報メッセージを画面に表示するだけです。







したがって、Swiftのクラスの全文は次のようになります。



 private let LevelsPlaceholder = "{levels}" private let LevelNumberPlaceholder = "{levelNumber}" private let LevelPlaceholder = "{level}" private let FirstNumberPlaceholder = "{firstNumber}" private let SecondNumberPlaceholder = "{secondNumber}" private let ThirdNumberPlaceholder = "{thirdNumber}" private let FourthNumberPlaceholder = "{fourthNumber}" private let ExitWordPlaceholder = "{exitWord}" private let TaskPlaceholder = "{taskPlaceholder}" private let StartGreeting = "Hello, let's play. Please select difficulty level:\(LevelsPlaceholder)" private let LevelForSelect = "\n\(LevelNumberPlaceholder) - \(LevelPlaceholder)" private let BaseGreeting = "\(FirstNumberPlaceholder) \(SecondNumberPlaceholder) \(ThirdNumberPlaceholder) \(FourthNumberPlaceholder)" private let TaskMessage = "The next task is \(TaskPlaceholder)\n(enter \"\(ExitWordPlaceholder)\" for exit)" private let CorrectMessage = "Absolutely right.\n" private let WrongMessage = "Sorry, you made a mistake. Try again.\n" private let ErrorLevelMessage = "Sorry, you have selected wrong level. Good bye.\n" class Game8037: Game { private enum Level: String { case easy case normal case hard1 case hard2 func forSelect() -> String { return LevelForSelect.replacingOccurrences(of: LevelPlaceholder, with: self.rawValue) .replacingOccurrences(of: LevelNumberPlaceholder, with: "\(self.hashValue+1)") } } private var level: Level private var result: UInt32 init?() { self.result = 0 let levels = Level.easy.forSelect() + Level.normal.forSelect() + Level.hard1.forSelect() + Level.hard2.forSelect() print(StartGreeting.replacingOccurrences(of: LevelsPlaceholder, with: levels)) let selectedLevel = readLine() ?? "" switch selectedLevel { case "\(Level.easy.hashValue+1)", Level.easy.rawValue: self.level = .easy case "\(Level.normal.hashValue+1)", Level.normal.rawValue: self.level = .normal case "\(Level.hard1.hashValue+1)", Level.hard1.rawValue: self.level = .hard1 case "\(Level.hard2.hashValue+1)", Level.hard2.rawValue: self.level = .hard2 default: print(ErrorLevelMessage) return nil } } private func result(with level: Level, and randomizer: Randomizer) -> UInt32 { let result: UInt32 switch level { case .easy: result = randomizer.firstNumber + randomizer.secondNumber + randomizer.thirdNumber + randomizer.fourthNumber case .normal: result = randomizer.firstNumber*10 + randomizer.secondNumber + randomizer.thirdNumber*10 + randomizer.fourthNumber case .hard1: let firstNumber = (randomizer.firstNumber == 0) ? 1 : randomizer.firstNumber let secondNumber = (randomizer.secondNumber == 0) ? 1 : randomizer.secondNumber let thirdNumber = (randomizer.thirdNumber == 0) ? 1 : randomizer.thirdNumber let fourthNumber = (randomizer.fourthNumber == 0) ? 1 : randomizer.fourthNumber result = firstNumber * secondNumber * thirdNumber * fourthNumber case .hard2: result = (randomizer.firstNumber*10 + randomizer.secondNumber) * (randomizer.thirdNumber*10 + randomizer.fourthNumber) } return result } // MARK: - Game func greet(with exitWord: String) { let randomizer = Randomizer() self.result = self.result(with: self.level, and: randomizer) let task = BaseGreeting.replacingOccurrences(of: FirstNumberPlaceholder, with: "\(randomizer.firstNumber)") .replacingOccurrences(of: SecondNumberPlaceholder, with: "\(randomizer.secondNumber)") .replacingOccurrences(of: ThirdNumberPlaceholder, with: "\(randomizer.thirdNumber)") .replacingOccurrences(of: FourthNumberPlaceholder, with: "\(randomizer.fourthNumber)") print(TaskMessage.replacingOccurrences(of: TaskPlaceholder, with: task) .replacingOccurrences(of: ExitWordPlaceholder, with: exitWord)) } func check(userAnswer: String) { if self.result == UInt32(userAnswer) { print(CorrectMessage) } else { print(WrongMessage) } } }
      
      





Objective-Cの同じクラスの実装:



 //   Game8037.h @interface Game8037 : NSObject <Game> @end //   GameStart.m const NSString *EasyLevelNumber = @"1"; const NSString *NormalLevelNumber = @"2"; const NSString *Hard1LevelNumber = @"3"; const NSString *Hard2LevelNumber = @"4"; const NSString *EasyLevelName = @"easy"; const NSString *NormalLevelName = @"normal"; const NSString *Hard1LevelName = @"hard1"; const NSString *Hard2LevelName = @"hard2"; const NSString *StartGreeting = @"Hello, let's play. Please select difficulty level:%@"; const NSString *LevelForSelect = @"\n%@ - %@"; const NSString *BaseGreeting = @"%i %i %i %i"; const NSString *TaskMessage = @"The next task is %@\n(enter \"%@\" for exit)"; const NSString *CorrectMessage = @"Absolutely right.\n"; const NSString *WrongMessage = @"Sorry, you made a mistake. Try again.\n"; const NSString *ErrorLevelMessage = @"Sorry, you have selected wrong level. Good bye.\n"; typedef enum { LevelEasy, LevelNormal, LevelHard1, LevelHard2 } Level; @interface Game8037() @property (assign, nonatomic) Level level; @property (assign, nonatomic) NSInteger result; @end @implementation Game8037 - (instancetype)init { self = [super init]; if (self) { self.result = 0; NSString *levels = [NSString stringWithFormat:@"%@%@%@%@", [self levelForSelect:LevelEasy], [self levelForSelect:LevelNormal], [self levelForSelect:LevelHard1], [self levelForSelect:LevelHard2]]; NSLog(StartGreeting, levels); NSString *selectedLevel = [self readLine]; if ([selectedLevel isEqualToString:EasyLevelNumber] || [selectedLevel isEqualToString:EasyLevelName]) { self.level = LevelEasy; } else if ([selectedLevel isEqualToString:NormalLevelNumber] || [selectedLevel isEqualToString:NormalLevelName]) { self.level = LevelNormal; } else if ([selectedLevel isEqualToString:Hard1LevelNumber] || [selectedLevel isEqualToString:Hard1LevelName]) { self.level = LevelHard1; } else if ([selectedLevel isEqualToString:Hard2LevelNumber] || [selectedLevel isEqualToString:Hard2LevelName]) { self.level = LevelHard2; } else { NSLog(@"%@", ErrorLevelMessage); return nil; } } return self; } - (NSString *)levelForSelect:(Level)level { NSString *levelNumber; NSString *levelName; switch (level) { case LevelEasy: levelNumber = EasyLevelNumber; levelName = EasyLevelName; break; case LevelNormal: levelNumber = NormalLevelNumber; levelName = NormalLevelName; break; case LevelHard1: levelNumber = Hard1LevelNumber; levelName = Hard1LevelName; break; case LevelHard2: levelNumber = Hard2LevelNumber; levelName = Hard2LevelName; break; } return [NSString stringWithFormat:LevelForSelect, levelNumber, levelName]; } - (NSInteger)resultWithLevel:(Level)level andRandomizer:(Randomizer *)randomizer { NSInteger result = 0; switch (level) { case LevelEasy: result = randomizer.firstNumber + randomizer.secondNumber + randomizer.thirdNumber + randomizer.fourthNumber; break; case LevelNormal: result = randomizer.firstNumber*10 + randomizer.secondNumber + randomizer.thirdNumber*10 + randomizer.fourthNumber; break; case LevelHard1: result = (randomizer.firstNumber == 0 ? 1 : randomizer.firstNumber) * (randomizer.secondNumber == 0 ? 1 : randomizer.secondNumber) * (randomizer.thirdNumber == 0 ? 1 : randomizer.thirdNumber) * (randomizer.fourthNumber == 0 ? 1 : randomizer.fourthNumber); break; case LevelHard2: result = (randomizer.firstNumber*10 + randomizer.secondNumber) * (randomizer.thirdNumber*10 + randomizer.fourthNumber); break; } return result; } - (NSString *)descriptionOfLevel:(Level)level { NSString *result = @""; switch (level) { case LevelEasy: result = EasyLevelName; break; case LevelNormal: result = NormalLevelName; break; case LevelHard1: result = Hard1LevelName; break; case LevelHard2: result = Hard2LevelName; break; } return result; } - (NSString *)readLine { char inputValue; scanf("%s", &inputValue); return [NSString stringWithUTF8String:&inputValue]; } #pragma mark - Game - (void)greetWithExitWord:(NSString *)exitWord { Randomizer *randomizer = [[Randomizer alloc] init]; self.result = [self resultWithLevel:self.level andRandomizer:randomizer]; NSString *task = [NSString stringWithFormat:BaseGreeting, randomizer.firstNumber, randomizer.secondNumber, randomizer.thirdNumber, randomizer.fourthNumber]; NSLog(TaskMessage, task, exitWord); } - (void)checkUserAnswer:(NSString *)userAnswer { if (self.result == [userAnswer integerValue]) { NSLog(@"%@", CorrectMessage); } else { NSLog(@"%@", WrongMessage); } } @end
      
      





Java:



 public class Game8037 implements Game { private static final String EasyLevelNumber = "1"; private static final String NormalLevelNumber = "2"; private static final String Hard1LevelNumber = "3"; private static final String Hard2LevelNumber = "4"; private static final String EasyLevelName = "easy"; private static final String NormalLevelName = "normal"; private static final String Hard1LevelName = "hard1"; private static final String Hard2LevelName = "hard2"; private static final String StartGreeting = "Hello, let's play. Please select difficulty level:%s"; private static final String LevelForSelect = "\n%s - %s"; private static final String BaseGreeting = "%s %s %s %s"; private static final String TaskMessage = "The next task is %s\n(enter \"%s\" for exit)"; private static final String CorrectMessage = "Absolutely right.\n"; private static final String WrongMessage = "Sorry, you made a mistake. Try again.\n"; private static final String ErrorLevelMessage = "Sorry, you have selected wrong level. Good bye.\n"; private enum Level { Easy { public String toString() { return EasyLevelName; } }, Normal { public String toString() { return NormalLevelName; } }, Hard1 { public String toString() { return Hard1LevelName; } }, Hard2 { public String toString() { return Hard2LevelName; } } } private Level level; private int result; private Game8037(Level level) { this.level = level; this.result = 0; } @Nullable public static Game8037 Create() { String levels = String.format("%s%s%s%s", levelForSelect(Level.Easy), levelForSelect(Level.Normal), levelForSelect(Level.Hard1), levelForSelect(Level.Hard2)); System.out.println(String.format(StartGreeting, levels)); Game8037 game8037; String selectedLevel = readLine(); switch (selectedLevel) { case EasyLevelNumber: case EasyLevelName: game8037 = new Game8037(Level.Easy); break; case NormalLevelNumber: case NormalLevelName: game8037 = new Game8037(Level.Normal); break; case Hard1LevelNumber: case Hard1LevelName: game8037 = new Game8037(Level.Hard1); break; case Hard2LevelNumber: case Hard2LevelName: game8037 = new Game8037(Level.Hard2); break; default: game8037 = null; System.out.println(ErrorLevelMessage); break; } return game8037; } private static String levelForSelect(Level level) { String levelNumber = ""; String levelName = ""; switch (level) { case Easy: levelNumber = EasyLevelNumber; levelName = EasyLevelName; break; case Normal: levelNumber = NormalLevelNumber; levelName = NormalLevelName; break; case Hard1: levelNumber = Hard1LevelNumber; levelName = Hard1LevelName; break; case Hard2: levelNumber = Hard2LevelNumber; levelName = Hard2LevelName; break; } return String.format(LevelForSelect, levelNumber, levelName); } private int resultWithLevelAndRandomizer(Level level, Randomizer randomizer) { int result = 0; switch (level) { case Easy: result = randomizer.firstNumber + randomizer.secondNumber + randomizer.thirdNumber + randomizer.fourthNumber; break; case Normal: result = randomizer.firstNumber*10 + randomizer.secondNumber + randomizer.thirdNumber*10 + randomizer.fourthNumber; break; case Hard1: int firstNumber = (randomizer.firstNumber == 0) ? 1 : randomizer.firstNumber; int secondNumber = (randomizer.secondNumber == 0) ? 1 : randomizer.secondNumber; int thirdNumber = (randomizer.thirdNumber == 0) ? 1 : randomizer.thirdNumber; int fourthNumber = (randomizer.fourthNumber == 0) ? 1 : randomizer.fourthNumber; result = firstNumber * secondNumber * thirdNumber * fourthNumber; break; case Hard2: result = (randomizer.firstNumber*10 + randomizer.secondNumber) * (randomizer.thirdNumber*10 + randomizer.fourthNumber); break; } return result; } static private String readLine() { java.util.Scanner scanner = new java.util.Scanner(System.in); return scanner.next(); } @Override public void greet(String exitWord) { Randomizer randomizer = new Randomizer(); result = resultWithLevelAndRandomizer(level, randomizer); String task = String.format(BaseGreeting, randomizer.firstNumber, randomizer.secondNumber, randomizer.thirdNumber, randomizer.fourthNumber); System.out.println(String.format(TaskMessage, task, exitWord)); } @Override public void checkUserAnswer(String userAnswer) { int answer; try { answer = Integer.parseInt(userAnswer); } catch (Exception e) { System.out.println(WrongMessage); return; } if (result == answer) { System.out.println(CorrectMessage); } else { System.out.println(WrongMessage); } } }
      
      





C#:



 public class Game8037 : IGame { const string EasyLevelNumber = "1"; const string NormalLevelNumber = "2"; const string Hard1LevelNumber = "3"; const string Hard2LevelNumber = "4"; const string EasyLevelName = "easy"; const string NormalLevelName = "normal"; const string Hard1LevelName = "hard1"; const string Hard2LevelName = "hard2"; const string StartGreeting = "Hello, let's play. Please select difficulty level:{0}"; const string LevelForSelect = "\n{0} - {1}"; const string BaseGreeting = "{0} {1} {2} {3}"; const string TaskMessage = "The next task is {0}\n(enter \"{1}\" for exit)"; const string CorrectMessage = "Absolutely right.\n"; const string WrongMessage = "Sorry, you made a mistake. Try again.\n"; const string ErrorLevelMessage = "Sorry, you have selected wrong level. Good bye.\n"; enum Level { Easy, Normal, Hard1, Hard2 }; Level level; int result; private Game8037(Level level) { this.level = level; result = 0; } public static Game8037 Create() { string levels = string.Format("{0}{1}{2}{3}", levelForSelect(Level.Easy), levelForSelect(Level.Normal), levelForSelect(Level.Hard1), levelForSelect(Level.Hard2)); Console.WriteLine(string.Format(StartGreeting, levels)); Game8037 game8037; string selectedLevel = Console.ReadLine(); switch (selectedLevel) { case EasyLevelNumber: case EasyLevelName: game8037 = new Game8037(Level.Easy); break; case NormalLevelNumber: case NormalLevelName: game8037 = new Game8037(Level.Normal); break; case Hard1LevelNumber: case Hard1LevelName: game8037 = new Game8037(Level.Hard1); break; case Hard2LevelNumber: case Hard2LevelName: game8037 = new Game8037(Level.Hard2); break; default: game8037 = null; Console.WriteLine(ErrorLevelMessage); break; } return game8037; } static string levelForSelect(Level level) { string levelNumber = ""; string levelName = ""; switch (level) { case Level.Easy: levelNumber = EasyLevelNumber; levelName = EasyLevelName; break; case Level.Normal: levelNumber = NormalLevelNumber; levelName = NormalLevelName; break; case Level.Hard1: levelNumber = Hard1LevelNumber; levelName = Hard1LevelName; break; case Level.Hard2: levelNumber = Hard2LevelNumber; levelName = Hard2LevelName; break; } return string.Format(LevelForSelect, levelNumber, levelName); } int resultWithLevelAndRandomizer(Level level, Randomizer randomizer) { int result = 0; switch (level) { case Level.Easy: result = randomizer.firstNumber + randomizer.secondNumber + randomizer.thirdNumber + randomizer.fourthNumber; break; case Level.Normal: result = randomizer.firstNumber * 10 + randomizer.secondNumber + randomizer.thirdNumber * 10 + randomizer.fourthNumber; break; case Level.Hard1: int firstNumber = (randomizer.firstNumber == 0) ? 1 : randomizer.firstNumber; int secondNumber = (randomizer.secondNumber == 0) ? 1 : randomizer.secondNumber; int thirdNumber = (randomizer.thirdNumber == 0) ? 1 : randomizer.thirdNumber; int fourthNumber = (randomizer.fourthNumber == 0) ? 1 : randomizer.fourthNumber; result = firstNumber* secondNumber * thirdNumber * fourthNumber; break; case Level.Hard2: result = (randomizer.firstNumber * 10 + randomizer.secondNumber) * (randomizer.thirdNumber * 10 + randomizer.fourthNumber); break; } return result; } string descriptionOfLevel(Level level) { string result = ""; switch (level) { case Level.Easy: result = "easy"; break; case Level.Normal: result = "normal"; break; case Level.Hard1: result = "hard1"; break; case Level.Hard2: result = "hard2"; break; } return result; } public void greet(string exitWord) { Randomizer randomizer = new Randomizer(); result = resultWithLevelAndRandomizer(level, randomizer); string task = string.Format(BaseGreeting, randomizer.firstNumber, randomizer.secondNumber, randomizer.thirdNumber, randomizer.fourthNumber); Console.WriteLine(string.Format(TaskMessage, task, exitWord)); } public void checkUserAnswer(string userAnswer) { int answer; try { answer = int.Parse(userAnswer); } catch { Console.WriteLine(WrongMessage); return; } if (result == answer) { Console.WriteLine(CorrectMessage); } else { Console.WriteLine(WrongMessage); } } }
      
      





JavaとC#では、 Game8037



クラスのオブジェクトを作成するときにGame8037



ます。 事実、失敗する初期化子はないため、静的メソッドを使用してオブジェクトを作成しました。







ゲームの作成をGameStart



クラスに追加し、 greet(...)



およびcheck(...)



メソッドを使用するだけです。 GameStart



クラスは次のようになります。







スイフト:



 class GameStart { private var exitWord: String private var game: Game init?(with exitWord: String) { self.exitWord = exitWord if let game = Game8037() { self.game = game } else { return nil } } func startGame() { var inputWord: String repeat { self.game.greet(with: self.exitWord) inputWord = readLine() ?? "" } while check(inputWord: inputWord) } private func check(inputWord: String) -> Bool { let isExitWord = (inputWord == self.exitWord) if isExitWord { print(GoodByeMessage) } else { self.game.check(userAnswer: inputWord) } return !isExitWord } }
      
      





Objective-C:



 @interface GameStart() @property (strong, nonatomic) NSString *exitWord; @property (strong, nonatomic) id<Game> game; @end @implementation GameStart - (instancetype)initWithExitWord:(NSString *)exitWord { self = [super init]; if (self) { self.exitWord = exitWord; self.game = [[Game8037 alloc] init]; } return self; } - (void)startGame { if (self.game) { NSString *inputWord; do { [self.game greetWithExitWord:self.exitWord]; inputWord = [self readLine]; } while ([self checkInputWord:inputWord]); } } - (BOOL)checkInputWord:(NSString *)inputWord { BOOL isExitWord = [inputWord isEqualToString:self.exitWord]; if (isExitWord) { NSLog(@"%@", GoodByeMessage); } else { [self.game checkUserAnswer:inputWord]; } return !isExitWord; } - (NSString *)readLine { char inputValue; scanf("%s", &inputValue); return [NSString stringWithUTF8String:&inputValue]; } @end
      
      





Java:



 public class GameStart { private static final String GreetingMessage = "Please enter your answer (enter \"%s\" for exit):"; private static final String InputAcceptMessage = "You entered \"%s\".\n"; private static final String GoodByeMessage = "Good bye.\n"; private String exitWord; private Game game; public GameStart(String exitWord) { this.exitWord = exitWord; this.game = Game8037.Create(); } void startGame() { if (game != null) { String inputWord; do { game.greet(exitWord); inputWord = readLine(); } while (checkInputWord(inputWord)); } } private boolean checkInputWord(String inputWord) { boolean isExitWord = inputWord.equals(exitWord); if (isExitWord) { System.out.println(GoodByeMessage); } else { game.checkUserAnswer(inputWord); } return !isExitWord; } private String readLine() { java.util.Scanner scanner = new java.util.Scanner(System.in); return scanner.next(); } }
      
      





C#:



 public class GameStart { const string GreetingMessage = "Please enter your answer (enter \"{0}\" for exit):"; const string InputAcceptMessage = "You entered \"{0}\".\n"; const string GoodByeMessage = "Good bye.\n"; readonly string exitWord; readonly IGame iGame; public GameStart(string exitWord) { this.exitWord = exitWord; iGame = Game8037.Create(); } public void startGame() { if (iGame != null) { string inputWord; do { iGame.greet(exitWord); inputWord = Console.ReadLine(); } while (checkInputWord(inputWord)); } } bool checkInputWord(string inputWord) { bool isExitWord = inputWord.Equals(exitWord); if (isExitWord) { Console.WriteLine(GoodByeMessage); } else { iGame.checkUserAnswer(inputWord); } return !isExitWord; } }
      
      





ご覧のとおり、 Game



タイプのGame



プロパティ(またはC#のIGame



)を追加しました。 また、 startGame()



メソッドでself.game.greet(...)



を呼び出し、 check(...)



メソッドでself.game.check(...)



を呼び出しself.game.check(...)



。 したがって、将来的にはGame8037



代わりにGame



プロトコルを実装する他のゲームGame8037



置き換えることがGame8037



なります。







おわりに



ここでアプリケーションの作業が終了します 。これらすべてのソースコードはこちらにあります 。 ご関心、コメント、批判、アドバイス、提案をありがとうございました。 :)








All Articles