前言:
这是上上…上学期自己 《C#程序设计》 的一个期末课程设计,模拟经典游戏《坦克大战》做的一个小游戏,此时让我想起了小时候和小伙伴们插着游戏卡,手柄连着电视机熬夜玩游戏的场景,哎~~我也是个魂斗罗和影子传说都通了全关的人(~ ̄▽ ̄)~ ,我爸妈应该不会看到这篇博客,我担心他们看到了突然想起在我小时候为什么三天两头就要修电视机,还换了几台,哈哈哈…。电脑准备换系统了,这些数据不想保留了,但当初这个小小的课程设计也是花了自己很大功夫的一个心血,就想在换系统前发出来,也许某一天自己还会看一下…
运行效果
窗口控件设计
游戏控制和相关代码
通过键盘在小写状态下“w”,“s”,“a”,“d”,分别控制己方坦克(黄色)向“上”,“下”,“左”,“右”方向运动,空格键发射子弹。
控制处理方法:
public void KeyPress(char key)
{
FSky.Audio.Play("audio\\score.wav"); //插入音乐(每按一次键盘播放一次音乐)
if (key == 'w')
{
animalList[0].image = "gif\\tk_s.gif";
animalList[0].directionX = 0;
animalList[0].directionY = -3;
}
if (key == 's')
{
animalList[0].image = "gif\\tk_x.gif";
animalList[0].directionX = 0;
animalList[0].directionY = 3;
}
if (key == 'a') //向左
{
animalList[0].image = "gif\\tk_z.gif";
animalList[0].directionX = -3;
animalList[0].directionY = 0;
}
if (key == 'd')
{
animalList[0].image = "gif\\tk_y.gif";
animalList[0].directionX = 3;
animalList[0].directionY = 0;
}
if (key == ' ') //子弹
{
Animal animal = new Animal();
animal.x = animalList[0].x; //位置
animal.y = animalList[0].y;
animal.directionX = animalList[0].directionX; //方向
animal.directionY = animalList[0].directionY;
//animal.image = "gif\\missile1.gif";
animal.InitializeByType(1);
animal.velocity = animalList[0].velocity * 2+1; //速度
animalList.Add(animal);
}
}
部分关键代码说明
- 这个项目的所有物体包括子弹、坦克、墙壁等,都是通过animalList这个列表在world世界中实例化,并通过Show函数将其显示在bmp这个位图上的。
- 由于墙壁的数量比较多,墙壁的位置坐标都不同,我定义了两个一维数组arrx,arry分别存放墙壁的x和y坐标,再使用两个for循环,调用两个数组中存放的坐标,在world中实例化所有红色砖墙和白色铁墙。
int[] arrx = { 300, 347, 256,……397, 397, 480, 530, 70, 450, 30, 100, 570 };
int[] arry = { 343, 343, 343,…… 343, 391, 250, 391, 70, 70, 180, 300, 250 };
//------------墙壁-------------------------------------------
for (int i = 0; i < 19; i++) //控制生成墙壁的数量
{
Animal animal = new Animal();
animal.InitializeByType(10);
animal.x = arrx[i];
animal.y = arry[i];
animalList.Add(animal); //将animal加入到animalList队列中
}
for (int i = 19; i < 24; i++) //控制生成墙壁的数量
{
Animal animal = new Animal();
animal.InitializeByType(9);
animal.x = arrx[i];
animal.y = arry[i];
animalList.Add(animal); //将animal加入到animalList队列中
}
//=========================================
- 在定时器中调用world世界中的NextRound方法:world.NextRound();每调用一次使整个世界到达下一个时刻,并在world世界的Clear方法中清除每一次调用NextRound方法时物体运动所留下的痕迹。
void Clear() //清除痕迹
{
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.Black);
}
- 在NextRound中判断animalList列表中所有物体的x、y坐标之差,当它们小于35时,在Meet函数中,运用type和bExist属性,根据不同两个物体的相遇处理不同的事件。例如:当己方子弹和坦克相遇时,敌方坦克被击毁,子弹和坦克从链表中移除。当坦克碰到墙壁时反弹,遇到草地时则可以穿过去。
//============己方子弹互销===================
if ((type == 2||type==3||type==4||type==5||type==6||type==7||type==8||type==10||type==12||type==13) && (oAnimal.type == 1)) //碰到1己方子弹时消失(死亡)
{
bExist = false;
}
if ((type == 1 ) && (oAnimal.type == 2||oAnimal.type==3||oAnimal.type==4||oAnimal.type==5||oAnimal.type==6||oAnimal.type==7||oAnimal.type==8||oAnimal.type==9||oAnimal.type==10||oAnimal.type==12||oAnimal.type==13)) //碰到1的图片时消失(死亡)
{
bExist = false;
}
//========敌方子弹13碰到9铁墙时,子弹消失===================
if ((type == 13) && (oAnimal.type == 9))
{
bExist = false;
}
- 己方坦克的转向是在KeyPress中通过键盘触发,按下不同的方向键时更换对应方向的坦克图片。敌方坦克的转向处理,则是在NextRound中产生一个1至100的随机数,分别给每一个方向的图片赋一个1至100之间的值,当产生的随机数等于某一个方向上的值时,则替换该坦克为对应方向的图片。敌方坦克发射的子弹也是通过类似方法触发,等于某一个随机数时敌方坦克发射一颗子弹。
//============敌方子弹===================
Random rand = new Random(); //系统自带的随机数类
int x=rand.Next(1, 100);
if (x == 23)
{
animal.x = animalList[2].x; //位置
animal.y = animalList[2].y;
animal.directionX_1 = animalList[2].directionX; //方向
animal.directionY_1 = animalList[2].directionY;
animal.InitializeByType(13);
animal.velocity = 4; //速度
animalList.Add(animal);
}
//===========敌方转向======================
int y = rand.Next(1, 100);
if (y == 3)
{
animalList[2].directionX = 2; //方向
animalList[2].directionY = 0;
animalList[2].image = "gif\\tk02_y.gif";
}
if (y == 5)
{
animalList[2].directionX = -2; //方向
animalList[2].directionY = 0;
animalList[2].image = "gif\\tk02_z.gif";
}
………………
项目源码
需要这个小游戏项目源码的可以到我的github上下载https://github.com/yue0134/Little_game,或者我的网盘分享https://pan.baidu.com/s/1f2IwuduKfP095mNUJB1j2w 提取码:d2g1
游戏bug、不足之处
游戏界面是固定的,并不能随机更换。代码复用性不高,像坦克、子弹等有共同属性的地方没能共用一部分代码,类的继承处理复杂。敌方坦克死亡超过一定数量后,在列表中后面位置的墙壁会替换坦克的位置,从而具有一些坦克的属性,这部分是一个很大的漏洞没能处理好。
关于博主
“没和人组队完成这个小游戏,是希望自己能完全熟悉游戏项目的每一部分,迫使自己多深入研究,也顺便看看自己的编程水平。虽然没和人组队,但在很多地方我都有和同学、老师讨论,也收获了很多想法以及知识点,全凭我一个人的想法和编程能力是完成不了这个游戏的,团队一直都比个人强。这个游戏还可以增加许多功能,也还有很多地方我还没能处理好,我希望自己能一直保有对编程的兴趣,慢慢充实自己并能努力做好每一个项目。”
好吧,以上那一段话也是我上上…上学期提交这个课程设计时写的总结,现在来看呢…哈哈哈~~谁还没幼稚过呢d=====( ̄▽ ̄*)b