;
;程序名 : 贪吃蛇
;程序作者: Softgsy
;编程时间: 2008-04-19
;修改时间: 2008-04-23;04-25;04-26
;
;___________________________________________________文档__________
;函数功能:
;Protect和Recover : 保护和恢复寄存器现场
;Display : 显示蛇头的''和用' '覆盖旧蛇尾的''
;Curser : 将光标置于方框外
;Move : 移动蛇,并判断蛇长是否已经满15,并置al:ffh
;nextstep : 蛇移动一步
;judge : 判断蛇的前方是什么(al作接口):
; 00h:食物 0fh:正常 f0h:障碍
;food : 置食物
;_________________________________________________________________
include macro_snakeinc
;数据段定义
Data segment
snake dw 0101h,0102h,0103h,13 dup(0000h)
graph db 9 dup('#'),0dh,0ah,'# #',0dh,0ah
db 11 dup('#',7 dup(' '),'#',0dh,0ah)
db 9 dup('#'),0dh,0ah,'$'
win db 'You Win!',0dh,0ah,'$'
lose db 'What a pity!',0dh,0ah,'$'
direction dw 0064h
speed1 equ 1000h
speed2 equ 0100h
Data ends
;堆栈段定义
Stack segment stack
dw 0ffh dup()
Stack ends
;附加段定义
Extra segment
snake_food dw 0b06h,0703h,0c01h,0204h,0606h,0a02h,0405h,0905h
dw 0101h,0c04h,0502h,0207h,0c07h,0604h,0c02h,0304h
Extra ends
;代码段定义
Code segment
assume cs:Code,ds:Data,ss:Stack,es:Extra
;主程序定义
start:
mov ax,Data
mov ds,ax
mov ax,Stack
mov ss,ax
mov ax,Extra
mov es,ax
mov dx,offset graph
mov ah,09h
int 21h
mov bx,0000h ;蛇尾位置及bh页号
mov si,0002h ;蛇头位置
mov di,offset snake_food
call food
xor ax,ax
outloop:
cmp al,0ffh
jz gamewin
cmp al,0f0h
jz gamelose
call nextstep
jmp outloop
gamewin:
mov dx,offset win
mov ah,09h
int 21h
jmp gameover
gamelose:
mov dx,offset lose
mov ah,09h
int 21h
gameover:
mov ax,4c00h
int 21h
;子程序定义
;_____________________________________________向前走一步__________
nextstep proc near
input:
get_direction direction,speed1,speed2
mov ax,direction
cmp al,'a'
jz m_l
cmp al,'A'
jz m_l
cmp ah,4bh
jz m_l
cmp al,'d'
jz m_r
cmp al,'D'
jz m_r
cmp ah,4dh
jz m_r
cmp al,'w'
jz m_u
cmp al,'W'
jz m_u
cmp ah,48h
jz m_u
cmp al,'s'
jz m_d
cmp al,'S'
jz m_d
cmp ah,50h
jz m_d
jmp input
m_l:
Move sub,0001h
jmp ret_
m_r:
Move add,0001h
jmp ret_
m_u:
Move sub,0100h
jmp ret_
m_d:
Move add,0100h
jmp ret_
ret_: ret
nextstep endp
;_____________________________________________判断下一步__________
judge proc near ;00h:食物,0fh:正常,f0h:障碍
push cx
mov ah,02h
int 10h
mov ah,08h
int 10h
mov ch,al
mov al,00h
cmp ch,'o'
jz outjudge
mov al,0fh
cmp ch,' '
jz outjudge
mov al,0f0h
outjudge:
pop cx
ret
judge endp
;_____________________________________________置食物函数__________
food proc near
Protect
inc si
and si,000fh
mov cx,bx
getfood:
add di,0002h
cmp di,20h
jb go_on
xor di,di
go_on:
mov bx,cx ;保证每次检查都从尾开始
lp:
shl bx,1
mov dx,es:[di]
cmp dx,snake[bx]
jz getfood
shr bx,1
inc bx
and bx,000fh
cmp bx,si
jnz lp
mov dx,es:[di]
mov ah,02h
int 10h
mov al,'o'
mov ah,0eh
int 10h
Curser
Recover
ret
food endp
;子程序结束
Code ends
end start
国内免费网游 劲乐团
主页 http://o2jam9youcom/indexhtml
注册地址 http://registo2jam9youcom/regist/indexphp
客户端下载 http://o2jam9youcom/download_1html
-------------------------------------
国内免费网游 热血英豪
主页 http://wwwgetampedcomcn/
注册地址 http://6117225293/account/indexhtm
客户端下载 http://getampedpoptangcom/getamped/download/indexhtm
-------------------------------------
国内免费网游 凯旋[只有3个大区免费]
主页 http://kaixuanqqcom/
注册地址 [使用QQ号进入游戏]
客户端下载 http://kaixuanqqcom/QQgame/index_kxhtm
-------------------------------------
国内免费网游 疯狂坦克Ⅱ
主页 http://homeft2poptangcom/newweb/indexhtm
注册地址 http://homeft2poptangcom/newweb/account/indexphpa=1
客户端下载 http://homeft2poptangcom/newweb/download/indexphpa=1
-------------------------------------
国内免费网游 咕噜咕噜
主页 http://ulfunulandcom/
注册地址 http://ulfunulandcom/member/regselectaspx
客户端下载 http://ulfunulandcom/Html/Download/clientaspx
-------------------------------------
国内免费网游 巨商
主页 http://gamegamaniacomcn/jushang/
注册地址 http://gamegamaniacomcn/jushang/member/member_elecasp
客户端下载 http://gamegamaniacomcn/jushang/
-------------------------------------
国内免费网游 猎人MM
主页 http://mm9youcom/indexhtml
注册地址 http://registmm9youcom/
客户端下载 http://mm9youcom/info_17html#to
-------------------------------------
国内免费网游 冒险岛
主页 http://mxdpoptangcom/
注册地址 游戏内可以注册
客户端下载 http://mxdpoptangcom/web/home/downloadsaspa=1
-------------------------------------
国内免费网游 命运Ⅱ
主页 http://wydhappydigicom/mainasp
注册地址 http://wydhappydigicom/account/reg/indexasp
客户端下载 http://wydhappydigicom/down/clinetasp
-------------------------------------
国内免费网游 密传
主页 http://tantrahappydigicom/index_02asp
注册地址 http://tantrahappydigicom/tanreg/tantra_id_preasp
客户端下载 http://tantrahappydigicom/download/clientasp
-------------------------------------
国内免费网游 彩虹冒险
主页 http://sphappydigicom/mainasp
注册地址 http://sphappydigicom/member/sp_quasp
客户端下载 http://sphappydigicom/surp/sup_downasp
1,中国大陆
天之游侠 http://ut2cncom/indexhtm
热血江湖 http://rxjh17gamecom/
图形江湖 http://wwwtxjhcomcn/
江湖 http://jianghuol88joycomcn/indexhtm (现在公测,据说将免费)
命运2 http://wydhappydigicom/mainasp
密传 http://tantrahappydigicom/index_02asp
彩虹冒险 http://sphappydigicom/mainasp
PangYa http://pangyahappydigicom/indexasp
仙界传 http://wwwxjzcomcn/index1aspx
巨商 http://gamegamaniacomcn/jushang/
猎人mm http://mm9youcom/indexhtml
劲乐团 http://o2jam9youcom/
劲舞团 http://au9youcom/
贪吃蛇 http://snake9youcom/
飙车 http://ctrjoyzonecomcn/defaulthtm
武林外史 http://dopoptangcom/homepage/
泡泡堂 http://bnbpoptangcom/newbnb/homepagehtm
冒险岛 http://mxdpoptangcom/
疯狂坦克 http://ft2poptangcom/defaultasp
奇侠 http://wwwxonlinecomcn/
碧雪情天之炼魔录 http://mygametomcom/bx/mainphp
科隆2 http://corum29youcom/indexhtml
魂Online http://wwwi3huncom/indexhtm
凯旋 http://kaixuanqqcom/indexshtml
热血英豪 http://bfopoptangcom/
咕噜咕噜 http://wwwulfunulandcom/
TO~星钻物语 http://togamigocomcn/defaultaspx
2,中国台湾
乱online http://wwwrancomtw/gamesite/indexaspx
天方夜谭 http://1001wkeccom/
荣耀 http://caemdigicellcomtw/
万王之王 http://koklagercomtw/indexchtml(大陆http://koklagercn/index1asp)
创世霹雳 http://pilionlinelagercomtw/
戏谷撞球馆 http://www9ballonlinecomtw/
星空之门 http://wwwsgorpgcom/
枫之谷 http://wwwmaplestorycomtw/
科隆 http://corumsaga-citycom/intro/intro_introhtml
羽音 http://wwwwayicomtw/ueonline/
魔法飞球 http://wwwgamaniacom/pangya/indexasp
百变恰吉 http://wwwgamaniacom/getamped/indexasp
神武 http://gfdigicellcomtw/
彩虹冒险 http://wwwspgamecomtw
征服 http://zftw91com/homehtm
曙光Online http://wwwhbonlinecomtw/indexphp
百变恰吉 http://wwwgamaniacom/getamped/
有新游戏了:
天下大乱 http://wwwlastworldcomtw/
2005/8/19 19:00 ,正式公测!
终生免费,资料完全保留!! 超完美3D线上游戏!! 五大职业,丰富任务,个人地牢,公会战争,转职进化,生产技能,魅力全开放!
3,韩国(如何注册请自行搜索
丝路传说/SilkRoad http://krsilkroadyahoocom/ (国内即将公测 http://wwwsrocncom/ 好象不是免费)
刀/KalOnline http://wwwnetmarblenet/cp_site/kal/indexasp (中国官方http://wwwkalonlinecomcn/mainhtml)
ROSE Online http://wwwroseoncom/index3asp
Legend of Mir3 http://wwwlegendofmir3cokr/
Knight online http://onlinemgamecom/game/knight_renew/
Lunentia http://heromgamecom/
决战/droiyan http://wwwdroiyancom/(国内官网:http://dr17gamecom/indexasp)
Planeshift http://wwwplaneshiftit/main_01html(开发中)
天之游侠 http://ut2cncom/indexhtm
热血江湖 http://rxjh17gamecom/
图形江湖 http://wwwtxjhcomcn/
江湖 http://jianghuol88joycomcn/indexhtm
命运2 http://wydhappydigicom/mainasp
密传 http://tantrahappydigicom/index_02asp
彩虹冒险 http://sphappydigicom/mainasp
PangYa http://pangyahappydigicom/indexasp
仙界传 http://wwwxjzcomcn/index1aspx
巨商 http://gamegamaniacomcn/jushang/
猎人mm http://mm9youcom/indexhtml
劲乐团 http://o2jam9youcom/
劲舞团 http://au9youcom/
贪吃蛇 http://snake9youcom/
飙车 http://ctrjoyzonecomcn/defaulthtm
武林外史 http://dopoptangcom/homepage/
泡泡堂 http://bnbpoptangcom/newbnb/homepagehtm
冒险岛 http://mxdpoptangcom/
疯狂坦克 http://ft2poptangcom/defaultasp
奇侠 http://wwwxonlinecomcn/
碧雪情天之炼魔录 http://mygametomcom/bx/mainphp
科隆2 http://corum29youcom/indexhtml
魂Online http://wwwi3huncom/indexhtm
凯旋 http://kaixuanqqcom/indexshtml
热血英豪 http://bfopoptangcom/
咕噜咕噜 http://wwwulfunulandcom/
TO~星钻物语 http://togamigocomcn/defaultaspx
魔牌online http://mopai9youcom/indexhtml
信仰 http://xy91com/homehtm
星战情缘 http://wwwlovexzcom/indexhtm
新古龙群侠传 http://gl91com/homehtm
魔幻森林 http://game5617com/magicforest/
飞飞 http://ff163com
希望 http://wwwsealonlinecomcn/default_z1asp
互动武侠 http://wwwwuxiaonlinecom/defaultphp
天方夜谭online http://wwwtfytcomcn/
赛车 http://www51wcgcom/indexasp
曰月传说 http://wwwttplaycn/
GF大冒险 http://wwwourgamecom/golf
新天骄 http://wwwtjnetcomcn
骑士online http://kosohucom/indexshtml
海盗王online http://wwwmoliyocom/game_kop/homeaspx
街头篮球 http://wwwfsjoycom/mainhtml
热血传奇 http://homemir2poptangcom/home/home/
盛大富翁 http://richsdocom/
梦幻国度 http://mlandsdocom/new/home/indexasp(11月24曰起永久免费)
破碎银河系 http://psonlinepoptangcom/psonline_new/homepagehtm (11月28曰开始全面免费)
传奇世界 http://homewooolsdocom/home/homepage/ (12月2曰19:00开始全面免费)
美丽世界 http://homenagecomcn/ (12月19曰开始全面免费)
《征途》 http://wwwztgamecomcn/indexshtml
参考资料:
1 傲世Online
《傲世Online》是一款三国题材游戏,写实在游戏中的人物、建筑、衣饰都得到体现,进入游戏就仿佛进入磅礴大气的三国乱世。
2 傲世Online
《傲世Online》是一款三国题材游戏,写实在游戏中的人物、建筑、衣饰都得到体现,进入游戏就仿佛进入磅礴大气的三国乱世。
3 哔哔曼
首款原创国产休闲游戏,独创的陷井战斗模式
4 碧雪情天
《碧雪情天》是一款即时网络RPG,拥有漂亮的中国风味游戏画面,简单上手的游戏操作, 华丽的人物技能等特点
5 传奇世界
由盛大公司自我研发的2D网游,和热血传奇类似,拥有道士战士法师三个职业,游戏非常平衡。
6 热血传奇
热血传奇,堪称网游玩家无人不晓的一代经典,分道士、战士、法师三个职业。
7 彩虹冒险
《彩虹冒险(SP)》是利用网络与其他用户形成实时对战的在线动作游戏,提供了独特属性的武器和8位清新可爱的主角色,玩家进行战术性的即时对战。
8 超级舞者
《超级舞者》是久游汇集国内精英设计开发团队,自主研发的一款3D网络音乐舞蹈游戏。
9 辉煌
辉煌是一款以幻想大陆为背景的全3D网络游戏,采用全新图形技术,游戏画面可自由转换,3D视觉效果感炫目,情节丰富离奇。
10 混乱冒险
混乱冒险在线游戏是一个以科幻为题材,内容叙述人类为寻求救援之地,而出发进行大移动,犹如叙事史诗般浩大的全3D多人在线游戏。
11 海盗王Online
海盗王是一款Q版网游,画面华丽细腻、画风清新可爱。采用实时的战斗系统,融入了即时战略的元素,再呈现出海盗的传奇生活。
12 劲乐团
劲乐团是韩国O2Media游戏公司开发的一款MMOMPG (Massive Multi Online Music Play Game) 游戏。它是世界上第一款以MP3音乐为游戏平台的休闲音乐游戏。
13 巨商
"巨商"这款游戏并不以练功,打怪物为主轴。玩家以类似商人的角色,在各大陆间交易,"买低卖高"的商业行为来进行整个游戏
14 劲舞团
玩过跳舞机么?劲舞团可以说是跳舞机的网络版,一起来展示自己吧!
15 江湖OL
江湖OL以全3D引擎制作开发,360度角度旋转,可以推近拉远,画面朴素写实,动作协调好看,战斗时配以荡气回肠的传统古乐,极具东方色彩
16 街头篮球
在《街头篮球》中玩家自己作为队员直接参与比赛,每个玩家只能扮演一个队员,拥有多人互动的对战模式,精彩刺激的技术动作以及简单的操作。
17 科隆2
《科隆2》是曾获得众多玩家青睐的MMORPG大作《科隆》的续作,由Nettime Soft公司开发,其游戏风格非常类似著名的《暗黑破坏神II》
18 猎人MM
《猎人MM》是一款Q版风格,面向女性玩家的宠物网络游戏。
19 雷霆战队
《雷霆战队II》目前免费运营,玩家可以像玩CS那样在网络上与FPS玩家较量枪法、团队意识。
20 梦幻国度
梦幻国度是一款2D网游,画面风格清新、唯美,人物采用Q版造型卡通可爱。采用即时的战斗模式;拥有丰富的换装系统,人物的发型,衣服,武器都可以变更。 ……
21 密传
3D网游《密传》是一款充满浓厚东方神话色彩的网络游戏。以印度神话为背景,以天龙八部的文化为主线。
22
魔剑
欧美风格全3D网游,以“永无休止的战争”作为游戏的主旋律,倍受玩家推崇的游戏。
23 美丽世界
美丽世界于2005年12月19日免费,是一款以现代都市为背景的3D网游。玩家可以在游戏里进行飚车、打架、打工挣钱等行为
24 命运
《命运》是一款免费3D奇幻网络游戏,拥有细致而真实化的画面、宽广的世界和刺激的战斗系统。
25 猛将
《猛将》是由久游网自主研发的第三人称45度角3D游戏。以三国题材为主线,游戏中用户将以普通武将的身份,参与到乱世风云之中。
26 冒险岛
《冒险岛》是由盛大免费运营的一款Q版网游,画风可爱,操作、任务系统都属上品。
27 跑跑卡丁车
跑跑卡丁车是一款泡泡堂角色们登场的卡丁车竟速游戏。玩家可以在竟速模式中体验到刺激的漂移感觉,也可以体会到使用多样道具的乐趣。
28 泡泡堂
《泡泡堂》是盛大网络推出的一款家庭休闲网络游戏。与其他网络游戏动辄占据几百兆的容量不同,泡泡堂只有40兆,决不占用您宝贵的硬盘空间;一机双人操作……
29 骑士Online
《骑士》于2005年10月20日开始免费,以全3D绘图技术制作,拥有细腻的人物设定、精致的自然环境、炫丽的魔法效果。
30 骑士2
3D奇幻浪漫史诗网游《骑士20》内测于2月25日开放,游戏界面、操作性、魔法光效、场景地图等等重新刻画加工
31 热血江湖
《热血江湖》采用新一代的3D引擎,营造了一个清新亮丽的江湖世界,拥有幽默生动的游戏元素、多样变化的物品装备,丰富的职业和灵活的成长方式。
32 日月传说
山东省自主研发的首款网游,有剑宗,气宗,魔宗三个派别。
33 热血英豪
热血英豪是由盛大运营的一款免费Q版网游,游戏采用类似于泡泡堂的游戏大厅和开房间方式进行战斗。
34 丝路传说
《丝路传说》以丝绸之路为背景,是一款结合了中国、波斯、罗马等古代文明的3D幻想类网游,不存在固定的职业。所有玩家自由行动、自由成长。
35 少林传奇
《少林传奇》是一款3D回合制网游,围绕着“少林武功”进行,玩家可以在游戏里拜师学武,组队战斗,采药铸造,组建帮派,甚至参加比武大会进行切磋。
36 山河
游戏不打怪不练级,如果要给《山河》下一个精确的定义,那就是: 再现一个真实江湖的武侠网络游戏。
37 SOS
全球首款3D绿色休闲对战网络游戏《SOS》将终身免费,玩家不需要花费任何费用即可登录游戏
38 盛大富翁
绿色休闲网络游戏《盛大富翁》,是一款以掷骰子、买土地等各种手段,使对手破产,自己胜利的一款休闲游戏
39 三国豪侠传
《三国豪侠传》是一款 3D 卡通风格的Q版三国休闲游戏,可爱爆笑的游戏风格,亲切人性化的操作,让您轻轻松松上手,快快乐乐游戏……
40 天之炼狱
新版《天炼》效法韩服,免费可玩,只售双倍经验月卡,游戏以引入了吸血鬼作为玩家角色著称。
41 天方夜谭
"天方夜谭"是一款幻想卡通风格的MMORPG,具有巨量的变装系统,Q版卡通+漫画风格、可以编辑的华丽连击系统
42 武林外史
《武林外史》是一款武侠背景的3D网游,以古代中国为背景,分4个职业,画面完美,动作流畅。
43 万王之王
万王之王 是国内运营的首款网络游戏,目前已经免费运营。
44 侠义道
《侠义道》是一款完全意义上体现真武侠文化的国产武侠网络游戏。游戏通过趣味性的武功系统向玩家展现出一个浪漫而又真实的江湖世界。
45 希望online
《希望》是一款Q版3D网游,游戏角色个性独特,外貌可爱,怪物行动搞笑,系统丰富。
46 仙界传
《仙界传》是一款浓郁漫画色彩的回合制战斗网游,以封神演义与山海经为基础,重现神话传说中的各路神仙妖怪以及兵器法宝,元素多样、系统丰富。
47 新天骄
《新天骄》于2005年9月28日免费公测,是一款以秦末时期为背景的2D网络游戏,画面细腻,拥有独特的五行、打造、道具等系统。
48 新石器时代
金山公司对外正式透露,将于3月9日正式发布经典Q版网游《石器时代》全新续作《新石器时代》,并且将全部采用免费运营的商业模式。
49 TO~星钻物语
《TO~星钻物语》是一款适合女性玩家的Q版网游,拥有卡通风格的画面,夸张搞笑的表情,精致细腻的战斗动作、绚烂夺目的魔法技能。
50 侠客行III
《侠客天下》由当年全球第一文字MUD游戏《侠客行》发展而来,于2006年改名侠客行III,并永久免费。
51 龙族
《新龙族》由泥巴谭公司于2005年12月接手运营,以庞大的战斗系统和国战系统著称。
52 小鱼儿与花无缺Online
53 新古龙群侠传
新古龙群侠传以最受RPG迷所欢迎的45度俯视视角进行,在画面及图像方面,均按实际比例制作,让游戏变得更加真实。
54 信仰
《信仰》是天晴数码公司资助研发的一款以高级龙与地下城规则(AD&D)为基础的奇幻类网络游戏
55 新倚天
《新倚天》14日宣布永久免费,官方只出售供玩家自由选择的物品而绝对不是游戏装备。
56 英雄年代
《英雄年代》是一款集文明发展与武侠气息于一身的新概念网游
57 欲望龙之故乡
《欲望-龙之故乡》根据中国古代神话传说为蓝本,将传统历史文化和科技文明相融合的2D卡通版角色扮演类网游。
58 征途
《征途》是一款大型2D网络游戏,拥有庞大的国战场面、自由的角色养成、拟真的自然变化、人性化的帮助系统 、多变的装备系统等特色。
59 智通竞答
《智通竞答》为目前中国唯一一款在线运行的免费智力问答网络游戏。
更多请关注 www123ercom
我找了一个发给你吧。
#include<stdioh>
#include<conioh>
#include<stdlibh>
#include<biosh>
#define KEY_UP 0x48
#define KEY_LEFT 0x4B
#define KEY_RIGHT 0x4D
#define KEY_DOWN 0x50
#define ESC 0x011b
const int gamespeed=90000 ;/游戏速度自己调整/
struct point
{
int x ;
int y ;
}
p[100];
struct point fd;
void p_frame() /边界/
{
int i ;
printf("\n\t\t");
for(i=0;i<41;i++)
printf("=");
printf("\n");
for(i=0;i<20;i++)
printf("\t\t|\t\t\t\t\t|\n");
printf("\t\t");
for(i=0;i<41;i++)
printf("=");
}
void print(int n)/输出蛇/
{
int i ;
clrscr();
p_frame();
gotoxy(fdx,fdy);
printf("@");
for(i=0;i<=n;i++)
{
gotoxy(p[i]x,p[i]y);
printf("");
}
}
int gameover(int n)/是否咬到自己了/
{
int i;
for(i=0;i<n-1;i++)
if(p[i]x==p[n]x && p[i]y==p[n]y )
return 1;
return 0;
}
void slp() /这是我自己加的画面/
{
int a=40,b=20,i,t,x,y;
x=16;
y=2;
for(t=0;t<50;t++)
{
if(t%4==0) {
for(i=0;i<a;i++){
gotoxy(x++,y);
printf("");
}
a--;
}
else
if(t%4==1){
for(i=0;i<b;i++){
gotoxy(x,y++);
printf("");
}
b--;
}
else
if(t%4==2){
for(i=0;i<a;i++){
gotoxy(x--,y);
printf("");
}
a--;
}
else
if(t%4==3){
for(i=0;i<b;i++){
gotoxy(x,y--);
printf("");
}
b--;
}
delay(gamespeed);
}
}
void prover(int n)/结束时的输出/
{
slp();/落幕/
clrscr();
p_frame();
gotoxy(23,8);
printf("Game Over T_T You have got %d",n+1);
gotoxy(23,9);
printf("Go On(y/n)");
}
void calculate(int px,int py,int pn)/计算更新每个节点的位子/
{
int i,n,tx,ty;
n=pn;
tx=px;
ty=py;
if(tx<17) tx=57;
else if(tx>56) tx=17;
if(ty<=1) ty=22;
else if(ty>22) ty=2;
if(tx==fdx&&ty==fdy)
{
n++;
p[n]x=fdx ;
p[n]y=fdy ;
printf("\a");
fdx=rand()%39+18 ;
fdy=rand()%20+3 ;
}
else
{
for(i=0;i<n;i++)
{
p[i]x=p[i+1]x ;
p[i]y=p[i+1]y ;
}
p[n]x=tx;
p[n]y=ty;
}
pn=n;
px=tx;
py=ty;
}
void main()
{
int n,tx,ty,f=1,flag,game; /当前蛇的长度,x,y记录更改的蛇头部/
int pn,px,py;
char key ;
pn=&n ;
px=&tx;
py=&ty;
n=1; /蛇身体0~n/
fdx=rand()%20+17 ;/初始状太/
fdy=rand()%17+3 ;
p[0]x=20 ;
p[0]y=3 ;
tx=p[1]x=21 ;
ty=p[1]y=3 ;
flag=0; /记录无效的反向按键/
while(1)
{
while(!kbhit())/无键盘消息/
{
switch(f)
{
case 1 :
ty++;
break ;
case 2 :
ty--;
break ;
case 3 :
tx--;
break ;
case 4 :
tx++;
break ;
}
calculate(px,py,pn);
print(n);
sleep(1);
}/有消息出现/
flag=0;
key=getch();/key=bioskey(0);接收按键/
switch(key)
{
case KEY_DOWN :
if(f!=2){
f=1 ;
ty++;
flag=1;
}
break ;
case KEY_UP :
if(f!=1){
f=2 ;
ty--;
flag=1;
}
break ;
case KEY_LEFT :
if(f!=4){
f=3 ;
tx--;
flag=1;
}
break ;
case KEY_RIGHT :
if(f!=3){
f=4 ;
tx++;
flag=1;
}
break ;
}
if(key==' ')break ;
if(flag) /按键有效/
{
calculate(px,py,pn);
print(n);
delay(gamespeed);
}
/game/
if(gameover(n))
{
prover(n);
key=getch();
if(key=='n')
break;
else /重玩/
{
n=1;
ty=p[1]y;
tx=p[1]x;
}
}
}
}
源文章地址:
http://hibaiducom/sulipol/blog/item/514443b6b39612f830add16chtml
/
贪吃蛇游戏,由于是C++源码 且 用到Windows API ,是控制台界面不是图形界面,需要用VC++60 或 VC++2010 在windows环境编译运行。如果符合上述条件一定可以编译运行zjlj,2015316
/
#define DEBUG 0 //当程序在调试阶段时 DEBUG为 1
#include<iostream>
#include<windowsh>
#include<timeh>
#include<conioh>
using namespace std;
void readini(FILE fphead, int score, char argv[]) //创建或打开一个和运行文件对应的ini文件,读取最高纪录
{
char filename[200],pfilename;
int flag=-1,i;
strcpy(filename,argv[0]);
for(i=0;filename[i]!='\0';i++)
{
if (''==filename[i])flag=1;
}
if(1==flag)
{
filename[i-1]='i';
filename[i-2]='n';
filename[i-3]='i';
}
else
{
filename[i]='';
filename[i+1]='i';
filename[i+2]='n';
filename[i+3]='i';
filename[i+4]='\0';
}
for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
if ( (fphead=fopen(pfilename, "rb+"))==NULL)
{
if ( (fphead=fopen(pfilename, "wb+"))==NULL)
{
printf("无法创建或打开\"%s\"文件\n",pfilename);
system("pause");
exit(0);
}
}
else
{
fread(score,sizeof(int),1,fphead);
}
}
void writeini(FILE fphead, int score, char argv[]) //打开一个和运行文件对应的ini文件,写入最高纪录
{
char filename[200],pfilename;
int flag=-1,i;
strcpy(filename,argv[0]);
for(i=0;filename[i]!='\0';i++)
{
if (''==filename[i])flag=1;
}
if(1==flag)
{
filename[i-1]='i';
filename[i-2]='n';
filename[i-3]='i';
}
else
{
filename[i]='';
filename[i+1]='i';
filename[i+2]='n';
filename[i+3]='i';
filename[i+4]='\0';
}
for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
if ( (fphead=fopen(pfilename, "wb+"))==NULL)
{
printf("无法写入\"%s\"文件,磁盘写保护!\n",pfilename);
system("pause");
exit(0);
}
else
{
rewind(fphead);
fwrite(score,sizeof(int),1,fphead);
fclose(fphead);
}
}
void gotoxy(int x,int y)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸
{
COORD pos;
posX=2y;
posY=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void Refresh(int q[][22], int grade, int gamespeed, int length,int score) // 输出贪吃蛇棋盘
{
int i,j;
for(i=0;i<22;i++)
{
for(j=0;j<22;j++)
{
if(q[i][j]==0)//输出棋盘空白
{
gotoxy(i,j);
color(11);
cout<<"■";
}
if(q[i][j]==1||q[i][j]==2)//输出棋盘墙壁
{
gotoxy(i,j);
color(11);
cout<<"□";
}
if(q[i][j]==3)//输出蛇头
{
gotoxy(i,j);
color(14);
cout<<"★";
}
if(q[i][j]==4)//输出蛇身
{
gotoxy(i,j);
color(12);
cout<<"◆";
}
if(q[i][j]==5)//输出果子
{
gotoxy(i,j);
color(12);
cout<<"●";
}
}
if(i==0) cout << "\t";
if(i==1) cout << "\t等级为:" << grade;//显示等级
if(i==3) cout << "\t自动前进时间";
if(i==4) cout << "\t间隔为:" << gamespeed << "ms";//显示时间
if(i==6) cout << "\t历史最高分为:" << score << "分";
if(i==7) cout << "\t你现在得分为:" << (length+(grade-1)8)10 << "分";
if(i==8) cout << "\t";
if(i==9) cout << "\t游戏说明:";
if(i==10) cout << "\t(1)用小键盘方向键控制";
if(i==11) cout << "\t蛇头运动方向;";
if(i==12) cout << "\t(2)蛇每吃一个果子蛇身";
if(i==13) cout << "\t增加一节;";
if(i==14) cout << "\t(3)蛇咬到自己或碰到墙";
if(i==15) cout << "\t壁游戏结束。";
if(i==18) cout << "\t";
if(i==19) cout << "\tC/C++语言作业:";
if(i==20) cout << "\tzjlj,20150316 ";
}
}
int main(int argc, char argv[]){
int tcsQipan[22][22]; // 贪吃蛇棋盘是一个二维数组(如2222,包括墙壁)
int i,j,score,directiontemp;
FILE fpini;//fpini 信息文件
readini(&fpini, &score, argv);//读取ini文件的最高纪录
if (score<0)//最高成绩小于零设置为零,初建文件会是负数
score=0;
while(1)
{
for(i=1;i<=20;i++)
for(j=1;j<=20;j++)
tcsQipan[i][j]=0; //贪吃蛇棋盘相应坐标标上中间空白部分的标志0
for(i=0;i<=21;i++)
tcsQipan[0][i] = tcsQipan[21][i] = 1; //贪吃蛇棋盘相应坐标标上上下墙壁的标志1
for(i=1;i<=20;i++)
tcsQipan[i][0] = tcsQipan[i][21] = 2; //贪吃蛇棋盘相应坐标标上左右墙壁的标志2
int tcsZuobiao[2][500]; //蛇的坐标数组
for(i=0; i<4; i++)
{
tcsZuobiao[0][i] = 1;//蛇身和蛇头的x坐标
tcsZuobiao[1][i] = i + 1;//蛇身和蛇头的y坐标
}
int head = 3,tail = 0;//标示蛇头和蛇尾的数组偏移量
for(i=1;i<=3;i++)
tcsQipan[1][i]=4; //蛇身
tcsQipan[1][4]=3; //蛇头
int x1, y1; // 随机出果子
srand(time(0));//设置随机种子
do
{
x1=rand()%20+1;
y1=rand()%20+1;
}
while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
color(12);
cout<<"\n\n\t\t\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始
long start,starttemp;
int grade = 1, length = 4; //设置初始等级和蛇的初始长度
int gamespeed = 500; //设置初始前进时间间隔
for(i=3;i>=0;i--)
{
start=clock();
while(clock()-start<=1000);
system("cls");
if(i>0)
cout << "\n\n\t\t\t\t进入倒计时:" << i << endl; //倒计时显示
else
Refresh(tcsQipan,grade,gamespeed,length,score); //初始棋盘显示
}
int timeover=1,otherkey=1;//初始化超时时间和按键判断参数
char direction = 77; // 设置初始情况下,向右运动
int x=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇头坐标到x,y变量
while(1)//运行一局游戏
{
start = clock();
while((timeover=((starttemp=clock())-start<=gamespeed))&&!kbhit());//如果有键按下或时间超过自动前进时间间隔则终止循环
if(direction==72||direction==80||direction==75 ||direction==77)
directiontemp=direction;//保留上一次方向按键
//starttemp=gamespeed+start-starttemp;//保留停留时间
if(timeover)
{
#if (DEBUG==1)
direction = getch();//调试代码
#else
if((direction =getch())==-32)
direction = getch();
#endif
}
#if (DEBUG==1)//调试代码
start=clock();
while(clock()-start<=2000);
gotoxy(24,4);
cout << "\t按键ASCII代码"<<(int)direction<<" "<<endl;
#endif
if(!(direction==72||direction==80||direction==75 ||direction==77))
{
otherkey=0;// 按键非方向键,otherkey设置为0
}
else
{
otherkey=1;// 按键为方向键,otherkey设置为1
}
if(direction==72 && directiontemp==80)//忽略反方向按键
{
direction=32;
otherkey=0;
//start = clock();
//while(clock()-start<=starttemp);
}
else if(direction==80 && directiontemp==72)
{
direction=32;//设置按键为非方向键
otherkey=0;// 按键为非方向键,otherkey设置为0
// start = clock();
//while(clock()-start<=starttemp);//补偿等待时间
}
else if(direction==75 && directiontemp==77)
{
direction=32;
otherkey=0;
//start = clock();
//while(clock()-start<=starttemp);
}
else if(direction==77 && directiontemp==75)
{
direction=32;
otherkey=0;
//start = clock();
//while(clock()-start<=starttemp);
}
switch(direction)//判断方向键
{
case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break; // 向上
case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break; // 向下
case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break; // 向左
case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;break; // 向右
default: break;
}
if(x==0 || x==21 ||y==0 || y==21) // 蛇头碰到墙壁,结束本局游戏
{
gotoxy(22,12);
cout << "\t游戏已结束!" << endl;
if(score>=(length+(grade-1)8)10)//判断是否破记录
{
gotoxy(10,7);
color(12);
cout << "闯关失败 加油耶!" << endl;
fclose(fpini);//关闭ini文件
}
else
{
gotoxy(10,7);
color(12);
cout << "恭喜您打破记录" << endl;
score=(length+(grade-1)8)10;
writeini(&fpini, &score, argv);//写入ini文件的最高纪录
}
gotoxy(23,12);
cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示
break;//退出该局游戏
}
if(tcsQipan[x][y]!=0&&!(x==x1&&y==y1)&&tcsQipan[x][y]!=3) // 蛇头碰到蛇身,结束本局游戏
{
gotoxy(22,12);
cout << "\t游戏已结束!" << endl;
if(score>=(length+(grade-1)8)10)//判断是否破记录
{
gotoxy(10,7);
color(12);
cout << "闯关失败 加油耶!" << endl;
fclose(fpini);//关闭ini文件
}
else
{
gotoxy(10,7);
color(12);
cout << "恭喜您打破记录" << endl;
score=(length+(grade-1)8)10;
writeini(&fpini, &score, argv);//写入ini文件的最高纪录
}
gotoxy(23,12);
cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示
break;//退出该局游戏
}
/
游戏运行时的核心算法开始
/
if(x==x1 && y==y1) // 吃果子,长度加1
{
length ++;
if(length>=8)//长度大于等于8重新计算长度,等级加1
{
length -= 8;//重新计算长度
grade ++;//等级加1
if(gamespeed>50)//控制最快速度为50
gamespeed = 550 - grade 50; // 改变自动前进时间间隔
}
tcsQipan[x][y]= 3;//贪吃蛇棋盘相应坐标现在蛇头标志改为蛇头标志3
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = 4;//贪吃蛇棋盘相应坐标原来蛇头标志改为蛇身标志4
head = (head+1)%400;//防止数组越界
tcsZuobiao[0][head] = x;//蛇头的x坐标
tcsZuobiao[1][head] = y;//蛇头的y坐标
do//随机出果子
{
x1=rand()%20+1;
y1=rand()%20+1;
}
while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
gotoxy(22,12);
cout << "\t游戏进行中!" << endl;
Refresh(tcsQipan,grade,gamespeed,length,score);
}
else // 不吃果子
{
if(otherkey)
{
tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0;
tail=(tail+1)%400;//防止数组越界
tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;
head=(head+1)%400;//防止数组越界
tcsZuobiao[0][head]=x;//蛇头的x坐标
tcsZuobiao[1][head]=y;//蛇头的y坐标
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3;
gotoxy(22,12);
cout << "\t游戏进行中!" << endl;
Refresh(tcsQipan,grade,gamespeed,length,score);
}
else
{
gotoxy(22,12);
cout << "\t游戏暂停中!" << endl;
}
}
/
游戏运行时的核心算法结束
/
}
while(1)
{
while(!kbhit());
if((direction =getch())==13)//按回车键开始下一局
break;
if(direction ==27)//按ESC退出游戏
exit(0);
}
system("cls");//清除屏幕重新开始
}
return 0;
}
你好,很荣幸回答你的问题,我这里是一个c的贪吃蛇源代码,希望对你有帮助,不过运行这个时需要你的软件包含惊蛰EasyX图形函数,比如vc++60,如遇到问题问题可以联系我,希望对你有帮助。
#include <graphicsh>
#include <stdlibh>
#include <conioh>
#include <timeh>
#include <stdioh>
#define LEFT 'a'
#define RIGHT 'd'
#define DOWN 's'
#define UP 'w'
#define ESC 27
#define N 200 /蛇的最大长度/
int i;
char key;
int score=0; /得分/
int gamespeed=100; /游戏速度自己调整/
struct Food
{
int x; /食物的横坐标/
int y; /食物的纵坐标/
int yes; /判断是否要出现食物的变量/
}food; /食物的结构体/
struct Snake
{
int x[N];
int y[N];
int node; /蛇的节数/
int direction; /蛇移动方向/
int life; / 蛇的生命,0活着,1死亡/
}snake;
void Init(void); /图形驱动/
void Close(void); /图形结束/
void DrawK(void); /开始画面/
void GameOver(void); /结束游戏/
void GamePlay(void); /玩游戏具体过程/
void PrScore(void); /输出成绩/
/主函数/
void main(void)
{
Init(); /图形驱动/
DrawK(); /开始画面/
GamePlay(); /玩游戏具体过程/
Close(); /图形结束/
}
/图形驱动/
void Init(void)
{
int gd=9,gm=2;
initgraph(&gd,&gm," ");
cleardevice();
}
/开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙/
void DrawK(void)
{
/setbkcolor(LIGHTGREEN);/
setcolor(LIGHTCYAN);
setlinestyle(PS_SOLID,0,1); /设置线型/
for(i=50;i<=600;i+=10) /画围墙/
{
rectangle(i,40,i+10,49); /上边/
rectangle(i,451,i+10,460); /下边/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /左边/
rectangle(601,i,610,i+10); /右边/
}
}
/玩游戏具体过程/
void GamePlay(void)
{
srand(time(NULL)); /随机数发生器/
foodyes=1; /1表示需要出现新食物,0表/
snakelife=0; /活着/
snakedirection=1; /方向往右/
snakex[0]=100;snakey[0]=100; /蛇头/
snakex[1]=110;snakey[1]=100;
snakenode=2; /节数/
PrScore(); /输出得分/
while(1) /可以重复玩游戏,压ESC键/
{
while(!kbhit()) /在没有按键的情况下,蛇自/
{
if(foodyes==1) /需要出现新食物/
{
foodx=rand()%400+60;
foody=rand()%350+60;
while(foodx%10!=0) /食物随机出现后必须让食物/
foodx++;
while(foody%10!=0)
foody++;
foodyes=0; /画面上有食物了/
}
if(foodyes==0) /画面上有食物了就要显示/
{
setcolor(GREEN);
rectangle(foodx,foody,foodx+10,foody-10);
}
for(i=snakenode-1;i>0;i--) /蛇的每个环节往前移动,也法/
{
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
/1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头/
switch(snakedirection)
{
case 1: snakex[0]+=10;break;
case 2: snakex[0]-=10;break;
case 3: snakey[0]-=10;break;
case 4: snakey[0]+=10;break;
}
/从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可/
for(i=3;i<snakenode;i++)
{
if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])
{
GameOver(); /显示失败/
snakelife=1;
break;
}
}
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||snakey[0]>455) /蛇是否撞到墙壁/
{ GameOver(); /本次游戏结束/
snakelife=1; /蛇死/
}
if(snakelife==1) /以上两种判断以后,如果蛇/
break;
if(snakex[0]==foodx&&snakey[0]==foody)/吃到食物以后/
{
setcolor(BLACK); /把画面上的食物东西去/
rectangle(foodx,foody,foodx+10,foody-10);
snakex[snakenode]=-20;snakey[snakenode]=-20;
/新的一节先放在看不见的位置,下次循环就取前一节的位置/
snakenode++; /蛇的身体长一节/
foodyes=1; /画面上需要出现新的食物/
score+=10;
PrScore(); /输出新得分/
}
setcolor(RED); /画出蛇/
for(i=0;i<snakenode;i++)
rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]-10);
Sleep(gamespeed);
setcolor(BLACK); /用黑色去除蛇的的最后/
rectangle(snakex[snakenode-1],snakey[snakenode-1],
snakex[snakenode-1]+10,snakey[snakenode-1]-10);
} /endwhile(!kbhit)/
if(snakelife==1) /如果蛇死就跳出循环/
break;
key=getch(); /接收按键/
if (key == ESC) break; /按ESC键退出/
switch(key)
{
case UP:
if(snakedirection!=4) /判断是否往相反的方向移动/
snakedirection=3;
break;
case RIGHT:
if(snakedirection!=2)
snakedirection=1;
break;
case LEFT:
if(snakedirection!=1)
snakedirection=2;
break;
case DOWN:
if(snakedirection!=3)
snakedirection=4;
break;
}
}/endwhile(1)/
}
/游戏结束/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
setfont(56,0,"黑体");
outtextxy(200,200,"GAME OVER");
getch();
}
/输出成绩/
void PrScore(void)
{
char str[10];
setfillstyle(YELLOW);
bar(50,15,220,35);
setcolor(BROWN);
setfont(16,0,"宋体");
sprintf(str,"score:%d",score);
outtextxy(55,16,str);
}
/图形结束/
void Close(void)
{
closegraph();
}
#include <graphicsh> / 图形函数/
#include <stdlibh> /随机产生数/
#include <dosh> /播放音乐/
#include<stdioh> /输入 输出/
#include<biosh> /接受按键/
#include<timeh> /随机产生数/
#include<conioh> /提供屏幕窗口操作/
#define N 200
#define N1 64 /定义音长 全音符的音长/
#define N2 32 /半音符的音长/
#define N4 16 /4分音符的音长/
#define N8 8 /8分衣服的音长/
#define N16 4 /16分音符的音长/
#define END 0 /结束标志/
#define LEFT 0X4b00
#define RIGHT 0X4d00
#define DOWN 0X5000
#define UP 0X4800
#define Esc 0X011b
enum NOTES
{
C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,
C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,
C1=523,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,
C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1976
}; /定义音符与频率的对应关系/
song[]={C0,N8,D0,N8,E0,N8,F0,N8,G0,N8,A0,N8,B0,N8,
C1,N8,D1,N8,E1,N8,F1,N8,G1,N8,A1,N8,B1,N8,END,END}; /形成乐谱/
int i,key;
int score=0; /得分/
long int gamespeed=100000,k=0; /游戏速度/
struct Food
{
int x; /食物的横坐标/
int y; /食物的纵坐标/
int yes; /判断是否要出现食物/
}food; /食物的结构体/
struct Snake
{
int x[N];
int y[N];
int node; /蛇的节数/
int direction; /蛇的移动方向/
int life; /蛇的生命,0活着,1死亡/
}snake;
void GameBegin(void); /初始界面/
void Init(void); /图形驱动/
void Close (void); /图形结束/
void Drawk (void); /开始画面/
void GameOver (void); /结束游戏/
void GamePlay (void); /游戏的具体过程/
void PrScore (void); /输出成绩/
SONG(); /播放音乐/
/主函数/
main ()
{
GameBegin(); /初始界面,介绍游戏规则/
/图形驱动/
Drawk(); /开始界面/
GamePlay(); /游戏具体过程/
Close(); /图形结束/
}
void GameBegin(void)
{
int gdriver=VGA; /选择VGA显示器/
int gmode=VGAHI; /选择VGAHI工作模式/
unsigned char temp1="GAME RULES:"; /定义字符数组/
unsigned char temp2="1Change the key for the food!";
unsigned char temp3="2Do not touch the wall and itself!";
unsigned char temp4="3Press the 'Enter' to go into the game!";
initgraph(&gdriver,&gmode,""); /初始化显示适配器/
settextjustify(LEFT_TEXT,TOP_TEXT);
/在图形方式下设定一个以(LEFT,TOP)像素点为左上角的图形可视窗口/
cleardevice(); /清除整个屏幕/
setcolor(4); /设置字符颜色为红色/
setbkcolor(1); /设置屏幕背景为蓝色/
settextstyle(1,0,2); /设置输出字符的字型、输出方向、字符大小/
outtextxy(100,150,temp1); /输出字符串到可视窗口的指定位置/
outtextxy(100,200,temp2);
outtextxy(100,250,temp3);
outtextxy(100,300,temp4);
getch(); /输入字符/
cleardevice(); /清除整个屏幕/
setbkcolor(0);
}
SONG()
{
int note=0,fre,dur,control;
clock_t goal;
while(song[note]!=0)
{
fre=song[note]; /取出乐谱数组中的频率/
dur=song[note+1]; /取出乐谱数组中的音长/
if(kbhit())
break; /如果有按键,则退出音乐播放/
if(fre)
{
outportb(0x43,0xb6); /初始化扬声器端口/
fre=(unsigned)(1193180L/fre);
outportb(0x42,(char)(fre>>8)); /往扬声器端口送出声音频率值/
outportb(0x42,(char)(fre>>8));
control=inportb(0x61);
outportb(0x61,(control)|0x3); /开始发音/
}
goal=(clock_t)dur+clock(); /设定延迟时间/
while(goal>clock()); /如果时间未到,等待;时间超时则退出/
if(fre)
outportb(0x61,control); /停止发音/
goal=(clock_t)0;
note=note+2; /移到下一个音符/
}
}
/开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙/
void Drawk(void)
{
setcolor(11); /设置为青色/
setlinestyle(SOLID_LINE,0,THICK_WIDTH); /设置线型和线宽/
for(i=50;i<=600;i+=10) /画围墙/
{
rectangle (i,40,i+10,47); /上边/
rectangle (i,453,i+10,460); /下边/
}
for (i=40;i<=450;i+=10)
{
rectangle(50,i,57,i+10); /左边/
rectangle(603,i,610,i+10); /右边/
}
}
void GamePlay(void)
{
randomize(); /随机数发生器/
foodyes=1; /1表示需要出现新食物,0表示已经存在食物/
snakelife=0; /活着/
snakedirection=1; /方向向右/
snakex[0]=100;snakey[0]=100; /蛇头/
snakex[1]=110;snakey[1]=100;
snakenode=2; /节数/
PrScore(); /输出得分/
while(1) /按ESC键结束,否则重复玩游戏/
{
while(!kbhit()) /没按键的情况下蛇自己移动身体/
{
if(foodyes==1) /如需要出现新食物/
{
foodx=rand()%400+60;
foody=rand()%350+60;
while(foodx%10!=0) /让食物在整格内/
foodx++;
while(foody%10!=0)
foody++;
foodyes=0; /已有食物/
}
if(foodyes==0) /有食物后就显示/
{
setcolor(GREEN);
rectangle(foodx,foody,foodx+10,foody-10);
}
for(i=snakenode-1;i>0;i--) /蛇的每个环节往前移动/
{
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
/1、2、3、4表示右、左、上、下/
switch(snakedirection)
{
case 1:snakex[0]+=10;break;
case 2:snakex[0]-=10;break;
case 3:snakey[0]-=10;break;
case 4:snakey[0]+=10;break;
}
for(i=3;i<snakenode;i++) /从蛇的第四节开始判断是否撞到自己了/
{
if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])
{
GameOver(); /显示失败/
snakelife=1;
break;
}
}
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||snakey[0]>455) /是否撞到墙壁/
{
GameOver(); /显示失败/
snakelife=1;
}
if(snakelife==1)
break;
if(snakex[0]==foodx&&snakey[0]==foody) /吃到食物后/
{
snakex[snakenode]=-20;
snakey[snakenode]=-20; /新的一节先放在看不见的位置,下次循环取前一节的位置/
snakenode++; /蛇的身体长一节/
foodyes=1; /画面上需要出现新的食物/
score+=10;
PrScore(); /输出新的得分/
k+=1000;
}
setcolor(4); /画出蛇/
for(i=0;i<snakenode;i++)
rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]-10);
delay(gamespeed-k);
setcolor(0); /用黑色去除蛇的最后一节/
rectangle(snakex[snakenode-1],snakey[snakenode-1],
snakex[snakenode-1]+10,snakey[snakenode-1]-10);
} /endwhile (!kbhit)/
if(snakelife==1) /如果蛇死就跳出循环/
break;
key=bioskey(0); /接收按键/
if(key==Esc) /如是ESC键就退出/
break;
else if(key==UP && snakedirection!=4) /判断是否往相反的方向移动/
snakedirection=3;
else if(key==RIGHT &&snakedirection!=2)
snakedirection=1;
else if(key==LEFT && snakedirection!=1)
snakedirection=2;
else if(key==DOWN && snakedirection!=3)
snakedirection=4;
} /endwhile(1)/
}
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
SONG();
}
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35); /覆盖原来的值/
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/图形结束/
void Close(void)
{
getch();
closegraph();
}
应该没问题
我的课程设计就是这份,答辩
欢迎分享,转载请注明来源:浪漫分享网
评论列表(0条)