完整代码:https://download.csdn.net/download/weixin_41516902/13510086
//贪吃蛇窗口代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;
using System.Threading;
namespace CSharp_Snake
{
public partial class SnakeObj : Form
{
#region
const int RECT_COLUMES = 20;
const int RECT_ROWS = 20;
const int RECT_WIDTH = 20;
const int RECT_HEIGHT = 20;
List<Point> m_snake = new List<Point>();
Point m_food = new Point(0, 0);
enum DIRECTION
{
UP = 0,
DOWN,
LEFT,
RIGHT
};
DIRECTION m_dir = DIRECTION.RIGHT;
System.Timers.Timer m_timer = new System.Timers.Timer();//定时器
bool isStarted = false;
#endregion
public SnakeObj()
{
InitializeComponent();
m_snake.Add(new Point(10, 10));
m_snake.Add(new Point(10, 9));
m_snake.Add(new Point(10, 8));
NewFood();
}
public void StartGame()
{
isStarted = true;
m_timer.Elapsed += m_timer_Elapsed;//向定时器里注册事件
m_timer.Interval = 800;
m_timer.Start();
}
void m_timer_Elapsed(object sender, ElapsedEventArgs e)
{
MoveSnake();
this.Invalidate();//触发绘制事件
//throw new NotImplementedException();
}
public void NewFood()
{
Random rd = new Random();
int x = rd.Next(0, 20);
int y = rd.Next(0, 20);
m_food.X = x;
m_food.Y = y;
}
public void EndGame()
{
isStarted = false;
m_timer.Close();
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics m_gp = this.CreateGraphics();
Pen m_p = new Pen(Color.Black);
if (!isStarted) return;
foreach(var point in m_snake)
{
Rectangle rect=new Rectangle(point.X*RECT_WIDTH,point.Y*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
m_gp.DrawRectangle(m_p, rect);
}
Rectangle rectFood = new Rectangle(m_food.X * RECT_WIDTH, m_food.Y * RECT_HEIGHT, RECT_WIDTH, RECT_HEIGHT);
m_gp.DrawRectangle(m_p, rectFood);
}
private void MoveSnake()
{
Point pt = m_snake.First<Point>();
switch(m_dir)
{
case DIRECTION.UP:
pt.Y = pt.Y - 1;
break;
case DIRECTION.DOWN:
pt.Y = pt.Y + 1;
break;
case DIRECTION.LEFT:
pt.X = pt.X- 1;
break;
case DIRECTION.RIGHT:
pt.X = pt.X+ 1;
break;
}
m_snake.Insert(0, pt);
if (SnakeHitSide())
{
EndGame();
MessageBox.Show("Game Over");
return;
}
if (SnakeHitFood())
{
NewFood();
return;
}
m_snake.RemoveAt(m_snake.Count-1);
}
private bool SnakeHitSide()
{
Point pt = m_snake.First<Point>();
if (pt.X <= 0 || pt.X>=20)
return true;
if (pt.Y <=0 || pt.Y >=20)
return true;
for(int i=1;i<m_snake.Count;i++)
{
if (pt == m_snake[i])
return true;
}
return false;
}
private bool SnakeHitFood()
{
foreach(var pt in m_snake)
{
if (m_food == pt)
return true;
}
return false;
}
/// <summary>
/// 键盘事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SnakeObj_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'w' || e.KeyChar == 'W')
{
if (m_dir == DIRECTION.LEFT || m_dir == DIRECTION.RIGHT)
m_dir = DIRECTION.UP;
}
else if (e.KeyChar == 'a' || e.KeyChar == 'A')
{
if (m_dir == DIRECTION.UP || m_dir == DIRECTION.DOWN)
m_dir = DIRECTION.LEFT;
}
else if (e.KeyChar == 's' || e.KeyChar == 'S')
{
if (m_dir == DIRECTION.LEFT || m_dir == DIRECTION.RIGHT)
m_dir = DIRECTION.DOWN;
}
else if (e.KeyChar == 'd' || e.KeyChar == 'D')
{
if (m_dir == DIRECTION.UP || m_dir == DIRECTION.DOWN)
m_dir = DIRECTION.RIGHT;
}
}
}
}