WinForms実習:配列とfor文でカードを5枚並べる
この実習で学ぶこと
この実習では次の内容を体験します。
- Windowsフォームアプリ
- 配列
- for文
- 画面へのコントロール追加
最終的に、画面にカードを5枚並べます。

1 プロジェクトを作る
次を選択します。
Windows フォーム アプリ(C#)
ソリューション名・プロジェクト名
例 CardArraySample
作成を押します。

2 フォームを確認
次の画面が表示されます。
Form1
この白い画面が
アプリの画面
になります。
3 コードを開く
ソリューションエクスプローラーで
Form1.cs
を ダブルクリックします。
4 配列を追加する
クラスの中に次のコードを追加します。
// PictureBoxを5個まとめて管理する配列
PictureBox[] cards = new PictureBox[5];
場所はここです。
public partial class Form1 : Form
{
}
この中に書きます。
5 コンストラクタに処理を追加
次のコードを探します。
public Form1()
{
InitializeComponent();
}
その下に追加します。
CreateCards();
つまりこうなります。
public Form1()
{
InitializeComponent();
CreateCards();
}
6 メソッドを追加する
クラスの中に次のメソッドを書きます。
void CreateCards()
{
}
7 カード生成コードを書く
CreateCards の中に次を書きます。
// カードを作って並べるメソッド
void CreateCards()
{
// 左側の余白
int startX = 20;
// カードの間隔
int space = 120;
// 配列の数だけ繰り返す
for (int i = 0; i < cards.Length; i++)
{
// PictureBoxを作る
cards[i] = new PictureBox();
// 横幅
cards[i].Width = 100;
// 高さ
cards[i].Height = 150;
// 横位置
cards[i].Left = startX + i * space;
// 縦位置
cards[i].Top = 30;
// 画像表示方法
cards[i].SizeMode = PictureBoxSizeMode.StretchImage;
// 画像を読み込む
cards[i].Image = Image.FromFile("card.png");
// 画面に追加
this.Controls.Add(cards[i]);
}
}
8 画像をプロジェクトに追加する
まず画像を用意します。
card.png

ペイントで変換
- ダウンロードした card.webp を ペイントで開く
- [ファイル] → [名前を付けて保存] → [PNG画像]
- card.png として保存
プロジェクトに追加
ソリューションエクスプローラーで
プロジェクト名
を 右クリック
追加
↓
既存の項目
を選択します。
card.png
を追加します。
プロパティ設定
追加した
card.png
をクリックします。
プロパティで
出力ディレクトリにコピー
↓
常にコピー
を選びます。
9 実行
Visual Studio 上部の
▶ 実行
または
F5
を押します。
10 実行結果
カードが5枚並びます。

今日のポイント
今回のプログラムの核心はこれです。
配列
+
for文
つまり
同じものをまとめて作る
ということです。
配列のイメージ
今回のコードでは
cards[0]
cards[1]
cards[2]
cards[3]
cards[4]
という PictureBoxの棚 を作っています。
なぜ画像を1回だけ読み込むのか
同じ画像を複数の PictureBox に表示する場合、
毎回ファイルを読み込む必要はありません。
画像を1回だけ読み込み、
それを複数の PictureBox で共有することができます。
この方法の方が
- 処理が速い
- メモリ使用量が少ない
- プログラムとして自然
というメリットがあります。
画像を毎回読み込むコード
次のコードでは、ループの中で毎回画像を読み込んでいます。
for (int i = 0; i < cards.Length; i++)
{
cards[i] = new PictureBox();
cards[i].Width = 100;
cards[i].Height = 150;
cards[i].Left = startX + i * space;
cards[i].Top = 30;
cards[i].SizeMode = PictureBoxSizeMode.StretchImage;
// 毎回ファイルを読み込んでいる
cards[i].Image = Image.FromFile("card.png");
this.Controls.Add(cards[i]);
}
この書き方でも動きますが、
同じ画像を 何度も読み込むことになります。
画像を1回だけ読み込むコード
次のコードでは、
ループの前で画像を1回だけ読み込みます。
Image cardImage = Image.FromFile("card.png");
for (int i = 0; i < cards.Length; i++)
{
cards[i] = new PictureBox();
cards[i].Width = 100;
cards[i].Height = 150;
cards[i].Left = startX + i * space;
cards[i].Top = 30;
cards[i].SizeMode = PictureBoxSizeMode.StretchImage;
// 読み込んだ画像を共有
cards[i].Image = cardImage;
this.Controls.Add(cards[i]);
}
この方法では
- 画像読み込みは 1回だけ
- 同じ画像を 複数の PictureBox が共有
します。
プログラム設計の考え方
プログラムを書くときは、
同じものを何度も作らない
という考え方が重要です。
今回の例では
- 画像は1回読み込む
- 表示だけ複数回行う
という構造にすると、
効率の良いプログラムになります。
おまけ
行を増やすあれこれ
割り算の結果とあまりを使う方法(実務より)
using System.Drawing;
using System.Windows.Forms;
namespace CardArraySample
{
public partial class Form1 : Form
{
// PictureBoxを5個まとめて管理する配列
PictureBox[] cards = new PictureBox[10];
public Form1()
{
InitializeComponent();
CreateCards();
}
// カードを作って並べるメソッド
void CreateCards()
{
// 左側の余白
int startX = 20;
// カードの間隔
int space = 120;
// 画像は1回だけ読み込む(重要)
Image cardImage = Image.FromFile("card.png");
// 配列の数だけ繰り返す
for (int i = 0; i < cards.Length; i++)
{
// PictureBoxを作る
cards[i] = new PictureBox();
// 横幅
cards[i].Width = 100;
// 高さ(トランプらしくするなら150)
cards[i].Height = 150;
// 横位置
cards[i].Left = startX + (i % 5) * space;
// 縦位置
cards[i].Top = 30 + (i / 5) * 180;
// 画像表示方法
cards[i].SizeMode = PictureBoxSizeMode.StretchImage;
// 画像は共有して使う(重要)
cards[i].Image = cardImage;
// 画面に追加
this.Controls.Add(cards[i]);
}
}
}
}
2重ループを使う方法(授業より)
PictureBox[] cards = new PictureBox[10];
void CreateCards()
{
int startX = 20;
int space = 120;
Image cardImage = Image.FromFile("card.png");
int index = 0;
for (int row = 0; row < 2; row++)
{
for (int col = 0; col < 5; col++)
{
cards[index] = new PictureBox();
cards[index].Width = 100;
cards[index].Height = 150;
cards[index].Left = startX + col * space;
cards[index].Top = 30 + row * 180;
cards[index].SizeMode = PictureBoxSizeMode.StretchImage;
cards[index].Image = cardImage;
this.Controls.Add(cards[index]);
index++;
}
}
}




ディスカッション
コメント一覧
まだ、コメントがありません