質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

C#

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

Visual Studio

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

Windows Forms

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

Q&A

解決済

1回答

2433閲覧

canvasで文字数の大きさに合わせて図形を自動で合わせるには?

SUGAKI

総合スコア16

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

C#

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

Visual Studio

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

Windows Forms

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

0グッド

0クリップ

投稿2019/10/15 03:57

編集2019/10/15 04:52

イメージ説明

前提・実現したいこと

作って覚えるC#2017のサンプルアプリで
1文字の漢字と同じ漢字の円を探して同じ色の円をクリックすると
正解の〇がでるというアプリがあり、
それを元に

CANVASを使い図形内の文字が2文字でもボールが流れるように移動させたい
(現在は跳ね返りなどは正確だが追加分の文字が残る)

発生している問題・エラーメッセージ

(現在は跳ね返りなどは正確だが追加分の文字が残る
不正解の文字を配列からランダムに表示させようとしたがエラーになる
あとは、不正解の文字をランダムに出現させようと
配列にしましたが取り出せなくなりました
(画像はランダムにしていないものです)

試したこと

半径の大きさを2倍にした
→円が大きくなるだけでした

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace MoveCircle 12{ 13 public partial class FormBallGame : Form 14 { 15 // クラス共通の変数 16 private Bitmap canvas; // 画面下の描画領域 17 private Ball[] balls; // 複数のボールを管理する配列 18 private string[] kanjis; // ボールに描く漢字の配列 19 private Brush[] brushes; // ボールを塗る色の配列 20 private string fontName = "HG教科書体"; // 表示する漢字のフォント名 21 private string correctText = "福嶋"; // 正解の文字:1つだけ 22 string[] ary = { 23"福隝", 24"福嶌", 25"幅嶋", 26"幅隝", 27"副隝", 28"副嶋", 29"福島", 30"愊隝", 31"楅嶋", 32"服隝", 33"伏島", 34"福縞"}; 35 private string mistakeText = ary[]; // 間違いの文字:ボールの個数分並ぶ 36 37 38 private string circleText = "○"; // 正解した場合背景の文字を○にする 39 private double nowTime = 0; // 経過時間 40 private int ballCount = 5; // ボールの数 41 private int randomResult = 0; // 正解の番号:0~ボールの数のいずれか 42 43 public FormBallGame() 44 { 45 InitializeComponent(); 46 } 47 48 //-------------------------------------------------------------------- 49 // イベントハンドラ 50 //-------------------------------------------------------------------- 51 52 // フォーム起動時に実行するLoad イベントに対応するイベントハンドラ 53 private void FormBallGame_Load(object sender, EventArgs e) 54 { 55 InitGraphics(); 56 SetStartPosition(); 57 } 58 59 // restartButtonのClick イベントに対応するイベントハンドラ 60 private void restartButton_Click(object sender, EventArgs e) 61 { 62 InitGraphics(); 63 SetStartPosition(); 64 } 65 66 // 上のselectPictureBoxのMouseClick イベントに対応するイベントハンドラ 67 private void selectPictureBox_MouseClick(object sender, MouseEventArgs e) 68 { 69 // 再スタートボタンが操作可能な場合は何もせずに処理終了 70 if (restartButton.Enabled) 71 { 72 return; 73 } 74 // 押されたX座標で正解判定 75 //<判定> 押されたボタンがマウスの左ボタン? 76 if (e.Button == MouseButtons.Left) 77 { 78 // どの円を選択したかを計算で算出(クリックしたX座標の位置/PictureBoxの横幅) 79 int selectCircle = e.X / selectPictureBox.Height; 80 if (randomResult == selectCircle) // 正解の円を選んだ 81 { 82 timer1.Stop(); 83 DrowMainPictureBox(Brushes.Red, circleText, true); 84 restartButton.Enabled = true; // 再スタートボタンを操作可能に 85 } 86 else // 失敗 87 { 88 DrowMainPictureBox(Brushes.Red, correctText, false); 89 // 移動の割合を減少させる 90 for (int i = 0; i < ballCount; i++) 91 { 92 balls[i].pitch = balls[i].pitch - balls[i].pitch / 2; 93 } 94 nowTime = nowTime + 10; // ペナルティー 95 } 96 } 97 } 98 99 // 下のmainPictureBoxのMouseClick イベントに対応するイベントハンドラ 100 private void mainPictureBox_MouseClick(object sender, MouseEventArgs e) 101 { 102 // 再スタートボタンが操作可能な場合は何もせずに処理終了 103 if (restartButton.Enabled) 104 { 105 return; 106 } 107 SetBalls(e.X, e.Y); // マウスをクリックした位置にボールをセット 108 } 109 110 // TimerコントロールのTick イベントに対応するイベントハンドラ 111 private void timer1_Tick(object sender, EventArgs e) 112 { 113 for (int i = 0; i < ballCount; i++) 114 { 115 balls[i].Move(); 116 } 117 118 nowTime = nowTime + 0.02; 119 textTimer.Text = nowTime.ToString("0.00"); 120 } 121 122 //-------------------------------------------------------------------- 123 // 独自のメソッド 124 //-------------------------------------------------------------------- 125 126 // 上のselectPictureBoxに円を描く 127 private void DrowCircleSelectPictureBox() 128 { 129 int height = selectPictureBox.Height; // 高さ 130 int width = selectPictureBox.Width; // 幅 131 Bitmap selectCanvas = new Bitmap(width, height); 132 using (Graphics g = Graphics.FromImage(selectCanvas)) 133 { 134 //g.FillEllipse(Brushes.LightBlue, 0, 0, height, height); 135 for (int i = 0; i < ballCount; i++) 136 { 137 g.FillEllipse(brushes[i], i * height, 0, height, height); 138 } 139 selectPictureBox.Image = selectCanvas; 140 } 141 } 142 143 // 下のPictureBoxに描画する 144 private void DrowMainPictureBox(Brush color, string text, bool trueFlag) 145 { 146 int height = mainPictureBox.Height; // 高さ 147 int width = mainPictureBox.Width; // 幅 148 //描画先とするImageオブジェクトを作成する 149 if (canvas == null) 150 { 151 canvas = new Bitmap(width, height); 152 } 153 using (Graphics g = Graphics.FromImage(canvas)) 154 { 155 // 正解用の背景色にする 156 if (trueFlag) 157 { 158 g.FillRectangle(Brushes.LightPink, 0, 0, width, height); 159 } 160 else 161 { 162 g.FillRectangle(Brushes.White, 0, 0, width, height); 163 } 164 //背景に引数で指定した文字列を描画する 165 g.DrawString(text, 166 new Font(fontName, height - height / 4), 167 color, 0, 0, new StringFormat()); 168 //MainPictureBoxに表示する 169 mainPictureBox.Image = canvas; 170 } 171 } 172 173 // 配列の初期化、画面の初期設定を行う 174 private void InitGraphics() 175 { 176 brushes = new Brush[ballCount]; 177 kanjis = new string[ballCount]; 178 balls = new Ball[ballCount]; 179 // ブラシの色の設定 180 181 // 色の詳細はこちら: https://msdn.microsoft.com/ja-JP/Library/aa358802.aspx 182 brushes[0] = Brushes.LightPink; 183 brushes[1] = Brushes.LightBlue; 184 brushes[2] = Brushes.LightGray; 185 brushes[3] = Brushes.LightCoral; 186 brushes[4] = Brushes.LightGreen; 187 // 上のImageオブジェクト 188 DrowCircleSelectPictureBox(); 189 // 下のImageオブジェクト 190 DrowMainPictureBox(Brushes.Gray, correctText, false); 191 restartButton.Enabled = false; // 再スタートボタンを操作できないようにする 192 textHunt.Text = correctText; 193 194 } 195 196 197 // ボールのインスタンスの作成とランダムな位置にボールを描く 198 private void SetStartPosition() 199 { 200 // 漢字の設定 201 for (int i = 0; i < ballCount; i++) 202 { 203 kanjis[i] = mistakeText; // 間違いの文字をセット 204 } 205 randomResult = new Random().Next(ballCount); //ボールの数分の乱数を取得 206 kanjis[randomResult] = correctText; // 正解の文字の文字をセット 207 // ボールクラスのインスタンス作成 208 for (int i = 0; i < ballCount; i++) 209 { 210 balls[i] = new Ball(mainPictureBox, canvas, brushes[i], kanjis[i]); 211 } 212 // ランダムな位置にボールを描く 213 int rndXMax = mainPictureBox.Width; 214 int rndYMax = mainPictureBox.Height; 215 SetBalls(new Random().Next(rndXMax), new Random().Next(rndYMax)); 216 // タイマーをスタートさせる 217 nowTime = 0; 218 timer1.Start(); 219 } 220 221 222 // 引数の位置情報を利用してランダムにボールを描く 223 private void SetBalls(int x, int y) 224 { 225 int rndXMax = mainPictureBox.Width; 226 int rndYMax = mainPictureBox.Height; 227 int rndX; 228 int rndY; 229 for (int i = 0; i < ballCount; i++) 230 { 231 rndX = new Random(i * x).Next(rndXMax); 232 rndY = new Random(i * y).Next(rndYMax); 233 balls[i].DeleteCircle(); // 以前のボールを削除 234 balls[i].PutCircle(rndX, rndY); // 新しい位置にボールを描く 235 } 236 } 237 } 238} 239

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

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

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

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

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

y_waiwai

2019/10/15 04:14

これではコードが見づらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
SUGAKI

2019/10/15 04:19

大変申し訳ございません。 失礼いたしました。 これから修正します
SUGAKI

2019/10/15 04:24

直しました、質問の仕方も色々間違えているかもしれないので お手数でなければまた教えてください
SUGAKI

2019/10/15 04:33

今気づいたのですが今回テンプレートを使うのを忘れていたようです・・・ 見づらくて申し訳ございません
guest

回答1

0

自己解決

自己解決しましたありがとうございました

投稿2019/10/17 06:29

SUGAKI

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問