🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

1927閲覧

【C#】 Windows Formsで2Dパーリンノイズでマイクラ風の2Dマップを生成したい。

JumpActionGames

総合スコア29

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

1グッド

0クリップ

投稿2019/12/14 01:27

#【C#】 Windows Formsで2Dパーリンノイズでマイクラ風の2Dマップを生成したい。
C#でゲームを作成しています。
そのゲームのマップをパーリンノイズで自動生成したいです。
ですが、 .Netではパーリンノイズが生成できません。
Unityは使いたくないです。
マップの形式はint配列で、0が空気で1がブロックです
例えば:

C#

1 int[,] Map = 2 { 3 { 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, 4 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4}, 5 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 6 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 7 { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 8 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 9 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 10 { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 11 { 1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 12 };

こういう感じです。
これをパーリンノイズでランダム生成したいです。

ツールなど

IDE:VisualStidop 2019
フレームワーク:.Net Frameworks
OS:Windows 10
アプリの種類:WindowsForm

x_x👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JumpActionGames

2019/12/14 02:58

2Dのマイクラみたいな地形を作りたいです。
guest

回答1

0

ベストアンサー

NuGetからSimplexNoiseをインストールします。
NuGet Gallery | SimplexNoise 2.0.0
WardBenjamin/SimplexNoise

のっけから「Perlin noise」ではありませんが、改良型で計算量が少ないそうなのでいいんじゃないでしょうか。

  • 1ファイルでの実装でシンプルだった
  • READMEに配列で返ってくる例が載っていた

ってだけで選んだので深い理由はありません(そもそも計算の意味も分かっていません^^;

マイクラ風の2Dマップ

というのがどういう状態かピンと来なかったので、パラメータをいじれるようにしました。
こんな感じでいいのでしょうか。

穴が開くのをごまかすためブロックより下はすべて埋めました^^;

cs:Form1.cs

1using System; 2using System.Drawing; 3using System.Windows.Forms; 4using SimplexNoise; 5 6namespace Questions229408 7{ 8 public partial class Form1 : Form 9 { 10 private const int LENGTH = 9; 11 private const int WIDTH = 49; 12 private const int SIZE = 10; 13 14 private int[,] Map; 15 16 public Form1() 17 { 18 InitializeComponent(); 19 Generate(); 20 } 21 22 private void Panel1_Paint(object sender, PaintEventArgs e) 23 { 24 for(var i = 0; i < LENGTH; i++) 25 { 26 for(var j = 0; j < WIDTH; j++) 27 { 28 if(Map[i, j] == 0) continue; 29 30 e.Graphics.FillRectangle(Brushes.Blue, j * SIZE, i * SIZE, SIZE, SIZE); 31 } 32 } 33 } 34 35 private void ValueChanged(object sender, EventArgs e) 36 { 37 Generate(); 38 39 label4.Text = trackBar1.Value.ToString(); 40 label5.Text = (trackBar2.Value / 1000f).ToString(); 41 panel1.Invalidate(); 42 } 43 44 private void Generate() 45 { 46 Noise.Seed = (int)numericUpDown1.Value; // シード値 0~int.MaxValue 47 var level = trackBar1.Value; // 起伏 1~9 48 var scale = trackBar2.Value / 1000f; // スケール 0.001~0.5 49 50 var noiseValues = Noise.Calc1D(WIDTH, scale); 51 52 Map = new int[LENGTH, WIDTH]; 53 for(var j = 0; j < WIDTH; j++) 54 { 55 var v = noiseValues[j]; 56 var i = (int)(v / 256 * level); 57 var ii = LENGTH - 1 - i; // 上下反転 0を8 8を0に 58 59 // 値より下を全て地面に(穴あき防止) 60 for(var iii = LENGTH - 1; ii <= iii; iii--) 61 { 62 Map[iii, j] = 1; 63 } 64 } 65 } 66 } 67}

cs:Form1.Designer.cs

1namespace Questions229408 2{ 3 partial class Form1 4 { 5 /// <summary> 6 /// 必要なデザイナー変数です。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 使用中のリソースをすべてクリーンアップします。 12 /// </summary> 13 /// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if(disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region Windows フォーム デザイナーで生成されたコード 24 25 /// <summary> 26 /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 27 /// コード エディターで変更しないでください。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.panel1 = new System.Windows.Forms.Panel(); 32 this.trackBar1 = new System.Windows.Forms.TrackBar(); 33 this.trackBar2 = new System.Windows.Forms.TrackBar(); 34 this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); 35 this.label1 = new System.Windows.Forms.Label(); 36 this.label2 = new System.Windows.Forms.Label(); 37 this.label3 = new System.Windows.Forms.Label(); 38 this.label4 = new System.Windows.Forms.Label(); 39 this.label5 = new System.Windows.Forms.Label(); 40 ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); 41 ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit(); 42 ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); 43 this.SuspendLayout(); 44 // 45 // panel1 46 // 47 this.panel1.Location = new System.Drawing.Point(12, 12); 48 this.panel1.Name = "panel1"; 49 this.panel1.Size = new System.Drawing.Size(490, 90); 50 this.panel1.TabIndex = 0; 51 this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.Panel1_Paint); 52 // 53 // trackBar1 54 // 55 this.trackBar1.Location = new System.Drawing.Point(14, 188); 56 this.trackBar1.Maximum = 9; 57 this.trackBar1.Minimum = 1; 58 this.trackBar1.Name = "trackBar1"; 59 this.trackBar1.Size = new System.Drawing.Size(200, 45); 60 this.trackBar1.TabIndex = 1; 61 this.trackBar1.TickFrequency = 8; 62 this.trackBar1.Value = 9; 63 this.trackBar1.ValueChanged += new System.EventHandler(this.ValueChanged); 64 // 65 // trackBar2 66 // 67 this.trackBar2.Location = new System.Drawing.Point(232, 188); 68 this.trackBar2.Maximum = 500; 69 this.trackBar2.Minimum = 1; 70 this.trackBar2.Name = "trackBar2"; 71 this.trackBar2.Size = new System.Drawing.Size(200, 45); 72 this.trackBar2.TabIndex = 2; 73 this.trackBar2.TickFrequency = 10; 74 this.trackBar2.Value = 250; 75 this.trackBar2.ValueChanged += new System.EventHandler(this.ValueChanged); 76 // 77 // numericUpDown1 78 // 79 this.numericUpDown1.Location = new System.Drawing.Point(14, 139); 80 this.numericUpDown1.Maximum = new decimal(new int[] { 81 2147483647, 82 0, 83 0, 84 0}); 85 this.numericUpDown1.Name = "numericUpDown1"; 86 this.numericUpDown1.Size = new System.Drawing.Size(120, 19); 87 this.numericUpDown1.TabIndex = 3; 88 this.numericUpDown1.ValueChanged += new System.EventHandler(this.ValueChanged); 89 // 90 // label1 91 // 92 this.label1.AutoSize = true; 93 this.label1.Location = new System.Drawing.Point(12, 124); 94 this.label1.Name = "label1"; 95 this.label1.Size = new System.Drawing.Size(46, 12); 96 this.label1.TabIndex = 4; 97 this.label1.Text = "シード値"; 98 // 99 // label2 100 // 101 this.label2.AutoSize = true; 102 this.label2.Location = new System.Drawing.Point(12, 173); 103 this.label2.Name = "label2"; 104 this.label2.Size = new System.Drawing.Size(29, 12); 105 this.label2.TabIndex = 5; 106 this.label2.Text = "起伏"; 107 // 108 // label3 109 // 110 this.label3.AutoSize = true; 111 this.label3.Location = new System.Drawing.Point(230, 173); 112 this.label3.Name = "label3"; 113 this.label3.Size = new System.Drawing.Size(43, 12); 114 this.label3.TabIndex = 6; 115 this.label3.Text = "スケール"; 116 // 117 // label4 118 // 119 this.label4.AutoSize = true; 120 this.label4.Location = new System.Drawing.Point(48, 173); 121 this.label4.Name = "label4"; 122 this.label4.Size = new System.Drawing.Size(0, 12); 123 this.label4.TabIndex = 7; 124 // 125 // label5 126 // 127 this.label5.AutoSize = true; 128 this.label5.Location = new System.Drawing.Point(279, 173); 129 this.label5.Name = "label5"; 130 this.label5.Size = new System.Drawing.Size(0, 12); 131 this.label5.TabIndex = 8; 132 // 133 // Form1 134 // 135 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 136 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 137 this.ClientSize = new System.Drawing.Size(517, 289); 138 this.Controls.Add(this.label5); 139 this.Controls.Add(this.label4); 140 this.Controls.Add(this.label3); 141 this.Controls.Add(this.label2); 142 this.Controls.Add(this.label1); 143 this.Controls.Add(this.numericUpDown1); 144 this.Controls.Add(this.trackBar2); 145 this.Controls.Add(this.trackBar1); 146 this.Controls.Add(this.panel1); 147 this.Name = "Form1"; 148 this.Text = "Form1"; 149 ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); 150 ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).EndInit(); 151 ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); 152 this.ResumeLayout(false); 153 this.PerformLayout(); 154 155 } 156 157 #endregion 158 159 private System.Windows.Forms.Panel panel1; 160 private System.Windows.Forms.TrackBar trackBar1; 161 private System.Windows.Forms.TrackBar trackBar2; 162 private System.Windows.Forms.NumericUpDown numericUpDown1; 163 private System.Windows.Forms.Label label1; 164 private System.Windows.Forms.Label label2; 165 private System.Windows.Forms.Label label3; 166 private System.Windows.Forms.Label label4; 167 private System.Windows.Forms.Label label5; 168 } 169}

イメージ説明

投稿2019/12/15 00:17

編集2023/07/17 12:34
TN8001

総合スコア9855

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JumpActionGames

2019/12/15 03:06

コードありがとうございます ごめんなさい ちょっと僕がやりたいのは-> https://youtu.be/9e5GcmOf4fU?t=89 らへんのパーリンノイズで2Dの滑らかな地形を作ってるやつ みたいなものです
TN8001

2019/12/15 04:52

あっ、なるほど確かにこれですねw
JumpActionGames

2019/12/15 06:08

ありがとうございます!!!!! できました!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問