你能否指导我用C#做一款打砖块的WPF游戏?并告诉我代码的来源
当然可以!下面是一个简单的用C#和WPF制作的打砖块游戏的代码示例:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace BrickBreakerGame
{
public partial class MainWindow : Window
{
private const int PaddleWidth = 100;
private const int PaddleHeight = 20;
private const int BallSize = 20;
private const int BrickWidth = 80;
private const int BrickHeight = 30;
private const int Rows = 5;
private const int Columns = 10;
private Rectangle paddle;
private Ellipse ball;
private int ballSpeedX = 5;
private int ballSpeedY = 5;
private int score = 0;
private int bricksCount = Rows * Columns;
public MainWindow()
{
InitializeComponent();
CreatePaddle();
CreateBall();
CreateBricks();
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler(Update);
timer.Interval = new TimeSpan(0, 0, 0, 0, 10);
timer.Start();
}
private void CreatePaddle()
{
paddle = new Rectangle();
paddle.Width = PaddleWidth;
paddle.Height = PaddleHeight;
paddle.Fill = Brushes.Blue;
Canvas.SetBottom(paddle, 10);
Canvas.SetLeft(paddle, (canvas.ActualWidth - PaddleWidth) / 2);
canvas.Children.Add(paddle);
}
private void CreateBall()
{
ball = new Ellipse();
ball.Width = BallSize;
ball.Height = BallSize;
ball.Fill = Brushes.Red;
Canvas.SetBottom(ball, canvas.ActualHeight / 2 - BallSize);
Canvas.SetLeft(ball, canvas.ActualWidth / 2 - BallSize);
canvas.Children.Add(ball);
}
private void CreateBricks()
{
for (int i = 0; i < Rows; i++)
{
for (int j = 0; j < Columns; j++)
{
Rectangle brick = new Rectangle();
brick.Width = BrickWidth;
brick.Height = BrickHeight;
brick.Fill = Brushes.Green;
Canvas.SetTop(brick, i * BrickHeight);
Canvas.SetLeft(brick, j * BrickWidth);
canvas.Children.Add(brick);
}
}
}
private void Update(object sender, EventArgs e)
{
MovePaddle();
MoveBall();
CheckCollision();
}
private void MovePaddle()
{
if (Keyboard.IsKeyDown(Key.Left) && Canvas.GetLeft(paddle) > 0)
{
Canvas.SetLeft(paddle, Canvas.GetLeft(paddle) - 10);
}
if (Keyboard.IsKeyDown(Key.Right) && Canvas.GetLeft(paddle) + PaddleWidth < canvas.ActualWidth)
{
Canvas.SetLeft(paddle, Canvas.GetLeft(paddle) + 10);
}
}
private void MoveBall()
{
Canvas.SetLeft(ball, Canvas.GetLeft(ball) + ballSpeedX);
Canvas.SetTop(ball, Canvas.GetTop(ball) + ballSpeedY);
if (Canvas.GetLeft(ball) <= 0 || Canvas.GetLeft(ball) + BallSize >= canvas.ActualWidth)
{
ballSpeedX *= -1;
}
if (Canvas.GetTop(ball) <= 0)
{
ballSpeedY *= -1;
}
if (Canvas.GetTop(ball) + BallSize >= canvas.ActualHeight)
{
GameOver();
}
}
private void CheckCollision()
{
if (Canvas.GetTop(ball) + BallSize >= canvas.ActualHeight - PaddleHeight - 10 &&
Canvas.GetLeft(ball) + BallSize >= Canvas.GetLeft(paddle) &&
Canvas.GetLeft(ball) <= Canvas.GetLeft(paddle) + PaddleWidth)
{
ballSpeedY *= -1;
}
foreach (var item in canvas.Children)
{
if (item is Rectangle)
{
Rectangle brick = item as Rectangle;
if (Canvas.GetTop(ball) <= Canvas.GetTop(brick) + BrickHeight &&
Canvas.GetTop(ball) + BallSize >= Canvas.GetTop(brick) &&
Canvas.GetLeft(ball) + BallSize >= Canvas.GetLeft(brick) &&
Canvas.GetLeft(ball) <= Canvas.GetLeft(brick) + BrickWidth)
{
canvas.Children.Remove(brick);
ballSpeedY *= -1;
score++;
bricksCount--;
if (bricksCount == 0)
{
GameOver();
}
break;
}
}
}
}
private void GameOver()
{
MessageBox.Show("Game Over! Score: " + score);
Environment.Exit(0);
}
}
}
这段代码使用了WPF中的Canvas来创建游戏界面,并在Canvas上绘制了挡板、小球和砖块。通过键盘控制挡板的移动,小球会沿着一定的速度进行运动,并且会检测与挡板和砖块的碰撞情况。当小球触碰到底部边界或者砖块全部被消除时,游戏结束。
希望这个示例能对你有所帮助
原文地址: https://www.cveoy.top/t/topic/ikmb 著作权归作者所有。请勿转载和采集!