贪吃蛇各人都玩过,以是就不外多表明 这是一个Winfrom项目即贴既玩
 - using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Linq;
- using System.Windows.Forms;
- namespace SnakeGame
- {
- public partial class Form1 : Form
- {
- private const int GridSize = 10; // 每个格子的尺寸
- private const int WidthInGrid = 100; // 游戏区域的宽度(格子数)
- private const int HeightInGrid = 70; // 游戏区域的高度(格子数)
- private List<Rectangle> snake = new List<Rectangle>
- {
- new Rectangle(100, 100, GridSize, GridSize) // 初始化蛇的起始位置
- }; // 蛇的身体部分(每个部分都是一个矩形)
- private Rectangle food; // 食物的矩形区域
- private Random random; // 用于生成随机数
- private int dx, dy; // 蛇的移动方向
- private Timer timer; // 游戏定时器
- private bool isGameOver; // 游戏是否结束
- private int fastSpeed = 20; // 按住方向键时的加速速度(定时器间隔)
- private int defaultSpeed = 100; // 默认的蛇的速度(定时器间隔)
- // 新增:记录蛇的当前大小
- private int snakeSegmentWidth = GridSize;
- private int snakeSegmentHeight = GridSize;
- public Form1()
- {
- InitializeComponent();
- Start();
- }
- public void Start()
- {
- label2.Visible = false;
- label1.Visible = false;
- button1.Visible = false;
- this.DoubleBuffered = true; // 开启双缓冲,减少闪烁
- // 根据格子数调整窗体尺寸
- this.Width = WidthInGrid * GridSize + 16; // Form的宽度
- this.Height = HeightInGrid * GridSize + 39; // Form的高度
- random = new Random();
- timer = new Timer { Interval = defaultSpeed }; // 设置定时器初始速度
- timer.Tick += Timer_Tick;
- ResetGame();
- }
- private void ResetGame()
- {
- food = GenerateFood();
- dx = GridSize; // 初始时蛇向右移动
- dy = 0;
- isGameOver = false;
- timer.Start(); // 启动游戏定时器
- }
- private void Timer_Tick(object sender, EventArgs e)
- {
- if (isGameOver)
- {
- timer.Stop();
- label1.Visible = true;
- label1.Text = "Game Over";
- button1.Visible = true;
- button1.Enabled = true;
- label2.Visible = true;
- return;
- }
- // 计算蛇头的新位置
- var head = snake.First();
- var newHead = new Rectangle(head.X + dx, head.Y + dy, snakeSegmentWidth, snakeSegmentHeight);
- // 如果蛇头碰到墙壁或自己,游戏结束
- if (newHead.X < 0 || newHead.Y < 0 || newHead.X >= WidthInGrid * GridSize || newHead.Y >= HeightInGrid * GridSize || snake.Contains(newHead))
- {
- isGameOver = true;
- return;
- }
- if (snake.Count % 5 == 0)
- {
- snakeSegmentWidth = (int)(GridSize + snake.Count);
- snakeSegmentHeight = (int)(GridSize + snake.Count);
- }
- // 将蛇头添加到蛇身前
- snake.Insert(0, newHead);
- // 如果蛇吃到食物,生成新食物并让蛇变长
- if (newHead.IntersectsWith(food))
- {
- food = GenerateFood();
- }
- else
- {
- // 否则去掉蛇尾
- snake.RemoveAt(snake.Count - 1);
- }
- // 重新绘制游戏画面
- Invalidate();
- }
- private Rectangle GenerateFood()
- {
- // 随机生成食物的位置,确保食物生成在窗体内
- int x = random.Next(0, WidthInGrid) * GridSize;
- int y = random.Next(0, HeightInGrid) * GridSize;
- return new Rectangle(x, y, GridSize, GridSize);
- }
- private void button1_Click(object sender, EventArgs e)
- {
- label1.Visible = false;
- button1.Visible = false;
- button1.Enabled = false;
- isGameOver = false;
- label2.Visible = false;
- snakeSegmentWidth = GridSize;
- snakeSegmentHeight = GridSize;
- snake = new List<Rectangle>
- {
- new Rectangle(100, 100, GridSize, GridSize) // 初始化蛇的起始位置
- };
- dx = GridSize; // 初始时蛇向右移动
- dy = 0;
- timer.Interval = defaultSpeed;
- timer.Start();
- }
- private void Form1_KeyDown(object sender, KeyEventArgs e)
- {
- // 控制蛇的移动方向
- if (e.KeyCode == Keys.Up&& dy==0)
- {
- dx = 0;
- dy = -GridSize;
- timer.Interval = fastSpeed; // 按住时加速
- }
- else if (e.KeyCode == Keys.Down && dy == 0)
- {
- dx = 0;
- dy = GridSize;
- timer.Interval = fastSpeed; // 按住时加速
- }
- else if (e.KeyCode == Keys.Left && dx == 0)
- {
- dx = -GridSize;
- dy = 0;
- timer.Interval = fastSpeed; // 按住时加速
- }
- else if (e.KeyCode == Keys.Right && dx == 0)
- {
- dx = GridSize;
- dy = 0;
- timer.Interval = fastSpeed; // 按住时加速
- }
- }
- private void Form1_Paint(object sender, PaintEventArgs e)
- {
- var g = e.Graphics;
- // 绘制蛇身
- for (int i = 0; i < snake.Count; i++)
- {
- var segment = snake[i];
- // 蛇头(第一个部分)为黄色,其余为绿色
- if (i == 0)
- {
- g.FillRectangle(Brushes.Yellow, segment); // 蛇头为黄色
- }
- else
- {
- g.FillRectangle(Brushes.Lime, segment); // 蛇身为绿色
- }
- }
- // 绘制食物
- g.FillRectangle(Brushes.Red, food);
- }
- private void Form1_KeyUp(object sender, KeyEventArgs e)
- {
- // 松开方向键时恢复到默认速度
- if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
- {
- timer.Interval = defaultSpeed; // 恢复原来的速度
- }
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |