C# exercises (7) Puzzle Game

今回作るのは、イメージを読み込んで利用するパズルゲームです。イメージファイルを読み込むとそれを 9 分割し、ランダムに混ぜます。

プレビューのイメージをフォーム上クリックして配置、すべて正しい場所に配置できればクリアです。

PuzzleGame3x3

 

フォーム作成

サイズ:500 x 400

背景色:適当

スクリーンショット 2016-06-03 10.47.38

PictureBox配置

  • (Name) : PlayBox
  • Size :        300 x 300
  • BackColor :  white

プレビュー用PictureBox配置

  • (Name) : Preview
  • Size :        100 x 100
  • BackColor :  white

スクリーンショット 2016-06-03 10.56.11

 

 

メニュー作成

MenuStrip をフォームにドロップ、下記のようにメニュー追加

  • File
    • Load Image…

 

スクリーンショット 2016-06-03 10.59.28

 

ダイアログ作成

openFileDialog をフォームにドロップ、フィルターを設定

  • Image Files (*.png, *.jpg) | *.png; *.jpg

スクリーンショット 2016-06-03 11.09.08

 

イベント設定

PlayBox

  • MouseDown : PlayBox_MouseDown
  • Paint : PlayBox_Paint

Preview

  • Paint : Preview_Paint

LoadImage

  • Click : LoadImage_Click

スクリーンショット 2016-06-03 11.15.29

 

ソースコード

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 PuzzleApp
{
    public partial class Form1 : Form
    {
        // ゲームで使う変数(フィールド)
        Image img = null;
        bool[] flg = new bool[9];
        int[] data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
        int[] answer = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
        int current = 0;
        bool playflg = false;
        bool clearflg = false;


        public Form1()
        {
            InitializeComponent();
        }


        // 変数関係の初期化処理
        private void initialData()
        {
            flg = new bool[9];
            data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
            answer = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1 };
            Random r = new Random(Environment.TickCount);
            for (int i = 0; i < 100; i++)
            {
                int a = r.Next(9);
                int b = r.Next(9);
                int n = data[a];
                data[a] = data[b];
                data[b] = n;
            }
            current = 0;
            playflg = true;
            clearflg = false;
        }


        // クリアしたかどうかをチェック
        private void checkClear()
        {
            bool flg = true;
            for (int i = 0; i < 9; i++)
            {
                if (answer[i] != i) { flg = false; }
            }
            clearflg = flg;
        }


        // ゲームが終わったかどうかチェック
        private void checkGameEnd()
        {
            bool flg = false;
            for (int i = 0; i < 9; i++)
            {
                if (answer[i] == -1) { flg = true; }
            }
            playflg = flg;
            if (playflg == false)
            {
                this.checkClear();
            }
        }


        // オープンダイアログを開いてイメージファイルをロードする
        private void LoadImage_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
            {
                img = Image.FromFile(openFileDialog1.FileName);
                this.initialData();
                this.Refresh();
            }
        }


        // PlayBoxの表示
        private void PlayBox_Paint(object sender, PaintEventArgs e)
        {
            if (img == null) { return; }
            Graphics g = e.Graphics;
            for (int i = 0; i < 9; i++)
            {
                if (flg[i] == false) { continue; }
                if (answer[i] == -1) { continue; }
                int x1 = i % 3;
                int y1 = i / 3;
                int x2 = answer[i] % 3;
                int y2 = answer[i] / 3;
                Rectangle r1 = new Rectangle(100 * x1, 100 * y1, 100, 100);
                Rectangle r2 = new Rectangle(100 * x2, 100 * y2, 100, 100);
                g.DrawImage(img, r1, r2, GraphicsUnit.Pixel);
            }
            if (playflg == false)
            {
                if (clearflg)
                {
                    g.DrawString("CLEAR!!",
                        new Font("Impact", 48, FontStyle.Bold),
                        new SolidBrush(Color.Red),
                        new Point(40, 100));
                }
                else
                {
                    g.DrawString("GAMEOVER...",
                        new Font("Impact", 36, FontStyle.Bold),
                        new SolidBrush(Color.Blue),
                        new Point(20, 200));
                }
            }
        }


        // PlayBoxをクリックした時の処理
        private void PlayBox_MouseDown(object sender, MouseEventArgs e)
        {
            if (playflg == false) { return; }
            if (img == null) { return; }
            if (current > 8) { return; }
            int x = e.X / 100;
            int y = e.Y / 100;
            if (x < 0) { return; }
            if (y < 0) { return; }
            if (x >= 3) { return; }
            if (y >= 3) { return; }


            int n = x + y * 3;
            flg[n] = true;
            answer[n] = data[current];
            current++;
            this.checkGameEnd();
            this.Refresh();
        }


        // previewの表示
        private void Preview_Paint(object sender, PaintEventArgs e)
        {
            if (img == null) { return; }
            if (current > 8) { return; }
            int x = data[current] % 3;
            int y = data[current] / 3;
            Graphics g = e.Graphics;
            Rectangle r1 = new Rectangle(0, 0, 100, 100);
            Rectangle r2 = new Rectangle(x * 100, y * 100, 100, 100);
            g.DrawImage(img, r1, r2, GraphicsUnit.Pixel);
        }
    }
}

 

実行結果

 

スクリーンショット 2016-06-03 11.30.31

 

スクリーンショット 2016-06-03 11.29.42

参考

http://www18.big.or.jp/~neon2/bunkatu/tips9.shtml

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


Related Post

C# exercises (4) Slot machineC# exercises (4) Slot machine

Visual Studio community 2015 アカウントについて (学内専用) スロットマシンの作成 Slot machine スロットのプログラムに必要な3つの部品 数字を表示させるための部品   → ラベル (Labelコントロール) スロットを開始するための部品   → ボタン (Buttonコントロール) 数字の書き換えを短い間隔で行うため、その間隔を計るための部品 […]

C# exercises (e) Open DataC# exercises (e) Open Data

オープンデータを利用したWebアプリ作成 オープンデータとは オープンデータ(Open Data)とは、特定のデータが、一切の著作権、特許などの制御メカニズムの制限なしで、全ての人が望むように利用・再掲載できるような形で入手できるべきであるというアイデアである。 オープンデータの利用 「LinkData.org」には、誰でも無償で利用でき、商用利用も可能なオープンデータが豊富にまとまっています。 都道府県別で探したり、人気ランキングやキーワードを指定しての検索もできるので、自分が興味のあるデータを探すのも簡単でしょう。 LinkDataのサイト内には、全国の「お城データ」や「道の駅データ」、「避難所データ」、「補助金まとめデータ」、「さくら名所データ」…など、意外とユニークで面白いデータがまとまっているので、うまく利用すれば楽しいWebアプリが作れそうです。 「ダウンロード」の項目下に、「その他の形式のAPIリストを表示」というリンクがあるのでクリックします。 すると、外部APIとしてデータが取得できるURLが一覧表示されます。 そこで「JSON」形式のURLをコピーして、実際にブラウザのアドレスバーに入力してみましょう! あとは、このデータをC#を使って、自分のWebアプリに組み込めば良い。 グループ課題 オープンデータを利用したWebアプリの作成 オープンデータの選択 郵便番号検索 天気予報検索 その他 オープンデータをブラウザで確認 C#を使って、オープンデータWebアプリの作成

C# exercises (5) CalculatorC# exercises (5) Calculator

my電卓を作ろう 逆ポーランド記法電卓 Reverse Polish Notation Calculator 画面をデザインする ツールボックスの中で、 コモンコントロール「TextBox」 TextBox –>  (name): typeText;  text: 0 TextBox –> (name): lastText;  text: 0 コモンコントロール「Button」 […]