C#实战:坦克大战游戏代码与界面实现

10 下载量 142 浏览量 更新于2024-08-30 2 收藏 44KB PDF 举报
本文将详细介绍如何使用C#语言实现一个基础版本的坦克大战游戏。作者通过实例分享了关键的代码片段和设计思路,旨在帮助开发者理解游戏开发的基本流程和技术应用。 首先,文章的标题明确指出了主题——"C#实现坦克大战游戏",表明内容的核心是使用C#编程语言来构建一款坦克射击类游戏。游戏的目的是让玩家操控自己的坦克,对抗敌方的坦克并发射子弹。 在描述中,作者提到了游戏的基本功能。程序已经实现了以下几点: 1. **游戏状态管理**:通过`GameState_gameState`变量管理游戏的不同阶段,如关闭(Close)、开始(Start)等。 2. **玩家坦克控制**:创建了一个名为`Tank_myTank`的玩家坦克实例,它能同时进行移动和发射子弹。 3. **敌方坦克生成与行为**:自动生成敌方坦克,并让它们能够随机发射子弹,增加了游戏的动态性。 4. **子弹管理**:维护一个子弹列表 `_listBullet`,用于跟踪游戏中的所有子弹。 值得注意的是,虽然游戏的核心功能已经具备,但还有待完善的部分,比如"完整通关的设置"和"障碍物设置"。这意味着游戏可能缺少关卡结构和地图元素,这在实际坦克大战游戏中是非常重要的元素,通常包括多样的地图布局、不同难度级别的敌人配置以及过关条件。 部分代码中,可以看到以下几个关键部分: - `using`指令引入了必要的库,如`System.Windows.Forms`用于创建图形用户界面,`System.Runtime.InteropServices`用于调用Windows API函数处理键盘事件。 - `FormMain`类继承自`Form`,这是Windows Forms应用程序的基础组件,包含游戏的主要界面。 - `BeginToolStripMenuItem_Click`方法可能是"开始游戏"按钮的响应函数,它可能负责初始化游戏状态、设置游戏循环和事件处理。 总结来说,这篇文章提供了一个基础的C#坦克大战游戏框架,通过实例展示了如何使用C#进行游戏逻辑设计、对象创建和用户界面交互。开发者可以根据这些代码作为起点,进一步添加复杂的功能和优化,如碰撞检测、得分系统、关卡管理等,以提升游戏体验。
2011-03-03 上传
http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx 记得在大学学java时,同学在下载了很多java的视频,看到里面有些是介绍简单游戏开发的,马士兵老师讲的,挺感兴趣的。一起看了看视频写了写程序。现在毕业了,因为工作中用的是C#,最近很想拿C#把以前写的坦克大战重写下,来熟悉熟悉C#的基本语法。 程序很简单,跟java代码相比没有多大改动 开发环境 vs2008 实现方法如下 1.在form中添加一个panel,在panel的 Paint方法中得到Graphics对象 2.通过Graphics对象再panel画出坦克,子弹等相关内容 3.添加timer控件 来控制panel的重画 实现坦克,子弹的运动 4.根据电脑按下的方向键,确定出坦克的方向,panel重画时根据坦克的方向修改坦克的X,Y轴坐标,来实现坦克的移动 5.通过Rectangle的IntersectsWith函数来进行碰撞检测,实现子弹打击坦克 具体实现代码 1.在项目里面添加枚举类型 /// /// 表示方向的的枚举类型 /// public enum Direction { L, U, D, R, STOP } 2.添加子弹类的相关常量,属性 /// /// 子弹X轴的速度,单位PX /// public static int XSPEED = 10; /// /// 子弹Y轴的速度,单位PX /// public static int YSPEED = 10; /// /// 子弹的宽度 /// public static int WIDTH = 10; /// /// 子弹的高度 /// public static int HEIGHT = 10; /// /// 子弹的坐标 /// int x, y; /// /// 子弹的方向 /// Direction dir; /// /// 子弹的存活状态 /// private bool live = true; /// /// TankClient窗体实例 /// private TankClient tankClient; /// /// 敌我双方的标记 /// private bool good; 3.添加draw方法来画出子弹 public void Draw(Graphics g) { if (!live) { tankClient.missiles.Remove(this); return; } //通过画椭圆函数在界面上显示子弹 g.FillEllipse(Brushes.Black, x, y, Missile.WIDTH, Missile.HEIGHT); Move(); } 4.添加子弹打击坦克的方法 public bool HitTank(Tank t) { //用IntersectsWith来检测两个矩形相碰撞 if (GetRectangle().IntersectsWith((t.GetRectangle())) && t.Live && this.live && this.good != t.Good) { t.Live = false; this.live = false; return true; } return false; } 5.添加坦克类相关属性,常量 /// /// 坦克x轴的速度 /// public static int XSPEED = 5; /// /// 坦克y轴的速度 /// public static int YSPEED = 5; /// /// 坦克的宽度 /// public static int WIDTH = 30; /// /// 坦克的高度 /// public static int HEIGHT = 30; /// /// 坦克的坐标 /// private int x, y; /// /// 标记上下左右键是否按下 /// private bool l = false, u = false, r = false, d = false; /// /// 坦克的方向 /// private Direction dir = Direction.STOP; /// /// 坦克炮筒方向 /// private Direction ptDir = Direction.D; /// /// TankClient窗体实例 /// TankClient tankClient; /// /// 标记敌我双方 /// private bool good; /// /// 控制敌人坦克不规则运行时使用 /// private int step = 0; /// /// 标记坦克的存活状态 /// private bool live = true; 6.在tank类中实现画坦克方法 public void Draw(Graphics g) { if (!live) { if (!good) { tankClient.tanks.Remove(this); } return; } if (good) { //通过FillEllipse来画坦克 g.FillEllipse(Brushes.Red, x, y, WIDTH, HEIGHT); } else { g.FillEllipse(Brushes.Blue, x, y, WIDTH, HEIGHT); } //根据炮筒坦克来画出坦克的炮筒 switch (ptDir) { case Direction.D: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y + HEIGHT); break; case Direction.U: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y); break; case Direction.L: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x, y + HEIGHT / 2); break; case Direction.R: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH, y + HEIGHT / 2); break; } Move(); } 7.键盘按键处理的相关代码 public void KeyPressed(KeyEventArgs e) { Keys key = e.KeyCode; switch (key) { case Keys.Right: r = true; break; case Keys.Left: l = true; break; case Keys.Up: u = true; break; case Keys.Down: d = true; break; } LocateDirection(); } 8.tank发子弹的方法 public Missile Fire() { if (!live) return null; int x = this.x + WIDTH / 2 - Missile.WIDTH / 2; int y = this.y + HEIGHT / 2 - Missile.HEIGHT / 2; Missile missile = new Missile(x, y, good, ptDir, tankClient); tankClient.missiles.Add(missile); return missile; } 9.主窗体类加入坦克 myTank = new Tank(50, 20, true, this);//放到前面 this不能用 //y轴比java的减少了30 for (int i = 0; i < 15; i++) { //添加10个坦克x轴间距为40px tanks.Add(new Tank(50+40*(i+1),20,false,this)); //y轴比java的减少了30 } 10.主窗体类中调用子弹打击坦克的方法 for (int i = 0; i < missiles.Count; i++) { Missile m = missiles[i]; m.HitTank(myTank); m.HitTanks(tanks); m.Draw(g); } 11.主窗体处理按键代码 private void Form1_KeyDown(object sender, KeyEventArgs e) { myTank.KeyPressed(e); } 12.控制重画代码 private void timer1_Tick(object sender, EventArgs e) { //间隔50毫秒控制panel的重画 panel1.Invalidate(); } 13.这是主要代码基本完成,但是游戏会有闪烁问题 可以通过双缓冲来解决,C#解决时很省事,一个函数就能解决 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true); 顺便改了个手机版本的但是手机版本的没能解决双缓冲问题,屏幕有些闪烁,朋友们可以自己改进 http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx 如果你发现有什么不合理的,需要改进的地方,联系328452421@qq.com 朱晓 (泰山学院)。相互交流 谢谢