開発環境
- OS: Windows 10 Pro
- IDE(統合開発環境): Visual Studio Community 2017
Head First C# ―頭とからだで覚えるC#の基本 (Andrew Stellman (著)、Jennifer Greene (著)、佐藤 嘉一 (監修, 監修)、木下 哲也 (翻訳)、オライリージャパン)の6章(インタフェースと抽象クラス - クラスに約束を守らせる)、エクササイズ(p. 268)を取り組んでみる。
コード
Form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp19 { public partial class Form1 : Form { Location currentLocation; RoomWithDoor livingRoom; OutsideWithDoor frontYard; Opponent opponent; int moves = 0; public Form1() { InitializeComponent(); CreateObjects(); opponent = new Opponent(frontYard); ResetGame(false); } private void CreateObjects() { livingRoom = new RoomWithDoor("リビングルーム", "アンティークカーペット", "真ちゅうのノブを持つオーク材のドア", "クローゼットの中"); Room diningRoom = new Room("ダイニングルーム", "クリスタルのシャンデリア"); RoomWithDoor kitchen = new RoomWithDoor("台所", "ステンレス製の電化製品", "網戸", "棚の中"); Room stairs = new Room("階段", "木の手すり"); RoomWithHidingPlace corridor = new RoomWithHidingPlace("2階の廊下", "犬の写真", "クローゼット"); RoomWithHidingPlace masterBedroom = new RoomWithHidingPlace("主寝室", "大きなベッド", "ベッドの下"); RoomWithHidingPlace secondBedroom = new RoomWithHidingPlace("第2寝室", "小さなベッド", "ベッドの下"); RoomWithHidingPlace bathroom = new RoomWithHidingPlace("浴室", "洗面台とトイレ", "シャワールーム"); frontYard = new OutsideWithDoor("前庭", false, "真ちゅうのノブを持つオーク材のドア"); OutsideWithHidingPlace garden = new OutsideWithHidingPlace("庭園", false, "小屋"); OutsideWithDoor backYard = new OutsideWithDoor("裏庭", true, "網戸"); OutsideWithHidingPlace driveway = new OutsideWithHidingPlace("ドライブウェイ", false, "車庫"); livingRoom.exits = new Location[] { diningRoom, stairs }; diningRoom.exits = new Location[] { livingRoom, kitchen }; kitchen.exits = new Location[] { diningRoom }; stairs.exits = new Location[] { livingRoom, corridor }; corridor.exits = new Location[] { stairs, masterBedroom, secondBedroom, bathroom }; masterBedroom.exits = new Location[] { corridor }; secondBedroom.exits = new Location[] { corridor }; bathroom.exits = new Location[] { corridor }; frontYard.exits = new Location[] { backYard, garden, driveway }; garden.exits = new Location[] { frontYard, backYard }; backYard.exits = new Location[] { frontYard, garden ,driveway}; driveway.exits = new Location[] { frontYard, backYard }; livingRoom.DoorLocation = frontYard; frontYard.DoorLocation = livingRoom; kitchen.DoorLocation = backYard; backYard.DoorLocation = kitchen; } private void MoveToANewLocation(Location loc) { moves++; currentLocation = loc; RedrawForm(); } private void goHere_Click(object sender, EventArgs e) { MoveToANewLocation(currentLocation.exits[exits.SelectedIndex]); } private void goThroughTheDoor_Click(object sender, EventArgs e) { IHasExteriorDoor door = currentLocation as IHasExteriorDoor; MoveToANewLocation(door.DoorLocation); } private void check_Click(object sender, EventArgs e) { if (opponent.Check(currentLocation)) { ResetGame(true); } else { RedrawForm(); } } private void hide_Click(object sender, EventArgs e) { hide.Visible = false; for (int i = 1; i <= 10; i++) { description.Text += i + "..."; opponent.Move(); Application.DoEvents(); System.Threading.Thread.Sleep(200); } description.Text = "もういいかい?いくよ"; Application.DoEvents(); System.Threading.Thread.Sleep(500); goHere.Visible = true; exits.Visible = true; MoveToANewLocation(livingRoom); } public void RedrawForm() { exits.Items.Clear(); foreach (Location item in currentLocation.exits) { exits.Items.Add(item.Name); } exits.SelectedIndex = 0; description.Text = currentLocation.Description; IHidingPlace place = currentLocation as IHidingPlace; if (place != null) { check.Text = place.HidingPlace + "をチェックせよ"; check.Visible = true; } else { check.Visible = false; } if (currentLocation is IHasExteriorDoor) { goThroughTheDoor.Visible = true; } else { goThroughTheDoor.Visible = false; } } public void ResetGame(bool found) { if (found) { MessageBox.Show("私は" + moves + "回で見つけられた!"); description.Text = ""; } moves = 0; goHere.Visible = false; exits.Visible = false; goThroughTheDoor.Visible = false; check.Visible = false; hide.Visible = true; } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp19 { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } interface IHasExteriorDoor { string DoorDescription { get; } Location DoorLocation { get; set; } } interface IHidingPlace { string HidingPlace { get; } } public class Room : Location { private string decoration; public Room(string name, string decoration) : base(name) { this.decoration = decoration; } public string Deoraction { get { return decoration; } } public override string Description { get { return base.Description + " " + decoration + "がみえます。"; } } } public class Outside : Location { private bool hot; public Outside(string name, bool hot) : base(name) { this.hot = hot; } public bool Hot { get { return hot; } } public override string Description { get { if (hot) { return base.Description + " ここはとても暑い。"; } return base.Description; } } } public class OutsideWithHidingPlace : Outside, IHidingPlace { private string hidingPlace; public OutsideWithHidingPlace(string name, bool hot,string hidingPlace) : base(name, hot) { this.hidingPlace = hidingPlace; } public string HidingPlace { get { return hidingPlace; } } } public class RoomWithHidingPlace : Room, IHidingPlace { private string hidingPlace; public RoomWithHidingPlace(string name, string decoration, string hidingPlace) : base(name, decoration) { this.hidingPlace = hidingPlace; } public string HidingPlace { get { return hidingPlace; } } } public class OutsideWithDoor : Outside, IHasExteriorDoor { private string doorDescription; private Location doorLocation; public OutsideWithDoor(string name, bool hot, string doorDescription) : base(name, hot) { this.doorDescription = doorDescription; } public string DoorDescription { get { return doorDescription; } } public Location DoorLocation { get { return doorLocation; } set { doorLocation = value; } } } public class RoomWithDoor : RoomWithHidingPlace, IHasExteriorDoor { private string doorDescription; private Location doorLocation; public RoomWithDoor(string name, string description, string doorDescription, string hidingPlace) : base(name, description, hidingPlace) { this.doorDescription = doorDescription; } public string DoorDescription { get { return doorDescription; } } public Location DoorLocation { get { return doorLocation; } set { doorLocation = value; } } } public class Opponent { private Location myLocation; private Random random; public Opponent(Location myLocation) { this.myLocation = myLocation; this.random = new Random(); } public void Move() { IHasExteriorDoor loc = myLocation as IHasExteriorDoor; if (loc != null) { if (random.Next(2) == 1) { myLocation = loc.DoorLocation; } } while (true) { int i = random.Next(myLocation.exits.Length); myLocation = myLocation.exits[i]; if (myLocation is IHidingPlace) { break; } } } public bool Check(Location loc) { if (loc == myLocation) { return true; } return false; } } }
0 コメント:
コメントを投稿