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

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

MainWindow.xaml:

<Window x:Class="SnakeGame.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Snake Game" Width="400" Height="400"KeyDown="Window_KeyDown"><Grid x:Name="gameGrid" Background="Black"><!-- Game elements will be added dynamically --></Grid>
</Window>

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<Key, Direction> keyMappings;public MainWindow(){InitializeComponent();gameLogic = new SnakeGameLogic(GridWidth, GridHeight);keyMappings = new Dictionary<Key, Direction>{{ 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 < GridHeight; row++){gameGrid.RowDefinitions.Add(new RowDefinition());}for (int col = 0; col < GridWidth; col++){gameGrid.ColumnDefinitions.Add(new ColumnDefinition());}}private void RenderGame(){gameGrid.Children.Clear();// Render snakeforeach (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 foodvar 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<Point> 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<Point>();random = new Random();currentDirection = Direction.Right;isFoodEaten = false;int initialX = GridWidth / 2;int initialY = GridHeight / 2;for (int i = 0; i < InitialSnakeLength; i++){Snake.Add(new Point(initialX - i, initialY));}GenerateFood();IsRunning = true;Score = 0;}public void Update(){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 < 0 || position.X >= GridWidth || position.Y < 0 || position.Y >= GridHeight;}private bool IsValidDirectionChange(Direction newDirection){// Prevent reversing directionif (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说的把代码复制进去,遇到问题了我就问他,他就给我解决方案。真是非常便利!!!
在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50383.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《HelloGitHub》第 82 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

如何让发送者不知道你收听了WhatsApp语音消息

如果您正在寻找一种在发件人不知情的情况下收听 WhatsApp 音频消息的方法&#xff0c;您可以找到以下 3 种不同的方法来收听 WhatsApp 音频&#xff0c;而不会生成蓝勾。 在发件人不知情的情况下收听 WhatsApp 音频 每当您打开 WhatsApp 文本或语音消息时&#xff0c;WhatsApp…

怎么将文字转语音真人发声?不会的小伙伴来看这个方法

怎么把文字转换成语音真人发声呢&#xff1f;大家在看视频的时候&#xff0c;发现很多的解说视频的声音都很相近&#xff0c;自己在做视频的时候也想使用这个声音&#xff0c;但是不知道他们是如何做到的&#xff0c;今天教大家一个方法&#xff0c;可以把文字转成真人发音的语…

马斯克呼吁重返办公室,直言:“做不到,就视为离职”

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 近年来全球兴起的居家办公热潮&#xff0c;苹果、微软、Meta 等科技巨头加入其间。 然而&#xff0c;作为特斯拉、推特 CEO 的马斯克似乎在这件事上有着不用的想法。 据 theverge 报道&…

搜狗输入法电脑端如何分词

使用引号&#xff08;‘&#xff09;即可&#xff0c;如图 如果使用双拼&#xff0c;分词就更有必要&#xff0c;在输入长句子的时候&#xff0c;一手按住引号&#xff0c;一手输入简拼&#xff0c;可以弥补双拼的长句短板&#xff0c;如图

电脑必备:通用输入法状态提示,再也不怕按错,再也不用看右下角

ImTip 是一个开源输入法状态提示工具&#xff08; 仅 639 KB &#xff09;&#xff0c;虽然发布没多久&#xff0c;已被网友推荐为 Windows 必备软件。在小众有网友留言&#xff1a;“终于遇到她了&#xff0c;你说的这个痛苦&#xff0c;我承受好久了……”。 ImTip 通过在输…

将电脑输入法关闭只留我们经常用的输入法

很多人不习惯用微软默认的输入法&#xff0c;有它在语言栏占着位置&#xff0c;就算换了首选输入法&#xff0c;想要切换别的输入法时&#xff0c;每次还是要多按一次切换组合键&#xff0c;碎小的时间累积起来&#xff0c;会浪费我们不少工夫&#xff0c;本篇经验便告诉大家如…

【软件架构思想系列】从伟人《矛盾论》中悟到的软件架构思想真谛:“对象”即事物,“函数”即运动变化...

引子 形而上学和辩证法两种宇宙观是截然相反的。“所谓形而上学的或庸俗进化论的宇宙观,就是用孤立的、静止的和片面的观点去看世界。这种宇宙观把世界一切事物,一切事物的形态和种类,都看成是永远彼此孤立和永远不变化的”,“和形而上学的宇宙观相反,唯物辩证法的宇宙观主…

为什么说3D引擎是下一代互联网的“CAD”?

01 3D引擎是什么&#xff1f; 听到“引擎”两个字&#xff0c;你可能首先会想到汽车引擎&#xff0c;为汽车提供动力的核心部件。如果没有引擎&#xff0c;汽车就只能是一个模型&#xff0c;它就无法跑起来。 3D模型也一样&#xff0c;我们用3DMax软件制作了一个非常逼真、精美…

提示工程在AI绘画领域的应用前景

AI绘画是现在非常火热的 AI领域。在很多人眼里, AI的绘画原理是类似于人类的写生&#xff0c;不过这里所说的“AI”不是普通的 AI,而是“AI CAD”。在传统的 CAD软件中, CAD是用来绘画的&#xff0c;在 CAD软件中&#xff0c;模型首先被输入到电脑中&#xff0c;在电脑中通过投…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的深度学习模型

目录 给我推荐20个比较流行的nlp模型给我推荐20个比较流行的计算机视觉模型给我推荐20个比较流行的图像分类模型给我推荐20个比较流行的人脸识别模型给我推荐20个比较流行的实体识别模型给我推荐20个比较流行的语言识别模型给我推荐20个比较流行的激光雷达3D点云模型给我推荐20…

人工智能 AI | ChatGPT 时代,程序员的生存之道

ChatGPT 近期炙手可热&#xff0c;仿佛没有什么问题是它不能解决的。出于对 ChatGPT 的好奇&#xff0c;我们决定探索下它对于前端开发人员来讲&#xff0c;是作为辅助工具多一些&#xff0c;还是主力工具更多一些&#xff1f; 2D 能力测试 我们就挑选一个著名的递归回溯问题—…

达芬奇

达芬奇 注意事项 归纳素材 理好时间线 分好轨道 part1 1&#xff1a;媒体面板&#xff08;导入素材&#xff0c;进行分类&#xff09; 媒体浏览器&#xff08;右上&#xff09; 找文件 素材监视器&#xff08;中上&#xff09; 回看 素材数据&#xff08;左&#xff09; 查…

e3 1231 v3 达芬奇_Premiere和达芬奇调色,都是最新版

Pr更新到最新版 在达芬奇调色软件DaVinci Resolve Studio 更新到16版本后,Adobe 终于不再挤牙膏,频繁更新。从2020下半年开始,推出了支持硬件加速(Nvdia和AMD显卡)的更新版本,在视频编辑和渲染输出下速提速明显,尤其是使用硬件加速渲染输出,速度飞快,将近5倍的提升,高倍…

达芬奇项目服务器无法在这台计算机上找到,Vincialign达芬奇隐形矫正软件系统常见问题解答...

原标题&#xff1a;Vincialign达芬奇隐形矫正软件系统常见问题解答 如何顺利有效地使用Vincialign达芬奇软件系统&#xff0c;对于临床医生来讲非常重要。在过去的一段时间里&#xff0c;我们也接到一些医生的反馈&#xff0c;今天&#xff0c;我们将常见问题整理汇总如下&…

windows系统安装docker版本davinci达芬奇踩坑指南

本文讲解windows系统如何安装docker版开源软件davinci&#xff08;数据可视化web服务&#xff09;&#xff0c;并指出一系列的踩坑指南。 达芬奇github地址 https://github.com/edp963/davinci 目录 一 安装docker环境 1 根究你的windows系统是win7&#xff0c;win8或者…

达芬奇导入gif(含 AE 和 PR)

AE、PR、FCPX都支持导入gif&#xff0c;但是达芬奇不支持&#xff0c;得先将gif转成mp4再进行导入。 本文主要面向和我一样需要处理角色动画 和 像素动画的小伙伴。 前言 剪辑软件导入gif, 大概会遇到这些问题 1、情况简单 如果你的gif就是不透明的&#xff0c;只要将gif转成m…

达芬奇操作

示波器 y轴为像素点&#xff0c;x轴为画面从左到右 y轴越宽及曲线竖直距离越长细节越多 Y曲线和画面像素的关系 可以直接用鼠标在屏幕上吸取一个点&#xff0c;Y曲线就会对应一个点 当将Y曲线对应的点网上或往下拉时&#xff0c;整个画面也会变亮变暗&#xff0c;波形图也会…

2023-06-25 达芬奇去除白背景水印

达芬奇去除白背景水印 前言一、具体步骤总结 前言 录视频不小心整了个水印, 当时想了几个方法, 重录, ffmpeg命令搞一下, 一张一张幻灯片导成PNG然后一张一张换, 实在是太费劲了. 于是想到这点小玩意达芬奇这么专业的软件一定有办法, 试了试, 还真行 一、具体步骤 进入调色界…

达芬奇安装配置保姆级教程

达芬奇17专业版&#xff08;破解&#xff09;安装 资源已备好&#xff0c;亲测能用&#xff08;来源网络&#xff09; http://qt6az2.692657.com/pc/davinci%20resolve%20studio%20v17.0.0.39.zip下载解压之后是这三个玩意 破解 不用想&#xff0c;经典套路&#xff0c;先安…