C# greedy snake source code
2015-11-04 15:11
357 查看
using System; using System.Windows.Forms; using System.Drawing; class Window : Form { Point[] a = new Point[1000]; int size=0; Random r = new Random(); Point food=new Point(); int dir; const int Up = 0; const int Right = 1; const int Left = 3; const int Down = 2; int [,]d={{0,-1},{1,0},{0,1},{-1,0}}; int xsize = 50, ysize = 30; int per = 20; public Window() { Text = "贪吃蛇--made by weidiao.neu"; a[0].X = 10; a[0].Y = 10; dir = 1; size = 1; food.X = 40; food.Y = 25; ClientSize = new Size(xsize * per, ysize * per); Paint += draw; KeyDown += keyDown; Timer t = new Timer(); t.Interval = 400; t.Tick += delegate { int x = a[0].X + d[dir,0]; int y = a[0].Y + d[dir,1]; if (x < 0 || y < 0 || x >= xsize || y >= ysize||dead(x,y)) { t.Stop(); MessageBox.Show("你死了"); Application.Exit(); } if (x == food.X && y == food.Y) { size++; while (true) { int fx = r.Next(0, xsize - 1); int fy = r.Next(0, ysize - 1); int i; for ( i = 0; i < size - 1; i++) { if (fx == a[i].X && fy == a[i].Y) break; } if (i == size - 1) { food.X = fx; food.Y = fy; break; } } } for (int i = size - 1; i > 0; i--) { a[i] = a[i - 1]; } a[0].X = x; a[0].Y = y; Invalidate(); }; t.Start(); } bool dead(int x, int y) { for (int i = 0; i < size; i++) { if (a[i].X == x && a[i].Y == y) return true; } return false; } void keyDown(object o, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Up: if (dir == Down) return; else dir = Up; break; case Keys.Down: if (dir == Up) return; else dir = Down; break; case Keys.Left: if (dir == Right) return; else dir = Left; break; case Keys.Right: if (dir == Left) return; else dir = Right; break; } } void draw(object o, PaintEventArgs e) { var g = e.Graphics; g.Clear(Color.Silver); for (int i = 0; i < size; i++) { g.FillRectangle(new SolidBrush(Color.SeaGreen), a[i].X*per,per* a[i].Y, per,per); } g.FillEllipse(new SolidBrush(Color.Red), food.X*per, food.Y*per, per,per); } } class Program { static void Main() { Application.Run(new Window()); } }
demo to yanshuang.
java版
package haha; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; import javax.swing.JOptionPane; class Main extends JFrame { public static void main(String[]args) { new Main(); } Point[] a = new Point[1000]; int size = 0; Random r = new Random(); Point food = new Point(); int dir; final int Up = 0; final int Right = 1; final int Left = 3; final int Down = 2; int[][] d = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 } }; int xsize = 50, ysize = 30; int per = 20; Timer t; public Main() { setTitle("贪吃蛇--made by weidiao.neu"); a[0]=new Point(10, 10); dir = 1; size = 1; food.x = 40; food.y = 25; setSize(xsize * per, ysize * per); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { int x = a[0].x + d[dir][0]; int y = a[0].y + d[dir][1]; if (x < 0 || y < 0 || x >= xsize || y >= ysize || dead(x, y)) { t.cancel(); JOptionPane.showConfirmDialog(Main.this, "你死了"); } if (x == food.x && y == food.y) { size++; while (true) { int fx = r.nextInt(xsize); int fy = r.nextInt(ysize); int i; for (i = 0; i < size - 1; i++) { if (fx == a[i].x && fy == a[i].y) break; } if (i == size - 1) { food.x = fx; food.y = fy; break; } } } for (int i = size - 1; i > 0; i--) { a[i] = a[i - 1]; } a[0].x = x; a[0].y = y; repaint(); } }, 0, 400); addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { keyDown(e.getKeyCode()); } }); } boolean dead(int x, int y) { for (int i = 0; i < size; i++) { if (a[i].x == x && a[i].y == y) return true; } return false; } void keyDown(int keyCode) { switch (keyCode) { case KeyEvent.VK_UP: if (dir == Down) return; else dir = Up; break; case KeyEvent.VK_DOWN: if (dir == Up) return; else dir = Down; break; case KeyEvent.VK_LEFT: if (dir == Right) return; else dir = Left; break; case KeyEvent.VK_RIGHT: if (dir == Left) return; else dir = Right; break; } } @Override public void paint(Graphics g) { g.setColor(Color.gray); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.green); for (int i = 0; i < size; i++) { g.fillRect(a[i].x * per, per * a[i].y, per, per); } g.setColor(Color.red); g.fillOval(food.x * per, food.y * per, per, per); } }
相关文章推荐
- (c#)不同窗体间传值
- AutoCAD.Net/C#.Net QQ群:193522571 AutoCAD向命令栏发送命令
- AutoCAD.Net/C#.Net QQ群:193522571 AutoCAD中状态栏
- C# Tast 随笔
- C# DEBUG 调试信息打印及输出详解
- 2015-11-04 报表(c#部分)(Datatable 查询,弹出日期控件,输入是否整数)
- c#写windows服务
- C#占位符和格式化字符串
- C# 委托实例(跨窗体操作控件)
- C#实现程序的版本升级更新
- C#中通过Selenium定位<a>标签的问题
- C# WinFrom 去掉groupbox的边框
- c# 换行符
- c# WinForm 创建与读写配置文件
- C# 索引器
- [C# 线程处理系列]专题三:线程池中的工作者线程
- VS2010 C# Activex
- .Net项目实战2管理员界面充值的功能
- c# 拖动窗体
- C# 扩展方法