基本信息
源码名称:c#版 贪吃蛇 游戏源码下载
源码大小:0.06M
文件格式:.zip
开发语言:C#
更新时间:2016-03-09
   源码介绍
GUI绘图,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Snake
{
	public partial class Yard : Form
	{
		public Yard()
		{
			InitializeComponent();
		}

		private void Yard_Load(object sender, EventArgs e)
		{
			this.Size = new Size(ROWS * BLOCK_SIZE, COLS * BLOCK_SIZE);
			timer1.Start();
			lblScore.Text = "Score:"   Yard.Score;
		}

		Snake s = new Snake();
		Egg egg = new Egg(15, 15);
		private static int _score = 0;

		public static int Score
		{
			get { return Yard._score; }
			set { Yard._score = value; }
		}

		public static int BLOCK_SIZE = 20;

		public static int ROWS = 30;
		public static int COLS = 30;

		private void timer1_Tick(object sender, EventArgs e)
		{
			if (lblGameOver.Visible == false)
			{
				s.paint(this);
				egg.draw(this);
			}
			else
			{
				if (count > 5 - 1)
				{
					timer1.Stop();
					Thread.Sleep(10 * 100);
					timer1.Start();
					lblGameOver.Text = "得分清零";
					count = 0;
				}
			}
			if (s.getcol() == egg.col && s.getrow() == egg.row)
			{
				s.eat();
				Yard.Score  = 5;
				lblScore.Text = "Score :"   Yard.Score.ToString();
				egg.reinitial();
			}
		}

		bool flag = false;

		int count = 0;
		private void Yard_KeyPress(object sender, KeyPressEventArgs e)
		{
			if (e.KeyChar == (char)Keys.W || e.KeyChar == (char)Keys.W   32)
			{
				s.keypressed("w");
			}
			else if (e.KeyChar == (char)Keys.S || e.KeyChar == (char)Keys.S   32)
			{
				s.keypressed("s");
			}
			else if (e.KeyChar == (char)Keys.A || e.KeyChar == (char)Keys.A   32)
			{
				s.keypressed("a");
			}
			else if (e.KeyChar == (char)Keys.D || e.KeyChar == (char)Keys.D   32)
			{
				s.keypressed("d");
			}
			else if (e.KeyChar == (char)Keys.K || e.KeyChar == (char)Keys.K   32)
			{
				if (lblGameOver.Visible == false)
				{
					DialogResult resust = MessageBox.Show("是否保留上次最后死亡痕迹?", "有意思!", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
					if (resust == DialogResult.No)
					{
						s.clear();
						count  ;
						lblGameOver.Visible = false;
						s = new Snake();
					}
					else
					{
						count  ;
						lblGameOver.Visible = false;
						s = new Snake();
					}
				}
				else
				{
					count  ;
					lblGameOver.Visible = false;
					s = new Snake();
				}
			}
			else if (e.KeyChar == (char)Keys.P || e.KeyChar == (char)Keys.P   32)
			{
				if (flag == false)
				{
					timer1.Stop();
					flag = true;
				}
				else
				{
					timer1.Start();
					flag = false;
				}
			}
		}

	}

	public class Snake
	{
		Node head;
		Node tail;
		int size = 1;
		Yard y;

		int count = 0;

		public void paint(Yard y)
		{
			if (size == 0)
			{
				return;
			}
			if (count == 0)
			{
				this.y = y;
				Node n = new Node(20, 22, Dir.L, y);
				this.head = n;
				this.tail = n;
				head.next = tail;
				head.prev = head;
				tail.prev = head;
				tail.next = tail;
				count  ;
			}
			else
			{
				if (size == 0)
				{
					return;
				}
				move();
				draw();
			}
		}

		void draw()
		{
			for (Node node = head; node != null; node = node.next)
			{
				node.paint();
			}
			//AddToHead();
		}

		public void eat()
		{
			AddToHead();
			size  ;
		}

		public int getrow()
		{
			if (size == 0)
			{
				return -1;
			}
			return head.row;
		}

		public int getcol()
		{
			if (size == 0)
			{
				return -1;
			}
			return head.col;
		}

		public void keypressed(string s)
		{
			if (size == 0)
			{
				return;
			}
			switch (s)
			{
				case "w":
					if (head.dir != Dir.D)
					{
						head.dir = Dir.U;
					}
					break;
				case "s":
					if (head.dir != Dir.U)
					{
						head.dir = Dir.D;
					}
					break;
				case "a":
					if (head.dir != Dir.R)
					{
						head.dir = Dir.L;
					}
					break;
				case "d":
					if (head.dir != Dir.L)
					{
						head.dir = Dir.R;
					}
					break;
				default:
					break;
			}
		}

		private void AddToHead()
		{
			Node n;
			switch (head.dir)
			{
				case Dir.R:
					n = new Node(head.row   1, head.col, head.dir, head.y);
					n.next = head;
					head.prev = n;
					head = n;

					break;
				case Dir.L:
					n = new Node(head.row - 1, head.col, head.dir, head.y);
					n.next = head;
					head.prev = n;
					head = n;

					break;
				case Dir.U:
					n = new Node(head.row, head.col - 1, head.dir, head.y);
					n.next = head;
					head.prev = n;
					head = n;

					break;
				case Dir.D:
					n = new Node(head.row, head.col   1, head.dir, head.y);
					n.next = head;
					head.prev = n;
					head = n;

					break;
			}

		}

		public void move()
		{
			AddToHead();
			DeleteFromTail();
			checkDead();
		}

		private void DeleteFromTail()
		{
			tail = tail.prev;
			tail.y.Controls.Remove(tail.next.N);
			tail.next = null;
		}

		void checkDead()
		{
			if (size == 0)
			{
				return;
			}
			if (head.row < 0 || head.col < 0 || head.col >= Yard.COLS - 2 || head.row >= Yard.ROWS - 1)
			{
				y.lblGameOver.Visible = true;
				clear();
			}
			if (size == 0)
			{
				return;
			}
			for (Node n = head.next; n != null; n = n.next)
			{
				if (n.row == head.row && n.col == head.col)
				{
					y.lblGameOver.Visible = true;
					clear();
				}
			}
		}

		public void clear()
		{
			if (size==0)
			{
				return;
			}
			while (tail.prev != null)
			{
				tail = tail.prev;
				tail.next.y.Controls.Remove(tail.next.N);
				tail.next = null;
				size--;
			}
			head.y.Controls.Remove(head.N);
			head = null;
			size--;
		}

		private class Node
		{
			public Label N = new Label();
			public int row;
			public int col;
			public Dir dir;
			public Node next;
			public Node prev;
			public Yard y;

			public Node(int row, int col, Dir dir, Yard y)
			{
				this.row = row;
				this.col = col;
				this.dir = dir;
				this.y = y;

			}

			public void paint()
			{
				N.Text = "█";
				N.BackColor = Color.Transparent;
				N.Location = new Point(this.row * Yard.BLOCK_SIZE, this.col * Yard.BLOCK_SIZE);
				N.Size = new Size(Yard.BLOCK_SIZE, Yard.BLOCK_SIZE);
				y.Controls.Add(N);
			}

			public void move()
			{
				N.Location = new Point(1000, 1000);
			}

		}

	}

	public class Egg
	{
		public Label N = new Label();
		public int row, col;

		public Yard y;

		public Egg(int row, int col)
		{
			this.row = row;
			this.col = col;
		}

		public void draw(Yard y)
		{
			N.Text = "●";
			N.BackColor = Color.Transparent;
			this.y = y;
			if (N.ForeColor == Color.Green)
			{
				N.ForeColor = Color.Red;
			}
			else
			{
				N.ForeColor = Color.Green;
			}
			N.Location = new Point(this.row * Yard.BLOCK_SIZE, this.col * Yard.BLOCK_SIZE);
			N.Size = new Size(Yard.BLOCK_SIZE, Yard.BLOCK_SIZE);
			this.y.Controls.Add(N);

		}

		Random r = new Random();

		public void reinitial()
		{
			this.row = r.Next(2, 27);
			this.col = r.Next(2, 27);
		}

	}

	enum Dir
	{
		D, U, L, R
	}
}