C#窗体贪吃蛇
来源:互联网 发布:淘宝开放平台 什么 编辑:程序博客网 时间:2024/05/23 05:09
这几日自己尝试做了一个贪吃蛇,在尝试过程中发现了自己许多问题,如太小看winform了,之前总是认为其门槛低就没有太过于重视,结果还是眼高手低。
再此也提醒各位朋友与自己,每当脑海有想法时,尽量动手尝试,不要成为一个理论帝,好了,废话不多说。
代码如下:
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;namespace tcs{ public partial class Form1 : Form { Keys k = Keys.D; int grade = 0; string Direction = "D"; List<Label> snake_point = new List<Label>(); //label控件集合,因为蛇是由多个label控件组成 int snakeLen = 4; //蛇的初始长度 static Random r = new Random();//随机数 public Form1() { InitializeComponent(); } //食物的生成 private void food() { int x = r.Next(0, 40) * 10, y = r.Next(0, 40) * 10; Label l = new Label(); l.Tag = "food"; l.Top = x; l.Left = y; l.Height = 10; l.Width = 10; l.BackColor = Color.Green; this.Controls.Add(l); } //蛇的生成 private void snake(Label lbl) { int x = 200, y = 200; for (int i = 0; i < snakeLen; i++) { Label l = new Label(); l.BackColor = Color.Red; l.Width = 10; l.Height = 10; l.Top = y; l.Left = x - i * 10; this.Controls.Add(l); snake_point.Add(l); } } //吃的过程 private void eat() { foreach (Label ctl in this.Controls) { if (ctl.BackColor == Color.Green) { int x = ctl.Left, y = ctl.Top; if (x == snake_point[0].Left && y == snake_point[0].Top) { this.Controls.Remove(ctl); food(); eat_food(); snakeLen++; grade++; } } } }吃的判断 private void eat_food() { Label lbl = new Label(); lbl.Top = snake_point[snakeLen - 1].Top; lbl.Left = snake_point[snakeLen - 1].Left; lbl.Width = 10; lbl.Height = 10; lbl.BackColor = Color.Red; this.Controls.Add(lbl); snake_point.Add(lbl); } //死亡判断 private void die() { Form1 f = new Form1(); int i = 0; foreach (var a in snake_point) { if (a.Left == snake_point[0].Left && a.Top == snake_point[0].Top) i++; } if (i == 2) { timer1.Enabled = false; MessageBox.Show(grade.ToString()); this.Dispose(false); } } //移动处理 private void move(Keys k) { switch (k.ToString()) { case "A": for (int i = snakeLen - 1; i > 0; i--) { if (Direction == "D")//当蛇方向与按键相反的时候,不作为 { snake_point[i].Left = snake_point[i - 1].Left;//切记不要使用label的交换来使蛇移动,蛇会断开,推荐尝试,我在这里吃了不少亏 snake_point[i].Top = snake_point[i - 1].Top;//我也不知道为什么,有大神看见请留言 snake_point[i - 1].Left += 10; Direction = "D"; } else { snake_point[i].Left = snake_point[i - 1].Left; snake_point[i].Top = snake_point[i - 1].Top; snake_point[i - 1].Left -= 10; Direction = "A"; } } break; case "D": for (int i = snakeLen - 1; i > 0; i--) { if (Direction == "A") { snake_point[i].Left = snake_point[i - 1].Left; snake_point[i].Top = snake_point[i - 1].Top; snake_point[i - 1].Left -= 10; Direction = "A"; } else { snake_point[i].Left = snake_point[i - 1].Left; snake_point[i].Top = snake_point[i - 1].Top; snake_point[i - 1].Left += 10; Direction = "D"; } } break; case "W": for (int i = snakeLen - 1; i > 0; i--) { if (Direction == "S") { snake_point[i].Top = snake_point[i - 1].Top; snake_point[i].Left = snake_point[i - 1].Left; snake_point[i - 1].Top += 10; } else { snake_point[i].Top = snake_point[i - 1].Top; snake_point[i].Left = snake_point[i - 1].Left; snake_point[i - 1].Top -= 10; Direction = "W"; } } break; case "S": for (int i = snakeLen - 1; i > 0; i--) { if (Direction == "W") { snake_point[i].Top = snake_point[i - 1].Top; snake_point[i].Left = snake_point[i - 1].Left; snake_point[i - 1].Top -= 10; } else { snake_point[i].Top = snake_point[i - 1].Top; snake_point[i].Left = snake_point[i - 1].Left; snake_point[i - 1].Top += 10; Direction = "S"; } } break; } }//主窗体 private void Form1_Load(object sender, EventArgs e) { //this.Top = 120; //this.Left = 120; this.Height = 438; this.Width = 415; this.BackColor = Color.Gold; food(); int x = 200, y = 200; for (int i = 0; i < snakeLen; i++) { Label l = new Label(); l.BackColor = Color.Red; l.Width = 10; l.Height = 10; l.Top = y; l.Left = x - i * 10; this.Controls.Add(l); snake_point.Add(l); } timer1.Enabled = true; timer1.Interval = 200; timer1.Tick += timer1_Tick; } //判断蛇头是否到达边缘,并使其透墙 private void decide() { if (snake_point[0].Left > 390) { snake_point[0].Left = 0; } if (snake_point[0].Left < 0) { snake_point[0].Left = 390; } if (snake_point[0].Top > 390) { snake_point[0].Top = 0; } if (snake_point[0].Top < 0) { snake_point[0].Top = 390; } die(); }//时间控件 private void timer1_Tick(object sender, EventArgs e) { decide(); move(k); eat(); }//时间控制的重复操作 private void Form1_Click(object sender, EventArgs e) { timer1.Tick += timer1_Tick; } //读取form1的按键操作 private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.A: k = e.KeyCode; break; case Keys.D: k = e.KeyCode; break; case Keys.W: k = e.KeyCode; break; case Keys.S: k = e.KeyCode; break; } } }}这个程序十分简单,但扩展性不是太好。我在尝试的时候读了很多别人的程序时,发现很多时候不是太明白(我接触的相关东西太少,前面提到),所以基本上是靠自己完成。(不过也理清了基本逻辑)
读者尝试的时候推荐理清贪吃蛇细节上的思路。
阅读全文
0 0
- C#窗体贪吃蛇
- C#贪吃蛇(窗体版本)
- c# 贪吃蛇
- C#贪吃蛇
- C#贪吃蛇
- C#贪吃蛇
- C#贪吃蛇教程
- C#贪吃蛇一
- C#贪吃蛇二
- C#贪吃蛇
- c#贪吃蛇源码
- C#贪吃蛇
- C#中的贪吃蛇
- 贪吃蛇C#实现
- C#贪吃蛇
- C#实现贪吃蛇
- c#写的贪吃蛇
- 贪吃蛇的C#代码
- 【Scikit-Learn 中文文档】预测延迟 / 预测吞吐量 / 技巧和窍门
- 【Scikit-Learn 中文文档】使用 scikit-learn 介绍机器学习
- 蓝桥杯2016C语言A组赛题解析
- (作业)利用网络编程实现多个城市的天气查询
- Nfs安装配置
- C#窗体贪吃蛇
- 【Scikit-Learn 中文文档】机器学习: scikit-learn 中的设置以及预估对象
- Java并发学习(十六)-并发工具CyclicBarrier
- PhpStorm+Xampp+Xdebug搭建环境并部署应用
- EasyUI的DataGrid绑定Json数据源
- Python学习笔记
- Android开发圆形头像
- 【Scikit-Learn 中文文档】监督学习:从高维观察预测输出变量
- 图的深度优先搜索