C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 敵を5体倒したらクリアのゲームにしたいのですが


(過去ログ 93 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■55855 / inTopicNo.1)  敵を5体倒したらクリアのゲームにしたいのですが
  
□投稿者/ プリッツ (1回)-(2010/12/16(Thu) 00:11:30)

分類:[C#] 

C#の質問です。

下のプログラムに敵を5体倒したらプログラムが止まりクリアと表示されるゲームにしたいのですがどう付け足せばよいのでしょうか。


知恵を貸してください。


using System;
using System.Collections.Generic; //for .NET 2.0
using System.Drawing;
using System.Windows.Forms;

public class Shooting : Form
{
/// <summary>
/// ゲームの状態を進行させるタイマー
/// </summary>
private Timer timer;

/// <summary>
/// ゲーム内容を描画するバッファ
/// </summary>
private Bitmap buffer;

/// <summary>
/// ユーザーが操作する機体オブジェクト
/// </summary>
private ShootingIcon userIcon;

/// <summary>
/// ユーザーのミサイルの配列
/// </summary>

private List<ShootingIcon> userMissiles; //for .NET 2.0

/// <summary>
/// 敵の機体オブジェクトの配列
/// </summary>

private List<ShootingIcon> kita; //for .NET 2.0

/// <summary>
/// 敵が射出したミサイルの配列
/// </summary>

private List<ShootingIcon> kitaMissiles; //for .NET 2.0

/// <summary>
/// 敵がミサイルを発射するかどうかを決定する乱数
/// </summary>
private Random random;

/// <summary>
/// ユーザーの機体として描画されるイメージ
/// </summary>
private Image userImage;

/// <summary>
/// ユーザーのミサイルとして描画されるイメージ
/// </summary>
private Image userMissileImage;

/// <summary>
/// 敵の機体として描画されるイメージ
/// </summary>
private Image enemyImage;

/// <summary>
/// 敵のミサイルとして描画されるイメージ
/// </summary>
private Image enemyMissileImage;

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);

Graphics g = Graphics.FromImage(buffer);

Brush brush = new SolidBrush(Color.Black); //背景色
g.FillRectangle(brush, 0, 0, buffer.Width, buffer.Height);

g.DrawImage(userIcon.Image, userIcon.X, userIcon.Y);
for(int i = 0 ; i < userMissiles.Count ; i++)
{
ShootingIcon missile = (ShootingIcon)userMissiles[i];
g.DrawImage(missile.Image, missile.X, missile.Y);
}
for(int i = 0 ; i < kita.Count ; i++)
{
ShootingIcon enemy = (ShootingIcon)kita[i];
g.DrawImage(enemy.Image, enemy.X, enemy.Y);
}
for(int i = 0 ; i < kitaMissiles.Count ; i++)
{
ShootingIcon missile = (ShootingIcon)kitaMissiles[i];
g.DrawImage(missile.Image, missile.X, missile.Y);
}

e.Graphics.DrawImage(buffer, 0, 0);
}

protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown (e);
if(e.KeyCode == Keys.Left ) //方向キー左で左に行く
{
userIcon.X -= 25; //自分の左に進む距離
}
else if(e.KeyCode == Keys.Right)  //方向キー右で右に行く
{
userIcon.X += 25; //自分の右に進む距離
}
else if(e.KeyCode == Keys.Space) //スペースキーでミサイルを打つ
{
Fire();
}

Invalidate();
}

private void timer_Tick(object sender, EventArgs e)
{
//新しい敵を生成
if(kita.Count < 4)
{
ShootingIcon enemy = new ShootingIcon(
enemyImage, random.Next(buffer.Width - enemyImage.Width), 0
);
kita.Add(enemy);
}

//敵がランダムでミサイルを発射
if(random.Next(100) <0) //敵のミサイル数
{
int index = random.Next(kita.Count);
ShootingIcon enemy = (ShootingIcon)kita[index];
ShootingIcon missile = new ShootingIcon(
enemyMissileImage,
enemy.X + enemy.Width / 2 - enemy.Width / 2,
enemy.Y + enemy.Height
);
kitaMissiles.Add(missile);
}
//敵ミサイルを移動
for(int i = 0 ; i < kitaMissiles.Count ; i++)
{
ShootingIcon missile = (ShootingIcon)kitaMissiles[i];
missile.Y += 5;
if (missile.Y >= buffer.Height) kitaMissiles.RemoveAt(i);
}
//ユーザーのミサイルを移動
for(int i = 0 ; i < userMissiles.Count ; i++)
{
ShootingIcon missile = (ShootingIcon)userMissiles[i];
missile.Y -= 5;
if(missile.Y + missile.Height < 0) userMissiles.RemoveAt(i);
}

//敵が画面外に消えたら削除する
for(int i = 0 ; i < kita.Count ; i++)
{
ShootingIcon enemy = (ShootingIcon)kita[i];
enemy.Y += 4;

if(i % 2 == 0) enemy.X += 2;
else enemy.X -= 2;

if(enemy.X < 0)
{
kita.RemoveAt(i);
continue;
}
else if(enemy.X + enemy.Width > buffer.Width)
{
kita.RemoveAt(i);
continue;
}
else if(enemy.Y > buffer.Height)
{
kita.RemoveAt(i);
continue;
}
}

//敵の当たり判定
for(int i = 0 ; i < kita.Count ; i++)
{
ShootingIcon enemy = (ShootingIcon)kita[i];

//ユーザーが敵に接触しているかどうか
if(enemy.Bounds.IntersectsWith(userIcon.Bounds))
{
//敵に接触
timer.Stop();//ゲームを止める
MessageBox.Show(this, "ゲームオーバーです","お疲れ様でした");
break;


}






//ユーザーミサイルが敵に接触しているかどうか
for(int j = 0 ; j < userMissiles.Count ; j++)
{
ShootingIcon missile = (ShootingIcon)userMissiles[j];
if(enemy.Bounds.IntersectsWith(missile.Bounds))
{
//敵に着弾
userMissiles.RemoveAt(j);//自分のミサイルが消える
kita.RemoveAt(i);//敵が消える
break;
}





}



}

//敵のミサイルに接触したかどうか
for(int i = 0 ; i < kitaMissiles.Count ; i++)
{
ShootingIcon missile = (ShootingIcon)kitaMissiles[i];
if(missile.Bounds.IntersectsWith(userIcon.Bounds))
{
//ミサイルに接触
timer.Stop(); //ゲームを止める
MessageBox.Show(this, "ゲームオーバーです","お疲れ様でした");

break;

}




}




Invalidate();
}

/// <summary>
/// ユーザーのミサイルを発射する
/// </summary>
/// <returns>ミサイルが発射できれば true</returns>
public bool Fire()
{
if(userMissiles.Count >= 22) return false; //ミサイルの発射数
int x = userIcon.X + (userIcon.Width / 2) - (userMissileImage.Width / 2);
int y = userIcon.Y - userMissileImage.Height;
ShootingIcon missile = new ShootingIcon(userMissileImage, x, y);
userMissiles.Add(missile);
return true;
}

public Shooting()
{
SetStyle(
ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true
);

buffer = new Bitmap(640, 550); //使える画面の大きさ
random = new Random();


userMissiles = new List<ShootingIcon>(); //for .NET 2.0


kita = new List<ShootingIcon>(); //for .NET 2.0


kitaMissiles = new List<ShootingIcon>(); //for .NET 2.0

timer = new Timer();
timer.Interval = 60; //敵の速さ
timer.Tick += new EventHandler(timer_Tick);
timer.Start();


userImage = Image.FromFile("sen.gif");//自分
userMissileImage = Image.FromFile("kousen.gif");//自分のミサイル
enemyImage = Image.FromFile("kita.gif");//敵
enemyMissileImage = Image.FromFile("kousen1.gif");//敵のミサイル
userIcon = new ShootingIcon(
userImage, buffer.Width / 2 - userImage.Width / 2,
buffer.Height - userImage.Height
);
}
static void Main()
{
Form form = new Shooting();
form.ClientSize = new Size(640, 550); //画面の大きさ
Application.Run(form);
}









}









引用返信 編集キー/
■55859 / inTopicNo.2)  Re[1]: 敵を5体倒したらクリアのゲームにしたいのですが
□投稿者/ επιστημη (2575回)-(2010/12/16(Thu) 05:51:57)
επιστημη さんの Web サイト
# こんなの読む気になんネーヨ...

なんか難しいことあるんかしら?
倒した敵の数勘定しといて、5になったら抜ければいいんでしょ?
timer_Tick()の中あたりで if ( 倒した数 >= 5 ) { どーのこーの } じゃダメすか?

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -