28
1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング - 1 C#を使って、Visual Studio 2008 でゲームを作る 「数独」を作ってみよう ■はじめに 本シリーズは全3回で、ソフトウェゕを開発するツール Visual Studio 2008 を使って「数独」パズ ルゲームをプログラミングする方法を紹介します。 学生の皆様が Visual Studio 2008 を無償で入手しンストールする方法をご紹介し、ステップバ ステップでのプログラミング手順に従って実際に「数独」パズルを作成する方法を説明します。 ぜひこの機会に、手軽にプログラミングができることを体験してください。 ソフトウェアを作る「開発ツール」とは? ソフトウェゕを作成するには、コンピュータが理解できる言語(プログラミング言語)を利用してソ フトウェゕを動作させるためのコード(命令の記述)を書いていきます。これを「プログラミングす る」あるいは「コーデゖングする」といいます。 パソコンの性能が向上し、現在は、コードを書く手間をなるべく省き、ビジュゕルなツールを使いマ ウスを使ってドラッグ&ドロップなどの方法で、比較的楽に作成できる方法も増えています。また、 動作テスト用のツールやメンテナンスに役立つツールなども充実しています。これらのソフトウェゕ 開発に必要なツールをすべてひっくるめて「開発ツール」と呼びます。 Visual Studio 2008 Windows 専用の開発ツール 本シリーズでは「Visual Studio 2008」という開発ツールを使用します。 Visual Studio 2008 は、マクロソフトが提供している開発ツールで、Windows 上で動作するソフ トウェゕを効率よく開発するための専用ツール群 Visual Studio の最新バージョンです。Visual C++ Visual Basic をはじめとした、複数のプログラミング言語に対応した開発ツール群で、Windows 上で安全な実行環境を提供する .NET Framework に対応しています。 DreamSpark に登録して Visual Studio 2008 をインストールしよう DreamSpark は、学生の方を対象にしたソフトウェゕ開発製品、ゕプリケーションデザン製品など の無償提供プログラムです。この DreamSpark を利用して Visual Studio 2008 Professional Edition をダウンロードできます。早速、DreamSpark に登録して Visual Studio 2008 をンス トールしてみましょう。DreamSpark にゕクセスする

Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

1

Visual Studio 2008 でゲームを作ろう

- 気軽に始めるプログラミング -

第 1 回

C#を使って、Visual Studio 2008 でゲームを作る

- 「数独」を作ってみよう ① -

■はじめに

本シリーズは全3回で、ソフトウェゕを開発するツール Visual Studio 2008 を使って「数独」パズ

ルゲームをプログラミングする方法を紹介します。

学生の皆様が Visual Studio 2008 を無償で入手しンストールする方法をご紹介し、ステップバ

ステップでのプログラミング手順に従って実際に「数独」パズルを作成する方法を説明します。

ぜひこの機会に、手軽にプログラミングができることを体験してください。

■ ソフトウェアを作る「開発ツール」とは?

ソフトウェゕを作成するには、コンピュータが理解できる言語(プログラミング言語)を利用してソ

フトウェゕを動作させるためのコード(命令の記述)を書いていきます。これを「プログラミングす

る」あるいは「コーデゖングする」といいます。

パソコンの性能が向上し、現在は、コードを書く手間をなるべく省き、ビジュゕルなツールを使いマ

ウスを使ってドラッグ&ドロップなどの方法で、比較的楽に作成できる方法も増えています。また、

動作テスト用のツールやメンテナンスに役立つツールなども充実しています。これらのソフトウェゕ

開発に必要なツールをすべてひっくるめて「開発ツール」と呼びます。

■ Visual Studio 2008 は Windows 専用の開発ツール

本シリーズでは「Visual Studio 2008」という開発ツールを使用します。

Visual Studio 2008 は、マクロソフトが提供している開発ツールで、Windows 上で動作するソフ

トウェゕを効率よく開発するための専用ツール群 Visual Studio の最新バージョンです。Visual C++

や Visual Basic をはじめとした、複数のプログラミング言語に対応した開発ツール群で、Windows

上で安全な実行環境を提供する .NET Framework に対応しています。

■ DreamSpark に登録して Visual Studio 2008 をインストールしよう

DreamSpark は、学生の方を対象にしたソフトウェゕ開発製品、ゕプリケーションデザン製品など

の無償提供プログラムです。この DreamSpark を利用して Visual Studio 2008 Professional

Edition をダウンロードできます。早速、DreamSpark に登録して Visual Studio 2008 をンス

トールしてみましょう。→DreamSpark にゕクセスする

Page 2: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

2

ダウンロードしたフゔルを実行し、下記のVisual Studio 2008 セットゕップ画面が表示すれば、

「次へ」ボタンを押します。

「同意する」を選択し、DreamSparkから発行されたプロダクトキーと名前を入力します。そして、

「次へ」のボタンを押します。

「ンストールする機能」は「既定」を選択し、「ンストール」ボタンを押します。

Page 3: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

3

ンストールが終わったら、「完了」ボタンを押す前に、Visual Studio 2008 の更新プログラムを確

認することをお勧めします。「セキュリテゖ メモ」のWindows Update Web サトにゕクセスして

ください。

DreamSpark では、Visual Studio の他にも Windows Server、Expression などの製品を無償でダ

ウンロードできます。→Dream Spark の提供製品

Page 4: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

4

■「数独」パズルのルール

本シリーズでは、実際に「数独」パズルを作ってみますが、「数独」というパズルゲームをご存じな

い方のために、今回はまずこの「数独」についてご説明しておきましょう。

「数独」ルール

上記のような 9 行× 9 列のマス目の空欄のすべてを、下記の 3 つの条件に沿って 1 ~ 9 の数字

で埋めていきます。

<条件>

・ 同じ横一行には同じ数字は入りません。

・ 同じ縦一列にも同じ数字は入りません。

・ 赤線で囲まれた 3 × 3 の各ミニブロックにも同じ数字は入りません。

■「数独」ゲームを作ってみよう

では実際に Visual Studio 2008 を使って「数独」を作ってみましょう。

ひとつひとつの工程を完璧に理解できなくても、ひととおり手順に従って作成してみてください。何

をすれば、どのようになるのかを体感してみることで、プログラミングの流れを理解できるようにな

ります。

第 1 章「数独」を作ってみよう ①

■ イントロダクション

今回は C# を使って下記のような「数独」ゲームを作成してみましょう。

Page 5: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

5

■ プロジェクトを作成する

Visual Studio 2008 を起動したら、以下の手順に従って、プロジェクトを新規作成します。

1. 「フゔル」-「新規作成」-「プロジェクト」を選択します。

※あるいは、ツールバーの をクリックします。

2. 「新しいプロジェクト」ウゖンドウの右上で、.NET Framework のバージョンを設定できます

( Visual Studio 2008 の新しい機能です )。今回は「.NET Framework 3.5」をそのまま選択し

ておきます。

3. 「プロジェクト名」の欄を “MySudoku” と変更し「OK」をクリックします。

4. Form1.cs が自働的に作成されます。フォームは、ユーザーンターフェースになる部分です。

フ ォーム の名 前 をわか りやす くする ために 、 “ FrmSudoku.cs ” に変 更しま す。

「ソリューションエクスプローラー」ウゖンドウの Form1.cs を選択して F2 キーを押し、

“FrmSudoku.cs” へ変更します。確認画面が表示されたら「はい」を選びます。

Page 6: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

6

5. フォームのサズを丁度良い大きさに変更します。「プロパテゖ」ウゖンドウが表示されていない

場合は「表示」メニューの「プロパテゖウゖンドウ」をクリックして開きます。そして、下記のプ

ロパテゖを編集します。

ShowIcon False

Size

Width

Height

600

500

Text 数独

■ コントロールを追加する

6. DataGridView、ボタンなどのコントロールを FrmSudoku.cs[デザン]に追加します。マウスを

「ツールボックス」に近づけるとツールボックスの内容が表示されます。 を押すと、ツール

ボックスの内容がそのまま表示されます。

7. 「ツールボックス」-「データ」-「DataGridView」を選択してドラッグし、FrmSudoku.cs[デ

ザン]にドロップします。そして、DataGridView のプロパテゖを変更します。dgvPlayArea は

「数独」のゲーム画面の表示(と入力)部分です。

(Name) dgvPlayArea

AllowUserToAddRows False

AllowUserToDeleteRows False

AllowUserToResizeColumns False

AllowUserToResizeRows False

EditMode EditOnKeystroke

ScrollBars None

Size 364,363

Page 7: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

7

BorderStyle None

ColumnHeadersVisible False

DefaultCellStyle

( をクリックして CellStyle ビルダを開き

ます。下記の図を参照)

Alignment: MiddleCenter

Font:MS UI Gothic, 24pt

RowHeadersVisible False

RowTemplate

Height

40

8. DataGridView に列を追加します。[デザン]ウゖンドウの dgvPlayArea を選択し、 をクリッ

クして「DataGridView タスク」を開きます。

Page 8: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

8

9. 「列の編集」ウゖンドウが表示されたら、「追加」ボタンをクリックすると「列の追加」ウゖンド

ウが表示されます。

10. 「列の追加」ウゖンドウで、列を追加します。今回は、名前と型はデフォルト値のまま利用します

(デフォルトの型:「DataGridViewTextColumn」)。9つの列を作成するので、「追加」ボタ

ンを 9 回押します。列の追加が終わったら「キャンセル」ボタンを押します。

11. 「列の編集」ウゖンドウで、各列のプロパテゖを下記のように設定します。

MaxInputLength 1

Width 40

12. これで dgvPlayArea の設定が完了しました。解答のエリゕのためにもうひとつ DataGridView

を用意する必要があります。この作業を楽にするために、先ほど作成した dgvPlayArea をコピー

Page 9: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

9

ゕンド ペーストして、プロパテゖを必要な箇所だけ変更します。

(Name) dgvAnswer

ReadOnly true

Size 182,182

DefaultCellStyle Font:MS UI Gothic, 12pt

RowTemplate

Height

20

13. dgvAnswer の「DataGridView タスク」から、列の Width を編集します。

Width 20

14. 「TextBox」コントロールを追加して、プロパテゖを編集します。

15. 「Button」コントロールを 5 つ追加し、プロパテゖを編集します。

(Name) btnNewGame

Width 100

Text ニューゲーム

(Name) btnOpenGame

Width 100

Text ゲームを開く

(Name) btnSaveGame

Width 100

Text ゲームを保存

(Name) btnHint

Width 100

Text ヒント

(Name) tbMessage

Multiline True

ReadOnly True

Size 364,60

([デザン]のTextBoxを選択し、角をドラッグするとリ

サズできます)

Page 10: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

10

(Name) btnAnswer

Width 100

Text 解答

16. 最後に、各コントロールの TabIndex プロパテゖを設定します。

■ 実行する

17. 「デバッグ」メニューの「デバッグ開始」を選択して、ゲームを実行します(あるいは、F5 キー

を押して実行します)。ここでは、「数独」はまだ表示されません。

■ プロジェクトファイルのダウンロード

ここで使用したプロジェクトフゔルは、こちらからダウンロードできます。

→プロジェクトフゔルのダウンロード

※ 環境によって、FrmSudoku の表示が多少異なります。サズなど微調整してください。

btnNewGame 0

btnOpenGame 1

btnSaveGame 2

btnHint 3

btnAnswer 4

dgvPlayArea 5

tbMessage 6

dgvAnswer 7

Page 11: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

11

■ まとめ

第 1 章では、「数独」パズルを表示するフォームを作成し、各コントロールのプロパテゖの設定を学

習しました。次回は、何かの事象が起こったら特定の処理を実行する「ベント ハンドラ」について

学習し、また、パズル中のデータを保管する XML フゔルの作成方法を学びます。

Page 12: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

12

第 2 回

Visual Studio 2008 でゲームを作る

- 「数独」を作ってみよう ② -

「数独」パズルを作ってみよう 第 2 章

■ はじめに

第 1 章では「数独」パズルを表示するフォームを作成しました。この章では「ニューゲーム」ボタン

をクリックしてゲームを開始する、パズルに問題となる数字を表示させるようにします。

そのために、次の 3 つのことを行います。

(a) btnNewGame にベントハンドラを追加する

(b) 「数独」パズルのデータを保管するために XML フゔルを作成する

(c) XMLフゔルを読んで dgvPlayArea と dgvAnswer にデータを入力します。

■ イベントハンドラの追加

1. ボタンの Click ベントの処理を作成するには、二つの方法があります。ボタンのデフォルトベ

ントは Click なので、FrmSudoku.cs[デザン]にあるボタンをダブルクリックすると、ベント

ハンドラーが自働作成されます。(※FrmSudoku.cs[デザン]が表示されていない場合は、「ソ

リューション エクスプローラー」の FrmSudoku.cs をダブルクリックしてください)。

2. 各ボタンの Click ベントに処理を追加します。

Page 13: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

13

■ XMLファイルの新規作成

3. ゲームの情報は XML フゔルとして保存します。

4. 「ソリューション エクスプローラー」-「MySudoku」プロジェクトを選択し、右クリックし、

「追加」-「新しい項目」を選択します。

5. 「新しい項目の追加」ウゖンドウで「XML フゔル」のテンプレートを選択し、「フゔル名」

に “PuzzleData” と入力し「追加」ボタンを押します。

6. PuzzleData.xml のプロパテゖを設定します。

出力デゖレクトリにコピー 新しい場合はコピーする

7. PuzzleData.xml に記述する内容は下記のようになります。

<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE sudoku [

<!ELEMENT sudoku (puzzle*)>

<!ELEMENT puzzle (question, answer)>

<!ELEMENT question (row*)>

<!ELEMENT answer (row*)>

<!ATTLIST puzzle id ID #REQUIRED>

]>

<sudoku>

<puzzle id="0">

<question>

<row>,4,,,5,,,,</row>

<row>5,,,9,2,,4,,8</row>

<row>7,,2,6,,,1,,5</row>

<row>,,,,,,,2,1</row>

<row>,7,9,,,,,8,</row>

<row>,6,5,,,,9,7,</row>

<row>,8,1,,3,,,,9</row>

Page 14: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

14

<row>,2,,,,8,3,,7</row>

<row>3,5,,4,9,2,8,,6</row>

</question>

<answer>

<row>8,4,6,3,5,1,7,9,2</row>

<row>5,1,3,9,2,7,4,6,8</row>

<row>7,9,2,6,8,4,1,3,5</row>

<row>4,3,8,5,7,9,6,2,1</row>

<row>1,7,9,2,4,6,5,8,3</row>

<row>2,6,5,8,1,3,9,7,4</row>

<row>6,8,1,7,3,5,2,4,9</row>

<row>9,2,4,1,6,8,3,5,7</row>

<row>3,5,7,4,9,2,8,1,6</row>

</answer>

</puzzle>

<puzzle id="1">

<question>

<row>,1,8,,,2,,,</row>

<row>,5,3,,6,8,9,,</row>

<row>,,,7,,,6,8,1</row>

<row>,,,,7,,,,8</row>

<row>,,,,4,,1,,9</row>

<row>,,,8,1,,2,,5</row>

<row>,9,,,5,1,,,6</row>

<row>8,6,,9,2,,5,,</row>

<row>5,,1,,,4,7,9,2</row>

</question>

<answer>

<row>6,1,8,4,9,2,3,5,7</row>

<row>7,5,3,1,6,8,9,2,4</row>

<row>9,4,2,7,3,5,6,8,1</row>

<row>1,2,6,5,7,9,4,3,8</row>

<row>3,8,5,2,4,6,1,7,9</row>

<row>4,7,9,8,1,3,2,6,5</row>

<row>2,9,7,3,5,1,8,4,6</row>

<row>8,6,4,9,2,7,5,1,3</row>

<row>5,3,1,6,8,4,7,9,2</row>

</answer>

</puzzle>

<puzzle id="2">

<question>

<row>,,,,,6,,,</row>

<row>,,,,1,,9,,7</row>

<row>,,,7,9,,6,,4</row>

<row>,,,,3,,,,9</row>

<row>,7,4,2,6,,8,,3</row>

Page 15: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

15

■ メソッドスタブの生成

8. XML フゔルのパズルの数を数えるために「countPuzzles」という名前のメソッドを作成しま

す(countPuzzles の出力は整数のンスタンス変数 TotalPuzzles に割り当てます)。参照され

る未定義の countPuzzles メッソドを定義するときには、countPuzzles を右クリックし「メソッ

ドスタブの生成」を選択すると、メソッドスタブが自動的に作成されます(あるいは、下記のよう

に、青いスマートタグをクリックします)。※FrmSudoku.cs のコードが表示されない場合は、

FrmSudoku.cs[デザン]を選んで、「表示」メニューの「コード」を選択してください。

<row>5,,3,1,,,,4,6</row>

<row>,1,6,,5,7,,,2</row>

<row>,,7,9,2,,,6,8</row>

<row>2,,9,,,1,,3,5</row>

</question>

<answer>

<row>7,9,2,8,4,6,3,5,1</row>

<row>4,6,8,5,1,3,9,2,7</row>

<row>1,3,5,7,9,2,6,8,4</row>

<row>6,2,1,4,3,8,5,7,9</row>

<row>9,7,4,2,6,5,8,1,3</row>

<row>5,8,3,1,7,9,2,4,6</row>

<row>8,1,6,3,5,7,4,9,2</row>

<row>3,5,7,9,2,4,1,6,8</row>

<row>2,4,9,6,8,1,7,3,5</row>

</answer>

</puzzle>

</sudoku>

Page 16: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

16

■ インテリセンス

9. XML フゔルを読むために XmlDocument クラスを用意します。これを入力すると、ンテリ

センスが候補のクラスを表示してきます。XmlDocument はンテリセンスの候補にはないので、

赤いスマートタグをクリックし、「using System.Xml」を追加します。

10. そして、ンテリセンスを使ってコードを書き終えます。

11. 完成した countPuzzle メソッド(文字列定数 DATAPATH の値は「”PuzzleData.xml”」です)。

1. Write code to read and load data from PuzzleData.xml into dgvPlayArea and

2.

3.

private int countPuzzles() {

XmlDocument xd = new XmlDocument(); xd.Load(DATAPATH); return xd.GetElementsByTagName("puzzle").Count; }

Page 17: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

17

12. PuzzleData.xml から dgvPlayArea と dgvAnswer へデータを読み込むためのコードを書きま

す。(btnNewGame_Click の文字列のンスタンス変数 CurPuzzleID はランダムな ID を保存

します)。

private void btnNewGame_Click(object sender, EventArgs e)

{

CurPuzzleID = new Random().Next(TotalPuzzles).ToString();

loadPuzzle();

}

private void loadPuzzle()

{

//リセット

tbMessage.Text = "";

if (dgvPlayArea.Rows.Count > 0)

{

for (int row = 0; row < 9; row++)

{

dgvPlayArea.Rows.RemoveAt(0);

dgvAnswer.Rows.RemoveAt(0);

}

}

//PuzzleData.xmlからデータを抽出

XmlDocument xd = new XmlDocument();

xd.Load(DATAPATH);

XmlElement xePuzzle = xd.GetElementById(CurPuzzleID);

//DataGridView にゲームの情報を入力

foreach (XmlNode node in xePuzzle.FirstChild.ChildNodes)

{

dgvPlayArea.Rows.Add(node.InnerText.Split(new char[] { ',' }));

}

//DataGridView に解答の情報を入力

foreach (XmlNode node in xePuzzle.ChildNodes[1].ChildNodes)

{

dgvAnswer.Rows.Add(node.InnerText.Split(new char[] { ',' }));

}

//dgvPlayArea には初期値のセルをReadOnlyを設定

for (int row=0; row<9; row++)

{

for (int col = 0; col < 9; col++)

{

Page 18: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

18

13. dgvPlayArea と dgvAnswer にカラーフレームを描くために、それぞれに Paint ベントハンド

ラを追加します。そして、各 Paint ベントハンドラに drawFrame メソッドを実行します(定

数 CELL_WIDTH と CELL_WIDTH_ANSWER の値はそれぞれ「40」と「20」です)。

DataGridViewCell cell = dgvPlayArea[col, row];

if (!cell.Value.Equals(""))

{

cell.ReadOnly = true;

cell.Style.ForeColor = Color.Blue;

cell.Style.Font = new Font(cell.InheritedStyle.Font, FontStyle.Bold);

}

}

}

//dgvPlayArea を表示

dgvPlayArea.Visible = true;

//初期値のハラトされているセルを無効に

dgvPlayArea.CurrentCell = null;

//タトルを更新

this.Text = "数独[" + CurPuzzleID + "]";

}

Page 19: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

19

14. ユーザーが 「Delete」キーか「Back Space」キーを押したときに “消す” 処理のために、

dgvPlayArea に KeyDown ベントハンドラを追加します。

private void dgvPlayArea_Paint(object sender, PaintEventArgs e)

{

drawFrame(e, CELL_WIDTH, Color.Red);

}

private void dgvAnswer_Paint(object sender, PaintEventArgs e)

{

drawFrame(e, CELL_WIDTH_ANSWER, Color.Gray);

}

private void drawFrame(PaintEventArgs e, int cellWidth, Color frameColor)

{

Point curPoint = new Point(0, 0);

Size size = new Size(cellWidth * 3, cellWidth * 3);

Pen myPen = new Pen(frameColor, 3);

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 3; j++)

{

curPoint.X = i * cellWidth * 3;

curPoint.Y = j * cellWidth * 3;

Rectangle rect = new Rectangle(curPoint, size);

e.Graphics.DrawRectangle(myPen, rect);

}

}

}

private void dgvPlayArea_KeyDown(object sender, KeyEventArgs e)

{

if (dgvPlayArea.CurrentCell.ReadOnly == false &&

(e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back))

{

dgvPlayArea.CurrentCell.Value = "";

dgvPlayArea.CurrentCell.Style.BackColor = SystemColors.Window;

isDirty = true;

}

}

Page 20: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

20

15. FrmSudoku を開始したときに dgvPlayArea と dgvAnswer を非表示にさせておくように、コ

ンストラクターに下記のコードを追加します。

16. ゲームを実行すると、下記のように表示されます。

■ プロジェクトファイルのダウンロード

1 章と 2 章までのデザンとコーデゖングはこちらからダウンロードできます。

→デザンとコードのダウンロード

※環境によって、FrmSudoku の表示が多少異なります。サズ調整などを行ってください。

■ まとめ

第 2 章では、ベントハンドラを利用してゲーム開始の処理を作成し、XML フゔルを使って問題

データを画面に準備しました。次回、第 3 回目では「数独」のルールを実装してゲームを完成させま

す。

public FrmSudoku()

{

InitializeComponent();

TotalPuzzles = countPuzzles();

//DataGridViewを隠す

dgvPlayArea.Visible = false;

dgvAnswer.Visible = false;

}

Page 21: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

21

第 3 回

Visual Studio 2008 でゲームを作る

- 「数独」を作ってみよう ③ -

「数独」パズルを作ってみよう 第 3 章

■ はじめに

本章では、「数独」のルールを設定して入力された値をチェックする機能を加えます。ゲームの本質

的な動作にあたる部分です。

■入力された値をチェックする

1. dgvPlayArea に CellValueChanged のベントハンドラを追加する。

2. 主な 3 つのチェックの処理を作成します。

① 数字であるかどうか:checkInputIsNumber

② 行・列・ミニブロック内に数字の重複がないかどうか:checkHaveDuplicates

③ すべてのセルが入力されたかどうか:checkHaveCompleted

public FrmSudoku()

{

InitializeComponent();

TotalPuzzles = countPuzzles();

//DataGridViewを隠す

dgvPlayArea.Visible = false;

dgvAnswer.Visible = false;

dgvPlayArea.CellValueChanged +=new

DataGridViewCellEventHandler(dgvPlayArea_CellValueChanged);

}

Page 22: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

22

checkInputIsNumber

private bool checkInputIsNumber()

{

string input = dgvPlayArea.CurrentCell.Value.ToString();

Regex r = new Regex("^[1-91-9]$");

if (!r.IsMatch(input))

{

tbMessage.Text = NOTNUMBER;

dgvPlayArea.CurrentCell.Style.BackColor = Color.Red;

return false;

}

r = new Regex("^[1-9]$");

if (r.IsMatch(input))

{

dgvPlayArea.CurrentCell.Value = input.Replace('1', '1').Replace('2', '2')

.Replace('3', '3').Replace('4', '4')

.Replace('5', '5').Replace('6', '6')

.Replace('7', '7').Replace('8', '8')

.Replace('9', '9');

}

return true;

}

private void dgvPlayArea_CellValueChanged(object sender, DataGridViewCellEventArgs e)

{

//メッセージをリセット

tbMessage.Text = "";

if (!dgvPlayArea.CurrentCell.Value.Equals(""))

{

if (checkInputIsNumber() == true)

{

checkHaveDuplicates();

checkHaveCompleted();

}

isDirty = true;

}

}

Page 23: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

23

checkHaveDuplicates

private void checkHaveDuplicates()

{

bool hasDuplicateInRow = false;

bool hasDuplicateInCol = false;

bool hasDuplicateInBox = false;

object input = dgvPlayArea.CurrentCell.Value;

int curRowIndex = dgvPlayArea.CurrentCell.RowIndex;

int curColIndex = dgvPlayArea.CurrentCell.ColumnIndex;

//当行を確認

for (int i = 0; i < 9; i++)

{

if (dgvPlayArea[i, curRowIndex].Value.Equals(input) && i != curColIndex)

{

tbMessage.Text += "行" + (curRowIndex + 1) + SAMENUMBER;

hasDuplicateInRow = true;

break;

}

}

//当列を確認

for (int i = 0; i < 9; i++)

{

if (dgvPlayArea[curColIndex, i].Value.Equals(input) && i != curRowIndex)

{

tbMessage.Text += "列" + (curColIndex + 1) + SAMENUMBER;

hasDuplicateInCol = true;

break;

}

}

//3x3 ミニブロックを確認

int blockX = curColIndex / 3;

int blockY = curRowIndex / 3;

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 3; j++)

{

int curX = blockX * 3 + i;

int curY = blockY * 3 + j;

if (dgvPlayArea[curX, curY].Value.Equals(input) && !(curX ==

curColIndex && curY == curRowIndex))

Page 24: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

24

checkHaveCompleted

{

tbMessage.Text += "ミニブロック[" + (blockX + 1) + "," + (blockY

+ 1) + "]" + SAMENUMBER;

hasDuplicateInBox = true;

break;

}

}

}

//当セルを色付ける

if (hasDuplicateInRow == false &&

hasDuplicateInCol == false &&

hasDuplicateInBox == false)

{

dgvPlayArea.CurrentCell.Style.BackColor = SystemColors.Window;

}

else

{

dgvPlayArea.CurrentCell.Style.BackColor = Color.Red;

}

}

private void checkHaveCompleted()

{ bool pass = true; //各セルに値が入力されているかどうか、エラーがないか、を確認 for (int row = 0; row < 9; row++) { for (int col = 0; col < 9; col++) { if (dgvPlayArea[col, row].Value.Equals("") || dgvPlayArea[col, row].Style.BackColor.Equals(Color.Red)) { return; } } } //各セルには値があり、かつエラーなし、 //念のため、入力と解答が一致することを確認 for (int row = 0; row < 9; row++) { for (int col = 0; col < 9; col++) { if (!dgvPlayArea[col, row].Value.Equals(dgvAnswer[col, row].Value)) { dgvPlayArea[col, row].Style.BackColor = Color.Red; tbMessage.Text += "[" + col + "," + row + "]の答えは違います。\r\n"; pass = false; } } } if (pass) tbMessage.Text = "正解!おめでとうございます!"; }

Page 25: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

25

3. 残りのボタンの Click ベントハンドラに、次の処理のコードを書く。

(ゕ) btnOpenGame_Click:保存データを開く

() btnSaveGame_Click:現在のゲームデータを保存する

(ウ) btnHint_Click:選んだセルの答えを表示する

(エ) btnAnswer_Click:答えの表示/非表示を切り替えるボタン

(ア)btnOpenGame_Click

private void btnOpenGame_Click(object sender, EventArgs e)

{ if (isDirty && getConfirmation(LOADCONFIRM) == false) { return; } if (File.Exists(SAVEPATH)) { XmlDocument xd = new XmlDocument(); xd.Load(SAVEPATH); XmlNode xnPuzzle = xd.GetElementsByTagName("puzzle")[0]; CurPuzzleID = xnPuzzle.Attributes[0].Value; loadPuzzle(); //保存したゲームの状態によってdgvPlayAreaに入力 for (int row = 0; row < 9; row++) { XmlNode node = xnPuzzle.ChildNodes[row]; string[] number = node.InnerText.Split(new char[] { ',' }); for (int col = 0; col < 9; col++) { if (dgvPlayArea[col, row].Value.Equals("") && !number[col].Equals("")) { dgvPlayArea.CurrentCell = dgvPlayArea[col, row]; dgvPlayArea[col, row].Value = number[col]; } } } tbMessage.Text = ""; dgvPlayArea.CurrentCell = null; isDirty = false; } else { MessageBox.Show("保存したゲームはありません。"); } }

Page 26: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

26

(イ)btnSaveGame_Click

private void btnSaveGame_Click(object sender, EventArgs e)

{ if (getConfirmation(SAVECONFIRM) == true) { XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; try { //ファイルを作成、Writerを作成 FileStream fs = new FileStream(SAVEPATH, FileMode.Create); XmlWriter w = XmlWriter.Create(fs, settings); //xmlの宣言を書く w.WriteStartDocument(); //DTDを書く //<!DOCTYPE save [ //<!ELEMENT save (puzzle*)> //<!ELEMENT puzzle (row*)> //<!ATTLIST puzzle id ID #REQUIRED> //]> string dtd = "<!ELEMENT save (puzzle*)>" + "<!ELEMENT puzzle (row*)>" + "<!ATTLIST puzzle id ID #REQUIRED>"; w.WriteDocType("save", null, null, dtd); //内容を書く w.WriteStartElement("save"); w.WriteStartElement("puzzle"); w.WriteAttributeString("id", CurPuzzleID); for (int row = 0; row < 9; row++) { string numbers = ""; for (int col = 0; col < 9; col++) { numbers += dgvPlayArea[col, row].Value.ToString() + ","; } numbers = numbers.Substring(0, numbers.Length - 1); w.WriteStartElement("row"); w.WriteValue(numbers); w.WriteEndElement(); //row } w.WriteEndElement(); //puzzle w.WriteEndElement(); //save w.WriteEndDocument(); w.Flush(); fs.Close(); isDirty = false; } catch (Exception ex) { MessageBox.Show(ex.Message, "保存失敗", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning); } } }

Page 27: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

27

(ウ)btnHint_Click

(エ)btnAnswer_Click

■ 完成

完成した「数独」を実行してみましょう。

本シリーズで完成したプロジェクトは、こちらからダウンロードできます。

→第 3 章で完成したプロジェクトのダウンロード

private void btnHint_Click(object sender, EventArgs e)

{

if (dgvPlayArea.CurrentCell == null)

{

MessageBox.Show("セルを選択してください。");

}

else

{

if (!dgvPlayArea.CurrentCell.ReadOnly &&

getConfirmation("選択したセルの答えを表示しますか。"))

{

dgvPlayArea.CurrentCell.Value =

dgvAnswer[dgvPlayArea.CurrentCell.ColumnIndex,

dgvPlayArea.CurrentCell.RowIndex].Value;

}

}

}

private void btnAnswer_Click(object sender, EventArgs e)

{

dgvAnswer.Visible = !dgvAnswer.Visible;

dgvAnswer.CurrentCell = null; }

Page 28: Visual Studio 2008 でゲームを作ろうdownload.microsoft.com/download/B/0/8/B080D49F-2429-4A60... · 2018-10-16 · 1 Visual Studio 2008 でゲームを作ろう - 気軽に始めるプログラミング

28

※環境によって、FrmSudoku の表示が多少異なります。サズ調整などを行ってください。

■ まとめ

本シリーズでは、Visual Studio 2008 (C#)を使って、「数独」パズルをプログラミングしてみま

した。一連の流れの中で、フォーム、ベントハンドラ、XML フゔルのリード、入力判定など、ソ

フトウェゕでよく使われる基本的なプログラミング手法を学習しました。

ここで作成したソースコードを参考にして、また、新たなプログラムに挑戦してみてください。