前回までに作成したテトリスですが、
見た目はこんな感じです。
これではちょっとショボすぎるので、改良します。背景を黒にして、フォールドを灰色のブロックで囲います。これだけでもかなり見た目はかわります。
まずなにもない部分の色を黒に変更します。それから後で気が変わったときに簡単に変更できるようにフィールド変数 ClearColorを定義します。
1 |
Color ClearColor = Color.Black; |
まず、フィールドを灰色のブロックで囲います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { List<Block> CreateOutskirts() { List<Block> outskirtBlocks = new List<Block>(); for(int row = 0; row < FIELD_INNER_HEIGHT; row++) { outskirtBlocks.Add(new Block(-1, row, this)); } for(int row = 0; row < FIELD_INNER_HEIGHT; row++) { outskirtBlocks.Add(new Block(FIELD_INNER_WIDTH, row, this)); } for(int colum = -1; colum < FIELD_INNER_WIDTH+1; colum++) { outskirtBlocks.Add(new Block(colum, FIELD_INNER_HEIGHT, this)); } return outskirtBlocks; } } |
これで外周のブロックが生成されるようになります。あとは自作メソッド InitFieldのなかでCreateOutskirtsを呼べば外周ブロックが描画され、まとめて色をつけることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public partial class Form1 : Form { void InitField() { this.BackColor = ClearColor; for(int colum = 0; colum < FIELD_INNER_WIDTH; colum++) { for(int row = 0; row < FIELD_INNER_HEIGHT; row++) { Block block = new Block(colum, row, this); Field[colum, row] = block; } } ClearField(); List<Block> outskirtBlocks = CreateOutskirts(); foreach(var block in outskirtBlocks) { block.BackColor = Color.LightGray; } } } |
背景は黒にします。さきほど定義したClearColorをつかってなにもない部分は黒にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public partial class Form1 : Form { void ClearField() { MovingTetoros.Clear(); FixedTetoro.Clear(); for(int colum = 0; colum < FIELD_INNER_WIDTH; colum++) { for(int row = 0; row < FIELD_INNER_HEIGHT; row++) { Block block = Field[colum, row]; block.BackColor = ClearColor; } } } } |
またテトリミノが落下しているときに呼ばれる自作メソッド ClearOldTetoroとブロックがそろったときにラインを消すための自作メソッド DeleteLineIfNeedも一部変更になります。
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 |
public partial class Form1 : Form { void ClearOldTetoro() { foreach(Block block in MovingTetoros) block.BackColor = ClearColor; // 変更箇所 MovingTetoros.Clear(); } void DeleteLineIfNeed() { List<int> lines = GetDeleteLine().OrderBy(x=>x).ToList(); foreach(int i in lines) { var deleteBlocks = FixedTetoro.Where(x => x.Row == i).ToList(); FixedTetoro = FixedTetoro.Except(deleteBlocks).ToList(); FixedTetoro = FixedTetoro.Select(x => { if(x.Row < i) return Field[x.Colum, x.Row + 1]; else return Field[x.Colum, x.Row]; }).ToList(); for(int row = i; row> 0; row--) { for(int colum = 0; colum < FIELD_INNER_WIDTH; colum++) { Field[colum, row].BackColor = Field[colum, row - 1].BackColor; } } // 変更箇所 一番上はなにもないのでClearColorにする for(int colum = 0; colum < FIELD_INNER_WIDTH; colum++) Field[colum, 0].BackColor = ClearColor; } } } |
あと新しいテトリミノが出現する位置ですが、左上ではなく一番上の列の中央のほうが自然です。中央がどこになるかはフィールドの幅からテトリミノの幅を引き、半分にすれば求めることができます。
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 |
public partial class Form1 : Form { void ShowNewTetoro() { MovingTetoros.Clear(); int startX = (FIELD_INNER_WIDTH - TETORO_SIZE) / 2; Tetoro_Type = random.Next(0, 7); MovingTetoroPos = new Point(startX, 0); ClearOldTetoro(); bool[,] tetoro = Tetoros[Tetoro_Type]; // I - テトリミノ(水色) // O - テトリミノ(黄色) // S - テトリミノ(緑) // Z - テトリミノ(赤) // J - テトリミノ(青) // L - テトリミノ(オレンジ) // T - テトリミノ(紫) Color tetoroColor = Color.Empty; if(Tetoro_Type == 0) tetoroColor = Color.Aqua; if(Tetoro_Type == 1) tetoroColor = Color.Yellow; if(Tetoro_Type == 2) tetoroColor = Color.Green; if(Tetoro_Type == 3) tetoroColor = Color.Red; if(Tetoro_Type == 4) tetoroColor = Color.Blue; if(Tetoro_Type == 5) tetoroColor = Color.Orange; if(Tetoro_Type == 6) tetoroColor = Color.Violet; List<Block> blocks = new List<Block>(); for(int colum = 0; colum < TETORO_SIZE; colum++) { for(int row = 0; row < TETORO_SIZE; row++) { if(tetoro[row, colum]) { Field[colum+ startX, row].BackColor = tetoroColor; blocks.Add(Field[colum + startX, row]); } } } MovingTetoros = blocks; if(FixedTetoro.Intersect(MovingTetoros).Count() != 0) { OnGameOver(); } } } |
またゲームオーバーになったときはわかるように表示することにします。
こんな感じにしておいて(Labelを使用)、ゲーム中は非表示にしておいてゲームオーバーになったら文字色を白などの見えやすい色にして表示させることにします。
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 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Size = new Size(480, 520); Timer.Tick += Timer_Tick; labelGameOver.Visible = false; } private void startToolStripMenuItem_Click(object sender, EventArgs e) { GameStart(); } void GameStart() { labelGameOver.Visible = false; ClearField(); ShowNewTetoro(); Timer.Interval = 1000; Timer.Start(); } void OnGameOver() { Timer.Stop(); labelGameOver.ForeColor = Color.White; labelGameOver.Visible = true; } } |