ChatGPT帮我用WPF制作一个简易贪吃蛇小游戏

您所在的位置:网站首页 帮我写一对春联 ChatGPT帮我用WPF制作一个简易贪吃蛇小游戏

ChatGPT帮我用WPF制作一个简易贪吃蛇小游戏

2023-06-26 13:31| 来源: 网络整理| 查看: 265

User: 帮我生成一个WPF的应用程序,做一个贪吃蛇的小游戏,要完整的示例。 ChatGTP: 当然!以下是一个完整的WPF应用程序示例,用于实现贪吃蛇小游戏:

MainWindow.xaml:

MainWindow.xaml.cs:

using System.Collections.Generic; using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; namespace SnakeGame { public partial class MainWindow : Window { private const int CellSize = 20; private const int GridWidth = 20; private const int GridHeight = 20; private readonly SnakeGameLogic gameLogic; private readonly Dictionary keyMappings; public MainWindow() { InitializeComponent(); gameLogic = new SnakeGameLogic(GridWidth, GridHeight); keyMappings = new Dictionary { { Key.Left, Direction.Left }, { Key.Right, Direction.Right }, { Key.Up, Direction.Up }, { Key.Down, Direction.Down } }; InitializeGameGrid(); StartGameLoop(); } private void InitializeGameGrid() { gameGrid.Children.Clear(); gameGrid.RowDefinitions.Clear(); gameGrid.ColumnDefinitions.Clear(); for (int row = 0; row gameGrid.ColumnDefinitions.Add(new ColumnDefinition()); } } private void RenderGame() { gameGrid.Children.Clear(); // Render snake foreach (var segment in gameLogic.Snake) { var snakePart = new Rectangle { Width = CellSize, Height = CellSize, Fill = Brushes.Green }; Grid.SetRow(snakePart, segment.Y); Grid.SetColumn(snakePart, segment.X); gameGrid.Children.Add(snakePart); } // Render food var food = gameLogic.Food; var foodElement = new Ellipse { Width = CellSize, Height = CellSize, Fill = Brushes.Red }; Grid.SetRow(foodElement, food.Y); Grid.SetColumn(foodElement, food.X); gameGrid.Children.Add(foodElement); } private void StartGameLoop() { CompositionTarget.Rendering += GameLoop; } private void GameLoop(object sender, System.EventArgs e) { gameLogic.Update(); RenderGame(); } private void Window_KeyDown(object sender, KeyEventArgs e) { if (keyMappings.ContainsKey(e.Key)) { Direction direction = keyMappings[e.Key]; gameLogic.HandleKeyPress(direction); } } } }

SnakeGameLogic.cs:

using System; using System.Collections.Generic; using System.Windows; namespace SnakeGame { public enum Direction { Up, Down, Left, Right } public class SnakeGameLogic { private const int InitialSnakeLength = 4; private readonly Random random; private Direction currentDirection; private bool isFoodEaten; public int GridWidth { get; } public int GridHeight { get; } public List Snake { get; } public Point Food { get; private set; } public bool IsRunning { get; private set; } public int Score { get; private set; } public SnakeGameLogic(int gridWidth, int gridHeight) { GridWidth = gridWidth; GridHeight = gridHeight; Snake = new List(); random = new Random(); currentDirection = Direction.Right; isFoodEaten = false; int initialX = GridWidth / 2; int initialY = GridHeight / 2; for (int i = 0; i if (!IsRunning) { return; } Point currentHead = Snake[0]; Point newHead = GetNextHeadPosition(currentHead); if (IsCollision(newHead) || IsWallCollision(newHead)) { IsRunning = false; return; } Snake.Insert(0, newHead); if (newHead == Food) { Score++; isFoodEaten = true; GenerateFood(); } else { Snake.RemoveAt(Snake.Count - 1); } } public void HandleKeyPress(Direction direction) { if (IsValidDirectionChange(direction)) { currentDirection = direction; } } private Point GetNextHeadPosition(Point currentHead) { int nextX = currentHead.X; int nextY = currentHead.Y; switch (currentDirection) { case Direction.Left: nextX--; break; case Direction.Right: nextX++; break; case Direction.Up: nextY--; break; case Direction.Down: nextY++; break; } return new Point(nextX, nextY); } private bool IsCollision(Point position) { return Snake.Contains(position); } private bool IsWallCollision(Point position) { return position.X = GridWidth || position.Y = GridHeight; } private bool IsValidDirectionChange(Direction newDirection) { // Prevent reversing direction if (currentDirection == Direction.Left && newDirection == Direction.Right) return false; if (currentDirection == Direction.Right && newDirection == Direction.Left) return false; if (currentDirection == Direction.Up && newDirection == Direction.Down) return false; if (currentDirection == Direction.Down && newDirection == Direction.Up) return false; return true; } private void GenerateFood() { int x = random.Next(0, GridWidth); int y = random.Next(0, GridHeight); Food = new Point(x, y); if (IsCollision(Food)) { GenerateFood(); } } } }

确保将以上代码保存在适当的文件中,并将项目的主入口点设置为 MainWindow.xaml.cs。

这个示例将创建一个基本的贪吃蛇游戏窗口,窗口大小为 400x400 像素,并在一个网格中显示游戏元素。玩家可以使用方向键来控制蛇的移动。蛇将在窗口内

移动并吃掉食物,玩家的目标是尽可能地吃到更多的食物并获得更高的分数。

希望这个完整的示例对你有所帮助!如果有任何问题,请随时提问。

User: 小蛇的运动速度太快,我一运行,他就碰壁了. ChatGPT: 非好的,明白了。您可以尝试在游戏循环中添加适当的延迟,以减慢蛇的移动速度。

在 GameLoop 方法中,您可以使用 Task.Delay 来添加延迟。以下是一个示例:

private async void GameLoop(object sender, EventArgs e) { gameLogic.Update(); RenderGame(); // 添加适当的延迟,例如100毫秒 await Task.Delay(100); }

通过将延迟添加到游戏循环中,您可以控制蛇的移动速度。您可以根据需要调整延迟的时间,以达到您想要的速度。

请尝试在 GameLoop 方法中添加适当的延迟,然后重新运行程序,看看是否解决了蛇碰壁的问题。如果还有其他问题,请告诉我。

User: 为什么速度还是很快? ChatGPT: 非常抱歉,之前给出的建议可能不太适用于您的情况。WPF中的UI更新通常是在主线程上进行的,而使用Task.Delay会阻塞主线程,导致UI无法及时更新,从而无法实现预期的延迟效果。

在贪吃蛇游戏中控制速度的常见方法是使用定时器。您可以使用DispatcherTimer类来实现定时器功能,它在WPF应用程序中是线程安全的。以下是更新后的代码示例:

using System.Windows.Threading; // 在 MainWindow 类中添加一个成员变量 private DispatcherTimer gameTimer; // 在 MainWindow 构造函数中初始化定时器 public MainWindow() { InitializeComponent(); // 其他初始化代码... gameTimer = new DispatcherTimer(); gameTimer.Interval = TimeSpan.FromMilliseconds(100); // 设置定时器间隔,这里是100毫秒 gameTimer.Tick += GameTimer_Tick; // 绑定定时器 Tick 事件处理程序 gameTimer.Start(); // 启动定时器 } // 在 Tick 事件处理程序中执行游戏逻辑和界面渲染 private void GameTimer_Tick(object sender, EventArgs e) { gameLogic.Update(); RenderGame(); }

使用DispatcherTimer类,我们可以设置一个适当的时间间隔(以毫秒为单位),然后在定时器的Tick事件处理程序中执行游戏逻辑和界面渲染。这样可以控制贪吃蛇的速度。

请尝试使用这个更新后的代码,并重新运行程序,看看是否能够成功控制贪吃蛇的速度。如果还有其他问题,请随时告诉我。

User: 非常完美,可以正常控制速度了,谢谢! ChatGPT: 太好了!我很高兴能帮上忙。如果您还有其他问题,随时都可以向我提问。祝您玩得愉快,贪吃蛇游戏顺利!

我自己全程一行代码都没有写,我做的只有新建了一个WPF .NET6.0的空白项目,然后按照ChatGPT说的把代码复制进去,遇到问题了我就问他,他就给我解决方案。真是非常便利!!! 在这里插入图片描述

以下是运行效果: 可以用键盘的上下左右按键控制绿色小蛇方向,吃到果子后自动加长一格。 在这里插入图片描述 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3