首页 > 精品范文库 > 1号文库
pascal射击游戏完整版
编辑:梦中情人 识别码:10-1014440 1号文库 发布时间: 2024-05-29 15:15:19 来源:网络

第一篇:pascal射击游戏完整版

uses crt;var headx,armlx,armrx,bodyx,legx,heady,armly,armry,bodyy,legy:integer;blood:integer;eblood:array [1..9] of integer;etowards,towards,x:string;earmrx,earmlx,elegx,ebodyx,eheadx:array [1..9] of integer;head,arml,armr,body,leg:char;i1,i:integer;ehead,earml,earmr,ebody,eleg:char;stepstart,steps,enerys,enerys1:integer;firststart:integer;kk:char;active,enery:array [1..9] of integer;time:longint;skilling,deaths,skilllevel:integer;skilltime:longint;skillactive:string;freezing:integer;label 1;procedure printplayer(pr:integer);begin if pr=0 then begin textcolor(red);gotoxy(headx,heady);write(head);gotoxy(armlx,armly);write(arml);gotoxy(armrx,armry);write(armr);gotoxy(bodyx,bodyy);write(body);gotoxy(legx,legy);write(leg);textcolor(white);end else begin textcolor(green);gotoxy(eheadx[pr],17);write(ehead);gotoxy(earmlx[pr],18);write(earml);gotoxy(earmrx[pr],18);write(earmr);gotoxy(ebodyx[pr],18);write(ebody);gotoxy(elegx[pr],19);write(eleg);textcolor(white);end;end;function locationOK(lOk:integer):boolean;var lOk1:integer;begin locationOK:=true;for lOK1:=1 to i-1 do if enery[lOk1]=enery[i] then locationOK:=false;if enery[i]=bodyx then locationOK:=false;end;procedure printstep;var psp:integer;begin gotoxy(stepstart,20);for psp:=1 to steps do write('=');end;function direct(dr:integer):boolean;var dr1:integer;begin direct:=true;for dr1:=1 to enerys do if(enery[dr1]=dr)and(active[dr1]=1)direct:=false;end;procedure clearplayer(cp:integer);begin gotoxy(cp,19);write(' ');gotoxy(cp-1,18);write('

');gotoxy(cp,17);write(' ');end;procedure turnside;begin gotoxy(38,24);write('

');gotoxy(38,24);write(towards);end;procedure fightover(fo:string);begin if fo='left' then begin gotoxy(armlx-1,armly);

then write('=');gotoxy(armlx-1,armly);write(' ');end;if fo='right' then begin gotoxy(armrx+1,armry);write('=');gotoxy(armrx+1,armry);write(' ');end;end;procedure ifs(is1:string);var is2,is3:integer;is4:string;is5:array [1..9] of integer;begin for is2:=1 to enerys do is5[is2]:=eblood[is2];if is1='left' then for is2:=1 to enerys do if active[is2]=1 then begin if armlx-1=earmrx[is2] then eblood[is2]:=eblood[is2]-5;if armlx-1=ebodyx[is2] then eblood[is2]:=eblood[is2]-10;if armlx-1=earmlx[is2] then eblood[is2]:=eblood[is2]-15;end;if is1='right' then for is2:=1 to enerys do if active[is2]=1 then begin if armrx+1=earmlx[is2] then eblood[is2]:=eblood[is2]-5;if armrx+1=ebodyx[is2] then eblood[is2]:=eblood[is2]-10;if armrx+1=earmrx[is2] then eblood[is2]:=eblood[is2]-15;end;for is2:=1 to enerys do if active[is2]=1 then if abs(enery[is2]-headx)<=3 then begin gotoxy(enery[is2],23);str(is5[is2],is4);for is3:=1 to length(is4)do write(' ');gotoxy(enery[is2],23);write(eblood[is2]);end;end;procedure levelup(lu:integer);var lu1:string;lu2:char;lu3:integer;begin case lu of 1:lu1:='frozen the enemy';end;gotoxy(30,25);write('press ''g'' to get the new skill');repeat lu2:=readkey;until lu2='g';gotoxy(30,25);write('

');gotoxy(1,25);write('You''ve gotten a new skill:press ''f'' to ',lu1,'.Press Enter to continue');lu2:=readkey;gotoxy(1,25);for lu3:=1 to 79 do write(' ');end;procedure killing;var kill:integer;kill1:string;begin for kill:=1 to enerys do if(eblood[kill]<=0)and(active[kill]=1)then begin clearplayer(enery[kill]);enerys1:=enerys1-1;active[kill]:=0;gotoxy(enery[kill],21);write(' ');gotoxy(enery[kill],22);write(' ');gotoxy(enery[kill],23);str(eblood[kill],kill1);for i1:=1 to length(kill1)do write(' ');deaths:=deaths+1;if(deaths=10+skilllevel*5)and(skilllevel+1<2)then begin skilllevel:=skilllevel+1;skilling:=skilllevel;deaths:=0;levelup(skilllevel);end;end;end;procedure printblood;begin gotoxy(51,24);write('

');gotoxy(51,24);write(blood);end;procedure printbloods(pb:integer);begin gotoxy(enery[pb],21);write('');gotoxy(enery[pb],22);write('');gotoxy(enery[pb],23);write(eblood[pb]);end;procedure useskill(us:integer);var us1:integer;begin case us of 1:begin time:=time-240000;freezing:=1;for us1:=1 to enerys do if active[us1]=1 then begin textcolor(blue);gotoxy(eheadx[us1],17);write(ehead);gotoxy(earmlx[us1],18);write(earml);gotoxy(earmrx[us1],18);write(earmr);gotoxy(ebodyx[us1],18);write(ebody);gotoxy(elegx[us1],19);write(eleg);textcolor(white);end;end;//case of //2: end;end;begin towards:='left';headx:=40;heady:=17;armlx:=39;armly:=18;armrx:=41;armry:=18;bodyx:=40;bodyy:=18;legx:=40;legy:=19;blood:=100;head:='';arml:='=';armr:='=';body:='';leg:='A';ehead:='';earml:='=';earmr:='=';ebody:='';eleg:='A';clrscr;randomize;gotoxy(30,24);write('towards:',towards);gotoxy(45,24);write('blood:',blood);printplayer(0);skilltime:=1000000;skillactive:='active';gotoxy(60,24);write('skill:',skillactive);repeat if enerys1=0 then begin enerys:=random(8)+1;enerys1:=enerys;steps:=random(60)+enerys;repeat stepstart:=random(75-steps)+1;until(legx>stepstart)and(legx

');gotoxy(legx,14);write(' ');gotoxy(30,25);write('

printplayer(0);if random(5)=1 then begin

');

gotoxy(10,25);write('You''ve gotten a bag,open it to added your blood.(press ''o'')');repeat kk:=readkey;until kk='o';gotoxy(10,25);write('

');if blood+80<100 then blood:=blood+80 else blood:=100;printblood;end;end else begin firststart:=1;printstep;end;for i:=1 to enerys do begin printplayer(i);active[i]:=1;eblood[i]:=100;printbloods(i);end;end;if keypressed then begin kk:=readkey;case kk of 'a':begin towards:='left';if(bodyx-1>stepstart)and(direct(bodyx-1))then begin headx:=headx-1;armlx:=armlx-1;armrx:=armrx-1;bodyx:=bodyx-1;legx:=legx-1;clearplayer(headx+1);printplayer(0);turnside;

end;end;'d':begin towards:='right';if(bodyx+1=1000000 then begin skilltime:=0;skillactive:='not active';gotoxy(66,24);write('

');gotoxy(66,24);write(skillactive);useskill(skilling);end;end;time:=time+202_;skilltime:=skilltime+202_;end;if time>=40000 then begin time:=0;if freezing=1 then begin freezing:=0;for i:=1 to enerys do if active[i]=1 then printplayer(i);end;for i:=1 to enerys do if active[i]=1 then begin if enery[i]-headx>0 then etowards:='left' else etowards:='right';if abs(enery[i]-headx)>3 then begin if etowards='left' then begin enery[i]:=enery[i]-1;earmlx[i]:=earmlx[i]-1;earmrx[i]:=earmrx[i]-1;ebodyx[i]:=ebodyx[i]-1;eheadx[i]:=eheadx[i]-1;elegx[i]:=elegx[i]-1;clearplayer(eheadx[i]+1);printplayer(i);end;if etowards='right' then begin enery[i]:=enery[i]+1;earmlx[i]:=earmlx[i]+1;earmrx[i]:=earmrx[i]+1;ebodyx[i]:=ebodyx[i]+1;eheadx[i]:=eheadx[i]+1;elegx[i]:=elegx[i]+1;clearplayer(eheadx[i]-1);printplayer(i);end;if etowards='left' then i1:=1 else i1:=-1;gotoxy(enery[i]+i1,21);write(' ');gotoxy(enery[i]+i1,22);write(' ');gotoxy(enery[i]+i1,23);str(eblood[i],x);for i1:=1 to length(x)do write(' ');printbloods(i);end else begin if etowards='left' then begin gotoxy(earmlx[i]-1,18);write('=');gotoxy(earmlx[i]-1,18);write(' ');if earmlx[i]-1=armrx then blood:=blood-1;if earmlx[i]-1=bodyx then blood:=blood-2;if earmlx[i]-1=armlx then blood:=blood-3;end;if etowards='right' then begin gotoxy(earmrx[i]+1,18);write('=');gotoxy(earmrx[i]+1,18);write(' ');if earmrx[i]+1=armlx then blood:=blood-1;if earmrx[i]+1=bodyx then blood:=blood-2;if earmrx[i]+1=armrx then blood:=blood-3;end;printblood;if blood<=0 then goto 1;end;

end;end;time:=time+1;skilltime:=skilltime+1;if(skilltime>=1000000)and(skillactive='not active')then begin skillactive:='active';gotoxy(66,24);write('

');gotoxy(66,24);write(skillactive);end;if skilltime>=10000000 then skilltime:=8000000;until 1=0;1:clrscr;gotoxy(30,12);write('game over');readln;end.

第二篇:射击游戏

射击游戏

☞编号:SJYX1☞名称:近轨道先锋

☞大小:20MB☞适用固件:4.0固件及以上

☞游戏由13个游戏关卡和5个不同的场景组成。玩家在游戏中可以使用狙击枪、等离子枪、火箭发射器和手榴弹等6种不同的武器装备。

☞游戏包含单人模式和多人模式,其还支持玩家通过WiFi/蓝牙进行在线或联机游戏。

☞编号:SJYX2☞名称:近轨道先锋

☞大小:222MB☞适用固件:3.1.2固件及以上

☞游戏的剧情为军国主义保皇党人囚禁了你们的领袖,并在银河中散播恐怖展开激战,而你是一名王牌明星飞行员。你需要率领反抗军战机队,加入到高强度模拟空战中与他们决一死战。反抗军和保皇党之间的战争将会贯穿整个太空,横跨数个星系,这一切都将由全高清画面所呈现。你将会在极富未来感的城市、丛林、沙漠和冰山中战斗。

☞单人游戏运,行流畅,操作简便多人游戏部分则支持双人对战(蓝牙/WiFi)。

☞编号:SJYX3☞名称:生死9毫米

☞大小:733MB☞适用固件:3.1.3固件及以上

☞游戏集成了侠盗系列犯罪游戏的内容,包括帮派、枪战等常见的犯罪元素,不过游戏的主角看起来更像是警察的卧底,《9毫米》明显的表现出侠盗类游戏的风格,自由的驾驶、打架、枪战,画面充斥暴力、金钱与毒品。

☞本地或者在线的死亡对战或者团队死亡对战、支持最多12名玩家进行对战、4张不同的地图以及16种不同的武器和多种的武器性能升级

☞编号:SJYX4☞名称:战地:叛逆连队

2☞大小:234MB☞适用固件:3.0固件及以上

☞将会横跨5个不同区域、多达14个单人任务。将会在丛林、沙漠和雪地之中进行。同时游戏还将会包含多人在线模式,可以通过联网进行小队作战,最多支持4名玩家通过3G、Wifi、OTA联机,进行TDM和DM多人模式。

☞游戏注重体现现代战争的真实性,玩家可破坏各种场景物品,能对建筑物框架进行破坏。同时注重小队配合作战也是《叛逆连队2》的特点

☞编号:SJYX5☞名称:恐龙战士

☞大小:160MB☞适用固件:3.0固件及以上

☞还有这3种游戏模式,你可以和多达4个人一起进行多人游戏哦

☞Nanosaur 2是一款3D风格的飞行射击游戏,游戏采用重力感应控制

☞游戏中需要要小心的操控飞行,注意炮塔、迅猛龙或其他恐龙的攻击。超过地图的空间还是会撞壁爆炸的.哦

☞编号:SJYX6☞名称:秘密行动

☞大小:657MB☞适用固件:3.0固件及以上

☞在游戏中,玩家会扮演三名不同的特工,每个人都拥有自己不同的能力。☞多人模式也可让你和朋友组队(本地蓝牙)。

☞秘密行动是以世界谍战为基础的动作游戏,横跨日内瓦,杜布罗夫尼克,香港等地区来完成各种富有挑战性的任务。

☞编号:SJYX7☞名称:战地:叛逆连队

☞大小:257MB☞适用固件:3.0固件及以上

☞五张各式的地图和三种不同模式(自由战,团队死亡战,控制战)下与多至5位好友联机作战。还可以直接通过蓝牙进行本地联机,或通过Wi-Fi联网与世界各地的朋友们对战。

☞操纵包括坦克、越野车和滑翔机在内的3种交通工具来干掉敌人,或进行成功逃离。武器还可以用机枪、火箭筒、狙击步枪及火焰喷射器等多种真实二战武器。

☞编号:SJYX8☞名称:现代战争2黑色飞马

☞大小:566MB☞适用固件:3.1.2固件及以上

☞玩家将操纵3名可操纵角色之一,投身到横跨中东、东欧与南美的12大战场中去。脸部细节动画以及慢动作瞬杀带来令人屏息的紧张体验。15种真实军用武器可供使用,您可以直接从敌人处获取,也可利用数种附件对其进行升级。中弹或遭受其他伤害时画面产生模糊效果、武器上展现动态光影都营造出真实的战争体验。多人游戏方面,支持最多10名玩家可同时参与在线与本地对抗。

☞编号:SJYX9☞名称:战列舰

☞大小:20MB☞适用固件:3.1.2固件及以上

☞一款经典战舰游戏,指挥你的军舰,将对手击沉,具有多种不同的游戏模式,并支持多人对战。通过巧妙的部署战舰,避开敌方部队的探测;运用火力侦察锁定敌船,将它送入海底!让你如临其境的逼真炮声,以及无线电中不时响起的呼叫!你所熟知并钟爱的战舰,都将真实展现在你面前

☞编号:SJYX10☞名称:合金风暴

☞大小:20MB☞适用固件:3.1.2固件及以上

☞实时多人-支持3G和Wi-Fi同其他玩家联机比赛,生存模式:在合作多人模式下与朋友合作或单人多次消灭敌人,回旋装置允许通过iPhone 4和iPod touch四代装置进行精确控制

☞高解析支持的下一代3D图像、众多飞行器可供选择、自定义飞行器导弹和机枪 ☞不同方向击打,执行高难度机动动作、3D空间全360度飞行

☞编号:SJYX11☞名称:钢铁大战

☞大小:20MB☞适用固件:3.1.2固件及以上

☞一个 3D平面射击游戏,游戏单人战斗有 3 种不同的模式,多达 32 个关卡,多人战斗最多可支持 4 人 WIFI 连接,玩家需在遥远的钢铁星球上为了最强名号的荣誉而战,其精彩的战斗射击场景定能让你热血澎湃。喜欢火爆刺激的射击游戏?想体验与对手猛烈互击,在枪林弹雨之中狂奔躲闪然后消灭对手的快感么?那么可以试试这款《Iron Wars》,虽然游戏里你将成为一个钢铁圆球……

☞编号:SJYX12☞名称:三国杀

☞大小:20MB☞适用固件:IOS4固件及以上

☞这是一个交织着扮演、推理、典故的游戏,充满着智慧的搏杀、人性的对决,符合中国人的审美情趣和娱乐需求。

☞三国杀online是移植三国杀实体纸牌的正统之作,由盛大边锋的研发,力图带来最完美的三国杀游戏体验。游戏严格遵循官方设定的规则和逻辑,并根据最新的动态进行实时调整,保证您能第一时间玩到原汁原味、专业严谨的三国杀。

☞编号:SJYX13☞名称:牛仔神枪手

☞大小:20MB☞适用固件:IOS4固件及以上

☞Cowboy Guns HD在很多设计上比较独特,比如80度的俯视角,乐高造型人物,双摇杆操作方式,带点复古粗犷色彩的3D场景构架,再加上浓烈的美国西部风情,这些要素都吸引着玩家很好地代入到游戏角色中去。

第三篇:大实验射击游戏(本站推荐)

嵌入式Linux应用程序开发

期末结课实验

基于QT的射击游戏

学号:1411640407 姓名:林向东 班级:计算机1404班 学院:计算机科学与软件学院

【实验目的】

1、掌握Qt下绘图函数的使用方法;

2、掌握标签(Label)、段码液晶(LCDNumber)、滑动条(Slider)等部件的应用;

3、掌握Qt下不同坐标系的转换。

4、掌握通过源代码重构工程并编译的方法

【实验设备】

1、装有Ubuntu系统或装有Ubuntu虚拟机的PC机一台;

2、凌阳A8嵌入式实验箱一台;

3、本实验用到实验箱的模块有:S5PV210 CPU板模块,LCD液晶屏。

【实验要求】

完成一个射击小游戏,这是4.7.0之前的版本的Qt源码中自带的一个范例

序,具

在qtopia-core-opensource-src-4.3.5examplestutorialt14。虽然在4.7.0之后的版本中删掉了这个范例,但是通过这个实例,可以使读者深入理解QT信号与槽,变换坐标系等较深层内容。运行后游戏界面如图。

【实验原理】

1、Qpainter QPainter类低水平的绘制,例如在窗口部件上。使用Qpainter类,需要包含头文件绘制工具为做到绝大部分绘制图形用户界面程序的需要提供了高度优化的函数。QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状。它也可以绘制排列的文本和像素映射。通常,它在一个“自然的”坐标系统中绘制,但是它也可以在坐标系转换中做到这些。

使用方法很简单并且这里有可以使用的许多设置:font()返回当前设置的字体、setFont()设置要使用的字体。如果你设置一个不可用的字体,Qt会找到一个相近的匹配。实际上,font()返回你使用setFont()所设置的东西并且fontInfo()返回你实际使用的字体(这也许是相同的)。brush()是当前设置的画刷,用来填充例如圆的颜色或者调色板。pen()是当前设置的画笔,用来画线或者边缘的颜色或者点画。painter的当前状态能通过调用save()和稍后调用restore()存储在stack中.当我们需要临时改变一些painter settings并要恢复到以前的状态时,这个功能是很有用的.QPainter的核心功能是绘制,并且这里有最简单的绘制函数:drawPoint()、drawPoints()、drawLine()、drawRect()、drawWinFocusRect()、drawRoundRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawLineSegments()、drawPolyline()、drawPolygon()、drawConvexPolygon()和drawCubicBezier()。所有这些函数使用整数坐标,它们没有浮点数的版本,因为我们想使绘制尽可能快地进行。

2、坐标系统

在Qt中的一个绘画设备是一个可画的二维平面。QWidget、QPixmap、QPicture和QPrinter都是绘画设备。QPainter是一个可以在上面画的对象。一个绘画设备的默认坐标系统的原点在左上角。X轴由左向右增加,Y轴由上向下增加。对于基于像素的设备单位是像素,对于打印机是点。Qt的坐标系除了默认的坐标系以外还可对坐标系进行转换,这样结合Qpainter的绘图函数就可以画出各种图形。Qt提供了像QPainter::rotate()、QPainter::scale()、QPainter::translate()等方法来改变坐标系。

3、射击小游戏

射击小游戏可以通过拖动右边“ANGLE”和“FORCE”滑动条,改变发射子弹的角度和力量,点击“Shoot”按钮就可以发射子弹,子弹以抛物线的角度运行,如果撞到红色的目标物体,则游戏成功,上面的LCD段码“HITS”数值加一,每一局规定可以发射子弹的数据,SHOTS LEFT显示还有多少发子弹可以发射。整体窗口布局可以分为以下几部分:上面的按钮及LCD段码,包括“Quit”“Shoot”“NewGame”“HITS”“SHOTS LEFT”;窗口左边的‖ANGLE‖,‖FORCE‖是LCD段码和滑动条的组合,可以用来改变发射角度和发射力量两个变量;窗口右边大部分黄色的区域是游戏主窗口,里面包括了大炮,炮弹,目标,障碍墙等几个成员。【实验代码】

lcdrangge.cpp和lcdrange.h创建了一个新的窗体,窗体中包含了一个标签,一个LCD段码,一个滑动条。滑动条和LCD段码建立信号与槽的联系,这样当滑动条移动时其数值的变化直接就可以通过LCD段码显示。其构造函数如下: void LCDRange::init(){ QLCDNumber *lcd = new QLCDNumber(2);// 定义LCD段码lcd->setSegmentStyle(QLCDNumber::Filled);slider = new QSlider(Qt::Horizontal);// 定义水平滑动条 slider->setRange(0, 99);slider->setValue(0);label = new QLabel;// 定义标签

label->setAlignment(Qt::AlignHCenter | Qt::AlignTop);label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));// 建立滑动条信号和LCD段码槽函数的连接

connect(slider, SIGNAL(valueChanged(int)), this, SIGNAL(valueChanged(int)));// 建立滑动条信号和窗体信号的连接QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(lcd);// 采用垂直布局器,安排三个组件layout->addWidget(slider);layout->addWidget(label);setLayout(layout);setFocusProxy(slider);// 设置焦点在滑动条上 } 1)大炮

大炮由两部分组成一部分是下面的底座,一部分是活动的炮筒。需要转换坐标系然后画一个饼形,对于炮筒,类似与上面钟表例子的时钟,需要随着角度的不同而不同,代码如下。void CannonField::paintCannon(QPainter &painter){ painter.setPen(Qt::NoPen);painter.setBrush(Qt::blue);painter.save();// 保存坐标信息

painter.translate(0, height());//平移坐标原点

painter.drawPie(QRect(-35,-35, 70, 70), 0, 90 * 16);// 画饼形

painter.rotate(-currentAngle);// 旋转坐标系,painter.drawRect(barrelRect);// 在新的坐标系中,画矩形,即炮筒

painter.restore();// 回复原来的坐标系 } 2)炮弹

炮弹使用一个小矩形代替,炮弹的运行轨迹为抛物线,代码如下 QRect CannonField::shotRect()const { const double gravity = 4;double time = timerCount / 20.0;double velocity = shootForce;// 发射力量

double radians = shootAngle * 3.14159265 / 180;// 发射角度 double velx = velocity * cos(radians);// 根据发射力量,角度和时间计算炮弹位置

double vely = velocity * sin(radians);// 采用标准牛顿力学公式

double x0 =(barrelRect.right()+ 5)* cos(radians);double y0 =(barrelRect.right()+ 5)* sin(radians);double x = x0 + velx * time;double y = y0 + vely * time1-qRound(y)));return result;} 3)目标

目标也是使用一个小矩形表示,为了增加趣味性,目标矩形的位置是随机的。QT提供了随机函数qrand提供随机数,创建一个新目标代码如下。

void CannonField::newTarget(){ static bool firstTime = true;// ensure create new target when old target disappear if(firstTime){ firstTime = false;QTime midnight(0, 0, 0);qsrand(midnight.secsTo(QTime::currentTime()));// 设置随机种子 } target = QPoint(200 + qrand()% 190, 10 + qrand()% 255);// 得到随机坐标值update();} 当炮弹发射后,需要判断炮弹是否击中了目标,可以使用下面函数判断。

void CannonField::moveShot(){ QRegion region = shotRect();// 保存炮弹矩形 ++timerCount;QRect shotR = shotRect();// receive new ball region if(shotR.intersects(targetRect())){ // 如果炮弹和目标重合,则认为击中目标 autoShootTimer->stop();// 停止定时器 emit hit();// 发送击中目标信号

emit canShoot(true);// 表示可以再次发送炮弹了 } else if(shotR.x()> width()|| shotR.y()> height()|| shotR.intersects(barrierRect())){// 如果炮弹到达边界过着碰到障碍墙 autoShootTimer->stop();// 本次发射结束 emit missed();// 发送没有击中目标信号 emit canShoot(true);// 表示可以再次发送炮弹 } Else { region = region.unite(shotR);//平滑移动炮弹 } update(region);} gameboard.cpp,gameboard.h这两个文件的作用是封装用到的所有成员建立信号与槽的连接,然后使用布局管理组件完成对各成员的布局。GameBoard初始化函数如下所示。

GameBoard::GameBoard(QWidget *parent): QWidget(parent){ QPushButton *quit = new QPushButton(tr(“&Quit”));quit->setFont(QFont(“Times”, 18, QFont::Bold));connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));LCDRange *angle = new LCDRange(tr(“ANGLE”));angle->setRange(5, 70);LCDRange *force = new LCDRange(tr(“FORCE”));force->setRange(10, 50);QFrame *cannonBox = new QFrame;cannonBox->setFrameStyle(QFrame::WinPanel | QFrame::Sunken);cannonField = new CannonField;connect(angle, SIGNAL(valueChanged(int)), cannonField, SLOT(setAngle(int)));connect(cannonField, SIGNAL(angleChanged(int)), angle, SLOT(setValue(int)));connect(force, SIGNAL(valueChanged(int)), cannonField, SLOT(setForce(int)));connect(cannonField, SIGNAL(forceChanged(int)), force, SLOT(setValue(int)));connect(cannonField, SIGNAL(hit()), this, SLOT(hit()));connect(cannonField, SIGNAL(missed()), this, SLOT(missed()));QPushButton *shoot = new QPushButton(tr(“&Shoot”));shoot->setFont(QFont(“Times”, 18, QFont::Bold));connect(shoot, SIGNAL(clicked()), this, SLOT(fire()));connect(cannonField, SIGNAL(canShoot(bool)), shoot, SLOT(setEnabled(bool)));QPushButton *restart = new QPushButton(tr(“&New Game”));restart->setFont(QFont(“Times”, 18, QFont::Bold));connect(restart, SIGNAL(clicked()), this, SLOT(newGame()));hits = new QLCDNumber(2);hits->setSegmentStyle(QLCDNumber::Filled);shotsLeft = new QLCDNumber(2);shotsLeft->setSegmentStyle(QLCDNumber::Filled);QLabel *hitsLabel = new QLabel(tr(“HITS”));QLabel *shotsLeftLabel = new QLabel(tr(“SHOTS LEFT”));(void)new QShortcut(Qt::Key_Enter, this, SLOT(fire()));(void)new QShortcut(Qt::Key_Return, this, SLOT(fire()));(void)new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));QHBoxLayout *topLayout = new QHBoxLayout;topLayout->addWidget(shoot);topLayout->addWidget(hits);topLayout->addWidget(hitsLabel);topLayout->addWidget(shotsLeft);topLayout->addWidget(shotsLeftLabel);topLayout->addStretch(1);topLayout->addWidget(restart);QVBoxLayout *leftLayout = new QVBoxLayout;leftLayout->addWidget(angle);leftLayout->addWidget(force);QVBoxLayout *cannonLayout = new QVBoxLayout;cannonLayout->addWidget(cannonField);cannonBox->setLayout(cannonLayout);QGridLayout *gridLayout = new QGridLayout;gridLayout->addWidget(quit, 0, 0);gridLayout->addLayout(topLayout, 0, 1);gridLayout->addLayout(leftLayout, 1, 0);gridLayout->addWidget(cannonBox, 1, 1, 2, 1);gridLayout->setColumnStretch(1, 10);setLayout(gridLayout);angle->setValue(60);force->setValue(25);angle->setFocus();newGame();} 【实验总结】

这个实验让我体会到QT编程的魅力所在。虽然有源码,需要自个编写的东西并不多,但还是有很大的收获的。

第四篇:射击游戏 Java

游戏资源是从cping1982的博客里下载的(http://blog.csdn.net/cping1982/article/details/6725015)。

下载下来的源码是反编译的,我按照自己的思路,尽量模拟跟它一样的功能效果,用自己的代码实现,并且自己写了一个地图编辑器。用到的技术大概有:swing基本控件,线程,XML读写,IO,反射的简单应用,2D绘图。

最重要的一个自定义类:Canvas。

每个canvas都有一个render方法和update方法,每个canvas又可以添加别的canvas,类似swing的component结构,每个canvas执行render和update的时候都会遍历所有子canvas执行render和update,从而实现所有canvas都执行渲染和更新。游戏的刷新机制:

这个刷新机制是直接学的原代码里面的实现机制,看它没注释的代码着实蛋疼,还是请教了我师傅desolatecity大神才理解的--!。

最高层是一个继承JFrame的GameFrame,实现了Runnable,游戏启动后会单独运行不断循环刷新,每隔大概15ms就执行一次render,并将整个循环所用时间通过update方法传给canvas,最高层canvas再一层一层传递下去,实现所有canvas的渲染和更新。大致代码实现如下:

[java] view plaincopy

1.while(gameOn){

2.// 获取开始时的系统时间

3.long startTime = System.currentTimeMillis();4.5.// 标记时间所用变量

6.long l1;

7.long l2 = System.currentTimeMillis();8.long l3 = System.currentTimeMillis();9.10.// 执行for循环,直到经过了step毫秒

11.for(l1 = l3l2){ 12.l3 = System.currentTimeMillis();13.}

14.// for循环结束,开始渲染和更新

15.l2 = System.currentTimeMillis();// 重置l2

16.17.this.getCurrentCanvas().render(g2);// 渲染

18.19.this.getGraphics().drawImage(bufImg, 0, 0, null);// 将缓冲图片画到JFrame

20.21.long endTime = System.currentTimeMillis();// 获取结束时的系统时间

22.23.this.getCurrentCanvas().update(endTime 元素”的映射关系将时间和对应元素存储到一个IdentityHashMap里,然后游戏的主canvas在update的时候遍历IdentityHashMap,若当前时间满足map里面的时间,则将对应的元素提取出来,添加到当前的子canvas列表里面,从而一个新的元素(或敌人,或提示消息等)就被添加到了界面上。这里我用到了一个比较少用的IdentityHashMap,原本直接用的是HashMap,后来发现一个时间有时候要对应多个元素,然后上网查到了这个东东,但是由于键是按照对象来存储的,所以要把时间用String对象来存储,搞得读取和存储的时候各种麻烦。结果后来师傅一指点才知道,可以直接用HashMap来存储“时间--ArrayList”,这样又方便又直接。--!后来嫌麻烦也不去改了。。

地图编辑器:

地图编辑器没有什么特别费脑袋的地方,就是各种swing控件的运用,还有xml的读写,简单的反射应用等。

由于整个游戏基本上都是在边学变写,所以很多地方写的很粗糙,以至于后来去整理的时候发现前面的代码结构简直丑死了--,改都该了半天。

最后附上源码下载地址,如果有兴趣的话可以互相探讨学习。

下载地址:http://download.csdn.net/download/jianglihui0330/4493082

游戏截图:

地图编辑器截图:

第五篇:射击游戏实例

第七讲 射击游戏实例

学习目标:  设置显示图标的属性

 运动图标中Direct to Grid类型的使用  Goto、Test函数的使用  使用交互图标的按键响应  声音图标的使用

 利用Random函数随机定义显示位置 程序功能

飞机每4秒移动到一个随机位置,利用方向键移动瞄准器。瞄准器套住飞机后,可以按键射击,飞机被击中后爆炸。2 主要操作步骤

 拖入计算图标,名为“初始化”,在计算窗口中输入: x:=50 y:=50 ——(x,y)为瞄准器的坐标 x1:=Random(1,100,1)y1:=Random(1,100,1)——(x1,y1)为飞机的坐标

拖入显示图标,名为“瞄准器”

打开菜单命令 [Modify]/[Icon]/[Properties],设置Positioning为On Screen,Movable为On Screen,并设置Layer为3 拖入显示图标,引入飞机的图片

打开菜单命令 [Modify]/[Icon]/[Properties],设置Positioning为On Screen,Movable为On Screen 拖入运动图标,双击打开属性窗口,选择Type为Direct to Grid,选中被射击物,拖动图片定义Base和End,定义Destination为x1和y1,并设置Concurrency为Perpetual 拖入运动图标,设置瞄准器的运动图标同上,Destination为x和y 拖入交互图标,再拖入计算图标到交互图标右侧,名为“4秒后移动”,选择Time Limit响应类型

双击响应类型符号,设置Time Limit为4,取消Show Time Remaining的选择,设置Branch为Continue 打开计算图标窗口,输入以下内容: x1:=Random(1,100,1)y1:=Random(1,100,1)

 

GoTo(IconID@“移动飞机”)—— GoTo为系统函数

 拖入计算图标到交互图标最右侧,双击响应类型符号,选择Type为Keypress,设置Key(s)为leftarrow

注:leftarrow为系统指定的键盘左键的名称

打开计算图标窗口,输入以下内容: x:=x-5 Test(x<0,x:=0)

——Test(条件,表达式1,表达式2)是系统函数,条件成立时,执行表达式1,否则执行表达式2 同理,拖入三个计算图标,Key(s)分别为rightarrow、uparrow和downarrow

在rightarrow计算窗口中输入: x:=x+5 Test(x>100,x:=100)在uparrow计算窗口中输入: y:=y-5 Test(y<0,y:=0)在downarrow计算窗口中输入: y:=y+5 Test(y>100,y:=100)

拖入群组图标到交互图标最右侧,双击响应类型符号,设置Key(s)为Tab,Branch为Exit Interaction,在Active If中输入ABS(x-x1)<20 & ABS(y-y1)<20

打开群组图标,在二级流程线上拖入显示图标,引入爆炸图片

打开菜单命令 [Modify]/[Icon]/[Properties],设置Positioning为In Area,Movable为In Area,拖动图片定义Base和End,设置Initial为x1和y1

在二级流程线上拖入清除爆炸画面的擦除图标 

pascal射击游戏完整版
TOP