完成品はこんな感じになります。
連鎖の回数がわかるようにする
ぷよを消す C#でぷよぷよもどきを作るの続きです。ぷよが消えるときに連鎖の回数がわかるようにします。
ぷよぷよ通 – 素材 – しろま空間からダウンロードした素材のなかには番号がついているものがあります。これを使えば連鎖の回数を表示させることができます。
これをリソースに追加します。
プログラムが始まったら、イメージを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
public partial class Form1 : Form { Image redPuyoImage = null; Image bluePuyoImage = null; Image greenPuyoImage = null; Image yellowPuyoImage = null; Image wallImage = null; List<Image> redImages = new List<Image>(); List<Image> greenImages = new List<Image>(); List<Image> blueImages = new List<Image>(); List<Image> yellowImages = new List<Image>(); public Form1() { InitializeComponent(); Field.Paint += Field_Paint; Field.KeyDown += Field_KeyDown; this.BackColor = Color.Black; Field.BorderStyle = BorderStyle.None; GetPuyoImages(); // これを追加 InitCells(); } void GetPuyoImages() { redPuyoImage = Properties.Resources.Red; bluePuyoImage = Properties.Resources.Blue; greenPuyoImage = Properties.Resources.Green; yellowPuyoImage = Properties.Resources.Yellow; wallImage = Properties.Resources.Wall; redImages.Add(Properties.Resources.Red01); redImages.Add(Properties.Resources.Red02); redImages.Add(Properties.Resources.Red03); redImages.Add(Properties.Resources.Red04); redImages.Add(Properties.Resources.Red05); redImages.Add(Properties.Resources.Red06); redImages.Add(Properties.Resources.Red07); redImages.Add(Properties.Resources.Red08); redImages.Add(Properties.Resources.Red09); redImages.Add(Properties.Resources.Red10); redImages.Add(Properties.Resources.Red11); redImages.Add(Properties.Resources.Red12); redImages.Add(Properties.Resources.Red13); redImages.Add(Properties.Resources.Red14); redImages.Add(Properties.Resources.Red15); redImages.Add(Properties.Resources.Red16); redImages.Add(Properties.Resources.Red17); redImages.Add(Properties.Resources.Red18); redImages.Add(Properties.Resources.Red19); greenImages.Add(Properties.Resources.Green01); greenImages.Add(Properties.Resources.Green02); greenImages.Add(Properties.Resources.Green03); greenImages.Add(Properties.Resources.Green04); greenImages.Add(Properties.Resources.Green05); greenImages.Add(Properties.Resources.Green06); greenImages.Add(Properties.Resources.Green07); greenImages.Add(Properties.Resources.Green08); greenImages.Add(Properties.Resources.Green09); greenImages.Add(Properties.Resources.Green10); greenImages.Add(Properties.Resources.Green11); greenImages.Add(Properties.Resources.Green12); greenImages.Add(Properties.Resources.Green13); greenImages.Add(Properties.Resources.Green14); greenImages.Add(Properties.Resources.Green15); greenImages.Add(Properties.Resources.Green16); greenImages.Add(Properties.Resources.Green17); greenImages.Add(Properties.Resources.Green18); greenImages.Add(Properties.Resources.Green19); blueImages.Add(Properties.Resources.Blue01); blueImages.Add(Properties.Resources.Blue02); blueImages.Add(Properties.Resources.Blue03); blueImages.Add(Properties.Resources.Blue04); blueImages.Add(Properties.Resources.Blue05); blueImages.Add(Properties.Resources.Blue06); blueImages.Add(Properties.Resources.Blue07); blueImages.Add(Properties.Resources.Blue08); blueImages.Add(Properties.Resources.Blue09); blueImages.Add(Properties.Resources.Blue10); blueImages.Add(Properties.Resources.Blue11); blueImages.Add(Properties.Resources.Blue12); blueImages.Add(Properties.Resources.Blue13); blueImages.Add(Properties.Resources.Blue14); blueImages.Add(Properties.Resources.Blue15); blueImages.Add(Properties.Resources.Blue16); blueImages.Add(Properties.Resources.Blue17); blueImages.Add(Properties.Resources.Blue18); blueImages.Add(Properties.Resources.Blue19); yellowImages.Add(Properties.Resources.Yellow01); yellowImages.Add(Properties.Resources.Yellow02); yellowImages.Add(Properties.Resources.Yellow03); yellowImages.Add(Properties.Resources.Yellow04); yellowImages.Add(Properties.Resources.Yellow05); yellowImages.Add(Properties.Resources.Yellow06); yellowImages.Add(Properties.Resources.Yellow07); yellowImages.Add(Properties.Resources.Yellow08); yellowImages.Add(Properties.Resources.Yellow09); yellowImages.Add(Properties.Resources.Yellow10); yellowImages.Add(Properties.Resources.Yellow11); yellowImages.Add(Properties.Resources.Yellow12); yellowImages.Add(Properties.Resources.Yellow13); yellowImages.Add(Properties.Resources.Yellow14); yellowImages.Add(Properties.Resources.Yellow15); yellowImages.Add(Properties.Resources.Yellow16); yellowImages.Add(Properties.Resources.Yellow17); yellowImages.Add(Properties.Resources.Yellow18); yellowImages.Add(Properties.Resources.Yellow19); } } |
長々と書いてしまいましたが、PNGファイルからイメージを取得してリストに格納しているだけです。
GetImageFromPuyoTypeRensaメソッドの作成
ぷよと番号を与えればイメージが取得できるメソッドを作成します。20連鎖以上には対応できないのでそのときは「19」と表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public partial class Form1 : Form { Image GetImageFromPuyoTypeRensa(Puyo puyo, int rensa) { if(puyo == Puyo.Puyo1) { if(rensa < redImages.Count) return redImages[rensa-1]; else return redImages[redImages.Count - 1]; } if(puyo == Puyo.Puyo2) { if(rensa < blueImages.Count) return blueImages[rensa - 1]; else return blueImages[blueImages.Count - 1]; } if(puyo == Puyo.Puyo3) { if(rensa < greenImages.Count) return greenImages[rensa - 1]; else return greenImages[greenImages.Count - 1]; } if(puyo == Puyo.Puyo4) { if(rensa < yellowImages.Count) return yellowImages[rensa - 1]; else return yellowImages[yellowImages.Count - 1]; } return null; } } |
OnFixedメソッドの変更
OnFixedメソッドを一部変更します。
ぷよが固定されたら4つ以上くっついているかどうか確認して、該当するものがあれば消します。このあいだはキー入力があっても無視することにして、ぷよを落下させるために使用していたタイマーも止めてしまいます。
DeletePuyoIfNeedメソッドは名前の通り、必要であればぷよを消すためのものです。これがtrueを返すのであれば連鎖の可能性があります。falseを返すのであれば連鎖はこれ以上ないということがはっきりするのでループから抜けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { async void OnFixed() { isIgnoreKeyDown = true; timer1.Stop(); int rensa = 1; while(true) { Task<bool> task = DeletePuyoIfNeed(rensa); bool ret = await task; if(ret == false) break; rensa++; } isIgnoreKeyDown = false; timer1.Start(); CreateNewPuyo(); } } |
DeletePuyoIfNeedメソッドを示します。設置されたプヨの下に空洞があれば上のプヨを落として空洞をうめます。そして消えるぷよがあるかどうか調べます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
public partial class Form1 : Form { async Task<bool> DeletePuyoIfNeed(int rensa) { bool ret = false; // 設置されたプヨの下に空洞があれば上のプヨを落として空洞をうめる Task<bool> task = DownPuyoIfSpaces(); await task; List<Cell> deleteCells = new List<Cell>(); // 4つつながっているぷよがあるか探す for(int i = 0; i < FIELD_HEIGHT; i++) { for(int j = 0; j < FIELD_WIDTH; j++) { Cell cell = Cells[i, j]; if(deleteCells.Any(x => x == cell)) continue; // 連鎖と同時消しは区別するため別の変数に格納する List<Cell> cells = GetConectedCell(cell); ClearCheck(); if(cells.Count >= 4) { ret = true; deleteCells.AddRange(cells); // 消えるぷよに連鎖回数がわかるように番号をつける Puyo puyo = cells[0].Puyo; Image image = GetImageFromPuyoTypeRensa(puyo, rensa); Graphics g = Graphics.FromHwnd(Field.Handle); foreach(Cell cell1 in cells) { Rectangle rect = new Rectangle(cell1.LeftTop, Cell.Size); g.DrawImage(image, rect); } g.Dispose(); } } } // ぷよを実際に消す foreach(Cell cell0 in deleteCells) { cell0.Puyo = Puyo.None; } if(ret) { await Task.Delay(1000); Field.Invalidate(); } return ret; } } |