FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

配列とループ文を使った条件分岐

配列とループ文を使った条件分岐を書いて
Qiitaに投稿しました

ソースコードを見る
スポンサーサイト

1次元配列を2次元配列のように扱うクラス

//2次元配列が使いづらいので、
//こういうコード書いた

//1次元配列を2次元配列のように扱うクラス
public sealed class Array2D {
//元となる1次元配列
public T[] BaseArray { get; }
//横方向の要素数
public int LengthX { get; }
//縦方向の要素数
public int LengthY { get; }

//コンストラクタで2つの要素数を指定
public Array2D(int lenX, int lenY) {
//要素数を指定
LengthX = lenX; //横方向を指定
LengthY = lenY; //縦方向を指定
//1次元配列の作成
BaseArray = new T[LengthX * LengthY];
}

//2次元配列のようにアクセスできるようにする
public T this[int indexX, int indexY] {
get => BaseArray[GetReadIndex(indexX, indexY)];
set => BaseArray[GetReadIndex(indexX, indexY)] = value;
}

//1次元配列用の番地を取得
int GetReadIndex(int indexX, int indexY) {
//1次元配列用の番地は
//
// 横方向の番地 + 縦方向の番地 × 横方向の要素数
//
//で求まる
return indexX + indexY * LengthX;
}
}

c# 並べ替え処理を実装する

using System;
using System.IO;
using System.Linq;

namespace Project1
{
static class Program
{
[STAThread]
static void Main()
{
var ary = new int[10];

//数値の代入
ary[0] = 3;
ary[1] = 6;
ary[2] = 4;
ary[3] = 7;
ary[4] = 2;
ary[5] = 9;
ary[6] = 5;
ary[7] = 0;
ary[8] = 8;
ary[9] = 1;

//並べ替えの開始
Program.Sort(ary);

Console.WriteLine("並べ替えの結果");
for (var i = 0; i < ary.Length; i++)
{
Console.WriteLine(i + "回目 " + ary[i]);
}
}

//数値の並べ替え
static void Sort(int[] ary)
{
for (var a = 0; a < ary.Length; a++)
{
for (var i = a; i < ary.Length; i++)
{
if (ary[a] > ary[i])
{
var num = ary[a];

ary[a] = ary[i];
ary[i] = num;
}
}
}
}
}
}

c# 配列の並べ替え

using System;
using System.IO;
using System.Linq;

namespace Project1
{
static class Program
{
[STAThread]
static void Main()
{
var ary = new Test[5];

//配列の値を代入(3以外)
ary[0] = new Test(0);
ary[1] = new Test(4);
ary[2] = new Test(1);
ary[4] = new Test(2);

//配列の並べ替え
Array.Sort(ary, (a, s) =>
{
//無効な値なら一番最後に移動させる
if (a == null) return 1;
if (s == null) return -1;

//並べ替え
return a.Num - s.Num;
});


Console.WriteLine("並べ替えの結果");
for (var i = 0; i < ary.Length; i++)
{
if (ary[i] != null)
{
Console.WriteLine(i + "回目 " + ary[i].Num);
}
else
{
Console.WriteLine(i + "回目 null");
}
}
}
}

class Test
{
internal int Num;

internal Test(int num) { this.Num = num; }
}
}

【c#】 ランダムで部屋を作らないマップ

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using SD = System.Drawing;

namespace Project1
{
internal static class Program
{
[STAThread]
private static void Main()
{
var window = new Window();
var canvas = new Canvas();
var image = new MapViewer();
var map = new MapCreator();

canvas.Children.Add(image);
canvas.Width = 500;
canvas.Height = 500;

window.MouseDown += (sender, e) =>
{
//クリックするとマップ生成
map.MapInitStart();
map.MapDraw(image);
};

window.ResizeMode = ResizeMode.CanMinimize;
window.SizeToContent = SizeToContent.WidthAndHeight;
window.Content = canvas;
window.ShowDialog();
}
}
///
/// マップ生成用
///
internal sealed class MapCreator
{
///
/// 壁
///
private const int wall = -3;
///
/// 通路
///
private const int passage = -2;
///
/// 部屋の出口
///
private const int exit = -1;
///
/// 部屋
///
private const int room = 0;

internal readonly Random Random = new Random();

///
/// マップ配列
///
internal readonly int[,] Map = new int[50, 50];
///
/// エリア管理
///

internal SD.Rectangle[] AreaArray
{
get;
private set;
}
///
/// 部屋管理
///

internal SD.Rectangle[] RoomArray
{
get;
private set;
}

internal MapCreator()
{

}

///
/// マップ生成開始
///
///
internal void MapInitStart()
{
this.MapWallSet();
this.AreaAndRoomArrayInit();
this.MapAreaSet();
this.RoomPassegeSet();
}

///
/// 一旦、マップの全てを壁にする
///
private void MapWallSet()
{
var map = this.Map;

for (var i = 0; i < map.GetLength(0); i++)
{
for (var j = 0; j < map.GetLength(1); j++)
{
map[i, j] = MapCreator.wall;
}
}
}

///
/// マップにエリアを指定
///
private void MapAreaSet()
{
var map = this.Map;
var random = this.Random;


//どこに部屋を作らないかを決める
var noRoom = this.Random.Next(0, this.RoomArray.Length);


for (var i = 0; i < this.AreaArray.Length; i++)
{
var areaRect = this.AreaArray[i];

//部屋の位置を決める
var roomX = areaRect.X + random.Next(3, 12);
var roomY = areaRect.Y + random.Next(3, 12);
//部屋の大きさを決める
var roomWidth = random.Next(6, 12);
var roomHeight = random.Next(6, 12);


//指定されたエリアに部屋を作らない
if (i == noRoom)
{
//部屋を造らない
this.RoomArray[i] = new SD.Rectangle(roomX, roomY, 0, 0);
}
//それ以外のエリアに部屋を作る
else
{
//部屋を作る
this.CreateRoom(i, roomX, roomY, roomWidth, roomHeight);
}

}
}
///
/// エリアと部屋配列の初期化
///
private void AreaAndRoomArrayInit()
{
//エリアの数
const int areaCount = 4;

var map = this.Map;
var random = this.Random;

this.AreaArray = new SD.Rectangle[areaCount];
this.RoomArray = new SD.Rectangle[areaCount];

//エリアの大きさを決める
this.AreaArray[0] = new SD.Rectangle(1, 1, 24, 24);
this.AreaArray[1] = new SD.Rectangle(25, 1, 24, 24);
this.AreaArray[2] = new SD.Rectangle(1, 25, 24, 24);
this.AreaArray[3] = new SD.Rectangle(25, 25, 24, 24);
}
///
/// 部屋を作る
///
private void CreateRoom(int roomNo, int x, int y, int width, int height)
{
//部屋サイズを決める
this.RoomArray[roomNo] = new SD.Rectangle(x, y, width, height);

//部屋を造る
for (var i = 0; i < width; i++)
{
for (var j = 0; j < height; j++)
{
//部屋を造る
this.Map[x + i, y + j] = MapCreator.room;
}
}
}

///
/// 通路の作成
///
private void RoomPassegeSet()
{
var room0 = 0;
var room1 = 1;
var room2 = 2;
var room3 = 3;

//部屋と部屋の間に通路を作る
this.RoomVerticalPassageSet(room0, room3);
this.RoomVerticalPassageSet(room1, room2);
}
///
/// 部屋2つを通路を縦線でつなぐ
///
private void RoomVerticalPassageSet(int roomNum0, int roomNum1)
{
var map = this.Map;

var room0 = this.RoomArray[roomNum0];
var room1 = this.RoomArray[roomNum1];

var area0 = this.AreaArray[roomNum0];
var area1 = this.AreaArray[roomNum1];

var exit0 = this.Random.Next(room0.X, room0.Right);
var exit1 = this.Random.Next(room1.X, room1.Right);

for (var i = 0; i < area0.Bottom - room0.Bottom; i++)
{
map[exit0, room0.Bottom + i] = MapCreator.passage;
}

for (var i = 0; i < room1.Top - area1.Top; i++)
{
map[exit1, room1.Top - 1 - i] = MapCreator.passage;
}
if (room0.Size != SD.Size.Empty) map[exit0, room0.Bottom] = MapCreator.exit;
if (room1.Size != SD.Size.Empty) map[exit1, room1.Top - 1] = MapCreator.exit;

if (exit0 > exit1)
{
for (var i = 0; i < exit0 - exit1 + 1; i++)
{
map[exit1 + i, area0.Height] = MapCreator.passage;
}
}
else
{
for (var i = 0; i < exit1 - exit0 + 1; i++)
{
map[exit0 + i, area1.Height] = MapCreator.passage;
}
}
}
///
/// 部屋2つを通路を横線でつなぐ
///
private void RoomHorizonPassageSet(int roomNum0, int roomNum1)
{
var map = this.Map;

var room0 = this.RoomArray[roomNum0];
var room1 = this.RoomArray[roomNum1];

var area0 = this.AreaArray[roomNum0];
var area1 = this.AreaArray[roomNum1];

var exit0 = this.Random.Next(room0.Y, room0.Bottom);
var exit1 = this.Random.Next(room1.Y, room1.Bottom);

for (var i = 0; i < area0.Right - room0.Right; i++)
{
map[room0.Right + i, exit0] = MapCreator.passage;
}

for (var i = 0; i < room1.Left - area1.Left; i++)
{
map[room1.Left - 1 - i, exit1] = MapCreator.passage;
}
if (room0.Size != SD.Size.Empty) map[room0.Right, exit0] = MapCreator.exit;
if (room1.Size != SD.Size.Empty) map[room1.Left - 1, exit1] = MapCreator.exit;

if (exit0 > exit1)
{
for (var i = 0; i < exit0 - exit1 + 1; i++)
{
map[area1.Width, exit1 + i] = MapCreator.passage;
}
}
else
{
for (var i = 0; i < exit1 - exit0 + 1; i++)
{
map[area0.Width, exit0 + i] = MapCreator.passage;
}
}
}

///
/// マップを描画
///
internal void MapDraw(MapViewer viewer)
{
using (DrawingContext dc = viewer.Drawing.Open())
{
var map = this.Map;

for (var i = 0; i < map.GetLength(0); i++)
{
for (var j = 0; j < map.GetLength(1); j++)
{
const int size = 7;
const int offset = 10;

var brush = default(Brush);

switch (map[i, j])
{
case MapCreator.wall: brush = Brushes.Black; break;
case MapCreator.passage: brush = Brushes.Aqua; break;

case MapCreator.room: brush = Brushes.Green; break;
case MapCreator.exit: brush = Brushes.Yellow; break;
}
dc.DrawRectangle(brush, null, new Rect(i * size + offset, j * size + offset, size, size));
}
}
}
}
}

internal sealed class MapViewer : FrameworkElement
{
internal readonly DrawingGroup Drawing = new DrawingGroup();

internal MapViewer()
{

}

protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawDrawing(this.Drawing);
}
}
}
プロフィール

みにおん

Author:みにおん
c#でゲームを作る人です
web小説なども書いています

低学歴で馬鹿なのパート従業員
ですが、よろしく

相互リンク・ブロとも募集中です
コメントなどご自由にどうぞ

ホームページを見る
Twitter(個人ページ)
PIXIV(個人ページ)

○自作ゲーム一覧
ふりーむ
フリーゲーム夢幻
100%ふりげストア

・web小説
最後の時の夢

最新記事
最新コメント
月別アーカイブ
カテゴリ
ブロとも一覧
検索フォーム
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
リンク
アクセスランキング
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。