開発環境
- 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 コメント:
コメントを投稿