<原创>最简易的纯代码坦克大战

wartim 2009-10-12 04:58:43
加精
效果图

不到350行
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication87
{
/// <summary>
/// Made by wartim 2009.10.12
/// var 1.0.0.0
/// </summary>
public partial class Form1 : Form
{
static int HEIGHT = 300;
static int WIDTH = 300;

Bitmap OrgBmp = new Bitmap(WIDTH, HEIGHT);
List<Tank> Tanks = new List<Tank>();
UserTank UTank = null;
List<Bullet> Bullets = new List<Bullet>();
PictureBox PB = new PictureBox();

public Form1()
{
InitializeComponent();

this.Size = new Size(WIDTH, HEIGHT);
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.KeyPreview = true;
this.KeyDown += new KeyEventHandler(Form1_KeyDown);

using (Graphics G = Graphics.FromImage(OrgBmp))
G.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);

PB.Parent = this;
PB.Dock = DockStyle.Fill;
PB.Image = OrgBmp;

for (int i = 0; i < 5; i++)
{
Tanks.Add(new Tank(Color.Blue, this.BackColor));
Thread.Sleep(100);
}

UTank = new UserTank(Color.Red, this.BackColor);

Thread T = new Thread(new ThreadStart(RunThread));
T.IsBackground = true;
T.Start();
}

void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up: UTank.ChangeDirection(Direction.UP); UTank.Move(); break;
case Keys.Down: UTank.ChangeDirection(Direction.DOWN); UTank.Move(); break;
case Keys.Left: UTank.ChangeDirection(Direction.LEFT); UTank.Move(); break;
case Keys.Right: UTank.ChangeDirection(Direction.RIGHT); UTank.Move(); break;
case Keys.Space: Bullets.Add(new Bullet(Color.Black, UTank)); break; // 发射子弹
}
}

void RunThread()
{
try
{
int Start = Environment.TickCount;
Random R = new Random();
int KillCount = 0, DeathCount = 0;

while (true)
if (Environment.TickCount - Start > 100)
{
Bitmap CacheBmp = new Bitmap(OrgBmp);

for (int i = 0; i < Tanks.Count; i++)
{
Tanks[i].Move();
Tanks[i].Draw(ref CacheBmp);
if (R.Next(10) == 0) // 电脑发子弹是10分之一的可能
Bullets.Add(new Bullet(Color.Red, Tanks[i]));
}
UTank.Draw(ref CacheBmp);
List<Bullet> TempBullets = new List<Bullet>();
for (int i = 0; i < Bullets.Count; i++)
{
if (Bullets[i].ObjStep != -1)
{
Rectangle Test = new Rectangle(Bullets[i].Postion.X - 10, Bullets[i].Postion.Y - 10, 20, 20);
bool IsKilled = false;
for (int j = 0; j < Tanks.Count; j++)
if (Test.Contains(Tanks[j].Postion))
{
if (Bullets[i].Owner == UTank)
{
KillCount++;
IsKilled = true;
Tanks[j] = new Tank(Color.Blue, this.BackColor);
}
break;
}
if (!IsKilled)
if (Test.Contains(UTank.Postion))
if (Bullets[i].Owner != UTank)
{
DeathCount++;
IsKilled = true;
break;
}
if (!IsKilled)
TempBullets.Add(Bullets[i]);
}
}
Bullets = new List<Bullet>(TempBullets);
for (int i = 0; i < Bullets.Count; i++)
{
Bullets[i].Move();
Bullets[i].Draw(ref CacheBmp);
}
Monitor.Enter(CacheBmp);
using (Graphics G = Graphics.FromImage(CacheBmp))
{
G.DrawString("杀敌数: " + KillCount.ToString() + " 死亡数: " + DeathCount.ToString(), this.Font,
Brushes.Black, new PointF(0, 0));
}
Monitor.Exit(CacheBmp);
this.Invoke(new SetImage(DoSetImage), new Object[] { CacheBmp });
Start = Environment.TickCount;
}
}
catch
{
// 忽略程序退出异常
}
}
[/code]
...全文
11637 398 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
398 条回复
切换为时间正序
请发表友善的回复…
发表回复
a979475580 2012-10-15
  • 打赏
  • 举报
回复
好 顶起
wwb562883398 2012-07-26
  • 打赏
  • 举报
回复
不错 学习了 很强大的源码
SpecialName8 2011-12-30
  • 打赏
  • 举报
回复
WindowsApplication87

这个87亮瞎了
my328420969 2011-12-06
  • 打赏
  • 举报
回复
源文件打包求。。328420969@qq.com
ananonon 2011-11-20
  • 打赏
  • 举报
回复
坦克大战,刚学。不懂,动手做做!
liuxiang1471 2011-09-26
  • 打赏
  • 举报
回复
为什么我运行的有问题啊
错误 1 “坦克大战.Form1”不包含“Form1_Load”的定义,并且找不到可接受类型为“坦克大战.Form1”的第一个参数的扩展方法“Form1_Load”(是否缺少 using 指令或程序集引用?) d:\My Documents\Visual Studio 2008\Projects\坦克大战\坦克大战\Form1.Designer.cs 40 55 坦克大战
Mr_Liu_ 2011-09-06
  • 打赏
  • 举报
回复
UP 学习了
Indifferent_Wind 2011-09-06
  • 打赏
  • 举报
回复
顶啊
回家我也去研究下。。!
星小野 2011-09-02
  • 打赏
  • 举报
回复
学习先[Quote=引用 3 楼 zgke 的回复:]
顶了...
[/Quote]
liruo000 2011-08-31
  • 打赏
  • 举报
回复
不错,很NB啊
一把秋刀鱼 2011-08-29
  • 打赏
  • 举报
回复
我也在学。。。。。
horizonjhlee147 2011-06-28
  • 打赏
  • 举报
回复
好厉害
fenghua8133 2011-06-24
  • 打赏
  • 举报
回复
学习了,牛人
wleexi 2011-06-23
  • 打赏
  • 举报
回复
强大了。。
jiawenbo89 2011-06-20
  • 打赏
  • 举报
回复
下了看看 呵呵 作业 参考下啊
realmaker24 2011-05-12
  • 打赏
  • 举报
回复
赞 写的很好
cashingcashing 2011-05-12
  • 打赏
  • 举报
回复
太牛了 要我写都不知道多少行
kunx609 2010-12-13
  • 打赏
  • 举报
回复
收下了,慢慢学习;
strompanda 2010-12-09
  • 打赏
  • 举报
回复
楼主啊 我的目标啊
wangqi0324 2010-10-24
  • 打赏
  • 举报
回复
顶个先,下下来看看
加载更多回复(378)
## 基于springboot + websocket + html5 canvas打造网络版坦克大战 ### 前言 ### **该项目为本人业余时间原创,禁止任何一切商业行为,转载须经过本人同意,本人微信号: Jiang_Vin** **项目部署地址:** https://xiwen100.com/tank/ 之前工作重心一直偏向后台微服务集群研究,业务项目页主要是单工通信为主,最近一直想扩展自己的技能,想用websocket技术做点东西。 1.websocket运用的极致就是即时战略游戏,因为我只有1个人,之前也没做过游戏,思来想去决定做 **网络版坦克大战**(即时性强,游戏逻辑简单,后续可以基于它继续入坑AI学习)。 2.既然要做就想要做好,之前因为工作关系前端也写得少,所以这次想利用html5 canvas写个 **电脑-手机-平板 的全平台支援游戏**,电脑用键盘控制,手机平板用触控控制。 3.既然是网络游戏,效率考验也是重要环节,所以这里想设计成**多游戏房间**模式,服务器可以创建不限数量的游戏房间,每个游戏房间能容纳不限数量的玩家进行游戏,来看看最终的运算效率和服务器承受计限到底如何。 4.关于游戏性。因为这是大学毕后做的第一个网络类型游戏,初期的想法很简单:游戏房间分为PVP PVE EVE三种模式,其中E为电脑AI(EVE模式也是为之后AI训练架设温床),玩家可以在**任何时间**加入或者离开房间,如果某个房间的玩家全部离开,则房间自动关闭,及时释放服务器资源。 坑挖得有点大,看之后能不能一步步填满,之前也租了服务器,之后定期会把master的代码部署到服务器上供测试: ### 账号系统 ### 既然是网络游戏,肯定需要账号系统,我这里设计得比较简单,所有用户都只需要一个**不重复**的用户名则可以登录,用户名可以支援各种语言。 **用户加入:** 一旦用户输用户名则websocket会通过url的形式带入后端,后端通过DefaultHandshakeHandler截获名字,通过HttpSessionHandshakeInterceptor进行websocket握手前检测名字是否重复,若不重复则通过ChannelInterceptor通知用户服务中心。 **用户离开:** 一样通过ChannelInterceptor通知用户服务中心。 **逻辑相关:** 一开始再想如何得知用户已经订阅完所有path并且确定加入成功?后面决定当前端完成所有加入的前置操作时会给后端发一个READY消息,当后端接收到了READY后则可以通知所有人: XXX加入了游戏并且给他初始化坦克。 **逻辑流程图:** 1.建立连接
2.订阅地址
3.暂停并发送CLIENT_READY
4.接收游戏数据
5.接收SERVER_READY并解除暂停
**关于超时重连问题:** 在测试中发现有一定记录连接服务器会超时,这里前端加了一个行为判断,当连接超过5秒的时候结束锁定,并返回一个超时信息。因为后续的连接可能涉及到切换场景,所以这里的超时比较麻烦,先考虑设定成先暂停,再切换场景,最后再切换回来的操作 **关于操控和碰撞检测:** 试这块逻辑非常坎坷,写了三版,最终效果大致才满意,先测试一下,之后再整理逻辑。 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧