/**************************************************************************************************
由于本计算机的处理器频率有问题,导致delay()函数中单位不是毫秒,delay(555555=近似为100MS左右,
故程序中定义了delay_1(int n)来解决该问题,不过由于本人技术有限,只能这样在本机解决该问题,
若进行程序移植,需要将delay_1()函数中的延时进行修改
***************************************************************************************************/
/**************************************************************************************************
双人蛇设计小组,组长 徐凯文 组员 刘冰 倪雪冰 董承汉 *
E-mail 136766638@qq.com *
北华大学 12级网络工程 *
2012年12月25日 *
参考传播请注明出处^_^ *
**************************************************************************************************/
#include "Conio.h"
#include "graphics.h"
#include"word.h"
#include"bios.h"
#include"stdlib.h"
#include<time.h>
#include<string.h>
#define closegr closegraph
/*预处理中word.h库是自建库,内存放WIN-TC汉子点阵和一些键盘扫描码*/
int zhangai[70][50]; /*定义全局变量障碍数组*/
struct snake /*蛇节的结构体*/
{
struct snake *L; /*该蛇节的前一节的地址*/
int x; /*该节的x坐标*/
int y; /*该节的y坐标*/
struct snake *R; /*该蛇节的后一节的地址*/
};
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
void drawmat(char *mat,int matsize,int x,int y,int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
{
int i, j, k, n;
n = (matsize - 1) / 8 + 1;
for(j = 0; j < matsize; j++)
for(i = 0; i < n; i++)
for(k = 0;k < 8; k++)
if(mat[j * n + i] & (0x80 >> k)) /*测试为1的位则显示*/
putpixel(x + i * 8 + k, y + j, color);
}
void delay_1(int n) /*全局延时函数*/
{
while(n--) /*n-- 使得n=1时循环一次*/
{
delay(555555); /*本计算机该延时近似100MS*/
}
}
void zimu() /*字幕函数用来在欢迎页面输出汉字*/
{
drawmat(tan64H,64,220,140,RED);
drawmat(chi64H,64,280,140,BLUE);
drawmat(she64H,64,340,140,GREEN);
drawmat(zu32H,32,320,200,WHITE);
drawmat(zhang32H,32,350,200,WHITE);
drawmat(xu32H,32,380,200,WHITE);
drawmat(kai32H,32,410,200,WHITE);
drawmat(wen32H,32,440,200,WHITE);
drawmat(zu32H,32,320,240,WHITE);
drawmat(yuan32H,32,350,240,WHITE);
drawmat(dong32H,32,380,240,WHITE);
drawmat(cheng32H,32,410,240,WHITE);
drawmat(han32H,32,440,240,WHITE);
drawmat(liu32H,32,380,280,WHITE);
drawmat(bing32H,32,410,280,WHITE);
drawmat(ni32H,32,380,320,WHITE);
drawmat(xue32H,32,410,320,WHITE);
drawmat(bing32H,32,440,320,WHITE);
}
void ready() /*在屏幕中黑底白字显示 进入游戏前准备阶段*/
{
settextstyle(0,0,3); /*设置输出字的大小为32点阵*/
setcolor(BLACK);cleardevice();setcolor(WHITE); /*设置背景色为黑色并清屏,再设置颜色为白色*/
outtextxy(getmaxx()/2,getmaxy()/2,"ARE"); /*在屏幕中间输出ARE,其中函数分别为取屏幕最大横坐标和纵坐标*/
sleep(1); /*计算机挂起1S*/
setcolor(BLACK);cleardevice();setcolor(WHITE); /*设置背景色为黑色并清屏,再设置颜色为白色*/
outtextxy(getmaxx()/2,getmaxy()/2,"YOU"); /*在屏幕中间输出YOU,其中函数分别为取屏幕最大横坐标和纵坐标*/
sleep(1); /*计算机挂起1S*/
setcolor(BLACK);cleardevice();setcolor(WHITE); /*设置背景色为黑色并清屏,再设置颜色为白色*/
outtextxy(getmaxx()/2-10,getmaxy()/2,"Ready?"); /*在屏幕中间偏左 输出READY,其中函数分别为取屏幕最大横坐标和纵坐标*/
sleep(1); /*计算机挂起1S*/
setcolor(BLACK);cleardevice();setcolor(WHITE); /*设置背景色为黑色并清屏,再设置颜色为白色*/
outtextxy(getmaxx()/2,getmaxy()/2,"Go!!!"); /*在屏幕中间输出GO,其中函数分别为取屏幕最大横坐标和纵坐标*/
sleep(1); /*计算机挂起1S*/
}
int chose() /*选择游戏模式函数*/
{
int SW,KZ,v=0;
int s[]= /*声音数组 音乐为东方红*/
{392,392,440,294,262,262,220,294,392,392,440,532,440,392,262,262,220,294,392,294,262,247,220,196,392,294,330,294,262,262,220,294,330,294,262,294,262,247,220,196};
int time[]={4,2,2,8,4,2,2,8,4,4,2,2,2,2,4,2,2,8,4,4,4,2,2,4,4,4,2,2,4,2,2,2,2,2,2,2,2,2,2,12}; /*声音延时数组*/
setcolor(BLACK); /*设置颜色为黑色*/
cleardevice(); /*清屏*/
zimu(); /*打印字幕*/
setcolor(WHITE); /*设置颜色为白色*/
outtextxy(200,380,"1 player will play games"); /*在200,380为中心输出1 player will play games*/
outtextxy(200,410,"2 player will play games"); /*在200,410为中心输出2 player will play games*/
outtextxy(200,440," Press Esc to quit "); /*在200,440为中心输出 Press Esc to quit*/
setcolor(RED); /*设置背景色为红色*/
KZ=1;SW=1;setfillstyle(SOLID_FILL,RED); /*对KZ和SW进行初始化默认都为1,并将填充方式修改为红色满填充*/
bar(170,375,180,385); /*画矩形以表示选择块*/
while(KZ) /*控制循环*/
{
sound(s[v]); /*开启蜂鸣器播放数组中第V个元素声音*/
if(v==40){v=0;} /*当v=40返回0 以实现音乐循环*/
if(kbhit()) /*判断是否按键*/
{
switch(bioskey(0)) /*接收所按的键是什么*/
{
case UP:{SW=1;setfillstyle(SOLID_FILL,BLACK);bar(170,370,180,450);setfillstyle(SOLID_FILL,RED);bar(170,375,180,385);break;} /*如果为上箭头,则重新画选择标记在1玩家位置*/
case DOWN:{SW=2;setfillstyle(SOLID_FILL,BLACK);bar(170,370,180,450);setfillstyle(SOLID_FILL,RED);bar(170,410,180,420);break;} /*如果为下箭头,则重新画选择标记在2玩家位置*/
case ESC:{SW=3;setfillstyle(SOLID_FILL,BLACK);bar(170,370,180,460);setfillstyle(SOLID_FILL,RED);bar(170,440,180,450);break;} /*如果为ESC,则重新画选择标记在退出游戏选项位置*/
case CR:KZ=0;break; /*如果为回车,则将控制循环变量KZ值改为0*/
default :break;
}
}
delay_1(time[v]); /*根据延时数组对对应声音进行延时,以满足音调*/
v++; /*每次循环结束V值自加一*/
}
nosound(); /*关闭蜂鸣器*/
return SW; /*将选择结果返回调用函数*/
}
void donghua() /*开场跑蛇动画*/
{
int i,n,x1,y1,x2,y2,cy1,cy2,cx1,cx2,KZ,SW,vic;
char k;
initgr(); /* BGI初始化 */
setfillstyle(SOLID_FILL,RED); /*修改为红色满填充*/
sleep(1); /*计算机挂起1S*/
zimu(); /*调用字幕函数*/
for(n=1,x1=500,y1=0,x2=510,y2=10;n<=30;n++,y1+=13,y2+=13) /*沿负Y轴方向安一定时间间隔画30个红块*/
{ /*延时*/
delay(20000); /*画矩形*/
bar(x1,y1,x2,y2);
}
for(n=1,cy1=0,cy2=10;n<39;n++,cy1+=13,cy2+=13,y1+=13,y2+=13) /*沿Y轴负方向按相同时间间隔,继续画一些红块,同时从头画一些黑块*/
{
setfillstyle(SOLID_FILL,RED);