中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 改写了小C游戏,,欢迎各位老兄见笑一下..
作者:
标题: 改写了小C游戏,,欢迎各位老兄见笑一下.. 上一主题 | 下一主题
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『楼 主』:  改写了小C游戏,,欢迎各位老兄见笑一下..

我刚较大的改写完善了书上的一个小C游戏,原来的赛车只能向左或向右,不能前进和后退,而且过路车只有一辆卡车,只有一种颜色,很单调,我增加了赛车的前进和后退,又加了一辆小货车,并加了里程显示和选择游戏难度的菜单,还使过路车的色彩五彩缤纷, 并且,如果赛车从左右两侧撞上过路车,也能反映失败.相比之下,原来的撞车就很单一了,..
希望大家有时间玩一玩,,,如果美工好的,也可自己改成逼真的车型...
另,也准备好了能独立运行的可执行程序,双击就可玩的...
不过很遗憾只有PC SPEAKER ,还没有音乐..谁会的能不能补充进去?
打开附件
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <dos.h>
#include <bios.h>
#include <string.h>
#include <ctype.h>

#define BORDER 1
#define ESC 27
#define REV_VID 0x1e
#define NORM_VID 0x40

void light(void);
void chineseputs(int x, int y, char *p, int attrib);
void display_menu(char *menu[], int x, int y, int count);
void disp_box(int x1, int y1, int x2, int y2, int attrib);
int get_resp(int x, int y, int count, char *menu[], char *keys);
int popup(char *menu[], char *keys, int count, int x, int y, int border);
void goto_xy(int x, int y);
int coustomize();
main()
{
int gdriver,gmode,c,d,e,b,i,l,j,k,u,w,course,s,h,bcolor,scolor,pcolor,ccolor,time;
int *p[]={400,40,310,200,610,140};
int poly[14];
char speed;
char *main_menu[]={".h...(high)",".a...(average)",".l...(low)",".c...(coustomize)"};

c=1;d=0;u=0;
gdriver=DETECT;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver,&gmode,"";
setwritemode(XOR_PUT);
setfillstyle(HATCH_FILL,4);
drawpoly(4,p);
line(380,50,600,160);
setcolor(14);
setbkcolor(0);
settextstyle(GOTHIC_FONT,HORIZ_DIR,6);
outtextxy(350,70,"JUST START MY COURSE !!";
setcolor(5);
settextstyle(TRIPLEX_FONT,VERT_DIR,8);
outtextxy(550,120,"Our goal is just waiting for your hands !";
setcolor(8);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);
outtextxy(80,400,"Written by Dai ...";
getch();
closegraph();
speed=popup(main_menu, "halc", 4, 5, 16, BORDER);
if(speed==0) time=400;
if(speed==1) time=1000;
if(speed==2) time=1500;
if(speed==3) time=coustomize();
if(speed==5) exit (0);
    initgraph(&gdriver,&gmode,"";
    setwritemode(XOR_PUT);
    setcolor(YELLOW);
    outtextxy(250,350,"Are you ready?";
    while(kbhit()==0);  /* getch() will eat the previous ENTER so it is not used */
    cleardevice();
    light();
    setcolor(15);
    for(h=0;h<4;h++)
        line(150+h*100,0,150+h*100,472);
    for(h=0;h<3;h++)
    {
        setlinestyle(3,0,1);
        line(200+h*100,0,200+h*100,472);
        settextstyle(1,HORIZ_DIR,3);
    }
    settextstyle(1,HORIZ_DIR,4);
    setcolor(RED);
    outtextxy(40,40,"Just do it !";
    outtextxy(40,80,"Yeah !!";
    setcolor(10);
    setlinestyle(SOLID_LINE,0,3);
    rectangle(150,400,450,460);
    outtextxy(160,410,"Ready,Begin!";
setcolor(BLUE);
   rectangle(180+c*100,400,220+c*100,440);
   rectangle(170+c*100,390,230+c*100,400);
   rectangle(190+c*100,370,210+c*100,390);
   rectangle(170+c*100,440,230+c*100,450);
        setcolor(5);
        line(190+c*100,400,190+c*100,440);
        line(200+c*100,400,200+c*100,440);
        line(210+c*100,400,210+c*100,440);
        line(200+c*100,350,200+c*100,370);
        line(185+c*100,350,215+c*100,350);

    course=0;
    w=-50;
    loop:
    bcolor=rand()%15,scolor=rand()%15,pcolor=rand()%15,ccolor=rand()%15,i=rand()%3,l=rand()%3;
    if(w>=800) w=-50;
    for(j=-20;j<=90;j++,w++)
    {
       setcolor(bcolor+1);
       rectangle(170+i*100,j*10,230+i*100,60+j*10);
       rectangle(160+i*100,70+j*10,240+i*100,260+j*10);
            line(180+i*100,70+j*10,180+i*100,260+j*10);
            line(200+i*100,70+j*10,200+i*100,260+j*10);
            line(220+i*100,70+j*10,220+i*100,260+j*10);
    if(j>=20)
    {
    k=j-35;
       setcolor(scolor+1);
       rectangle(170+l*100,k*10,230+l*100,60+k*10);
        }
        setcolor(10);

        line(85,-5+u*15+w,85,55+u*15+w);
        line(95,-5+u*15+w,95,55+u*15+w);
        line(105,-5+u*15+w,105,55+u*15+w);
        line(115,-5+u*15+w,115,55+u*15+w);
        line(75,11+u*15+w,75,39+u*15+w);
        line(125,11+u*15+w,125,39+u*15+w);
        setcolor(pcolor+1);
        poly[0] = 530;
        poly[1] = u*15+j*30;
        poly[2] =515;
        poly[3] = 25+u*15+j*30;
        poly[4] =485;
        poly[5] =25+u*15+j*30 ;
        poly[6] =470;
        poly[7] =u*15+j*30 ;
        poly[8] =485;
        poly[9] =-25+u*15+j*30;
        poly[10] =515;
        poly[11] =-25+u*15+j*30 ;
        poly[12] = poly[0];
        poly[13] = poly[1];
        drawpoly(7,poly);


      delay(time);
       setcolor(bcolor+1);
       rectangle(170+i*100,j*10,230+i*100,60+j*10);
       rectangle(160+i*100,70+j*10,240+i*100,260+j*10);
            line(180+i*100,70+j*10,180+i*100,260+j*10);
            line(200+i*100,70+j*10,200+i*100,260+j*10);
            line(220+i*100,70+j*10,220+i*100,260+j*10);
      if(j>=20)
      {
       setcolor(scolor+1);
       rectangle(170+l*100,k*10,230+l*100,60+k*10);
      }
      setcolor(10);

        line(85,-5+u*15+w,85,55+u*15+w);
        line(95,-5+u*15+w,95,55+u*15+w);
        line(105,-5+u*15+w,105,55+u*15+w);
        line(115,-5+u*15+w,115,55+u*15+w);
        line(75,11+u*15+w,75,39+u*15+w);
        line(125,11+u*15+w,125,39+u*15+w);
      setcolor(pcolor+1);
        poly[0] = 530;
        poly[1] = u*15+j*30;
        poly[2] =515;
        poly[3] = 25+u*15+j*30;
        poly[4] =485;
        poly[5] =25+u*15+j*30 ;
        poly[6] =470;
        poly[7] =u*15+j*30 ;
        poly[8] =485;
        poly[9] =-25+u*15+j*30;
        poly[10] =515;
        poly[11] =-25+u*15+j*30 ;
        poly[12] = poly[0];
        poly[13] = poly[1];
        drawpoly(7,poly);

      sound(j*10);
      delay(50);
      nosound();
      course++;
      setcolor(ccolor+1);
      settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
      outtextxy(580,390,"10000";
      if(course>=1000) outtextxy(580,50,"1000";
      if(course>=1500) outtextxy(580,70,"1500";
      if(course>=2000) outtextxy(580,90,"2000";
      if(course>=2500) outtextxy(580,110,"2500";
      if(course>=3000) outtextxy(580,130,"3000";
      if(course>=3500) outtextxy(580,150,"3500";
      if(course>=4000) outtextxy(580,170,"4000";
      if(course>=4500) outtextxy(580,190,"4500";
      if(course>=5000) outtextxy(580,210,"5000";
      if(course>=5500) outtextxy(580,230,"5500";
      if(course>=6000) outtextxy(580,250,"6000";
      if(course>=6500) outtextxy(580,270,"6500";
      if(course>=7000) outtextxy(580,290,"7000";
      if(course>=7500) outtextxy(580,310,"7500";
      if(course>=8000) outtextxy(580,330,"8000";
      if(course>=8500) outtextxy(580,350,"8500";
      if(course>=9000) outtextxy(580,370,"9000";
      if(course>=10000) outtextxy(580,390,"10000";
if(course>=10000)
{
sound(800);
delay(1000);
nosound();
closegraph();
window(10,5,60,10);
textbackground(RED);
textcolor(YELLOW);
cprintf("\n\rYou are EXCELLENT !\n\r";
cprintf("                You have WON !\n\r";
cprintf("                      The mileage you have covered\n\ris:";
textcolor(BLUE);
cprintf("%d",course);
getch();
getch();
exit (0);
}
      if(bioskey(1)!=0)
      { b=bioskey(0);
setcolor(BLUE);
    rectangle(180+c*100,400-d*10,220+c*100,440-d*10);
    rectangle(170+c*100,390-d*10,230+c*100,400-d*10);
    rectangle(190+c*100,370-d*10,210+c*100,390-d*10);
    rectangle(170+c*100,440-d*10,230+c*100,450-d*10);
        setcolor(5);
         line(190+c*100,400-d*10,190+c*100,440-d*10);
         line(200+c*100,400-d*10,200+c*100,440-d*10);
         line(210+c*100,400-d*10,210+c*100,440-d*10);
         line(200+c*100,350-d*10,200+c*100,370-d*10);
         line(185+c*100,350-d*10,215+c*100,350-d*10);
    if((b==0x4b00)&&(c>0))
        c--;
    else if((b==0x4d00)&&(c<2))
        c++;
        else if(b==0x4800)
        d++;
        else if(b==0x5000)
        d--;
    setcolor(BLUE);
    setcolor(BLUE);
    rectangle(180+c*100,400-d*10,220+c*100,440-d*10);
    rectangle(170+c*100,390-d*10,230+c*100,400-d*10);
    rectangle(190+c*100,370-d*10,210+c*100,390-d*10);
    rectangle(170+c*100,440-d*10,230+c*100,450-d*10);
        setcolor(5);
         line(190+c*100,400-d*10,190+c*100,440-d*10);
         line(200+c*100,400-d*10,200+c*100,440-d*10);
         line(210+c*100,400-d*10,210+c*100,440-d*10);
         line(200+c*100,350-d*10,200+c*100,370-d*10);
         line(185+c*100,350-d*10,215+c*100,350-d*10);
}
/*if(course>=1)
{ */
if(((c==i)&&(j>=9-d&&j<=45-d))||((c==l)&&(k>=29-d&&k<=45-d)))

      {
      for(i=0;i<2000;i++)
      {
      sound(1500);
      delay(10);
      nosound();
      }
      closegraph();
      window(35,18,75,23);
      textbackground(WHITE);
      textcolor(DARKGRAY);
      cprintf("\n\r                You made a car ACCIDENT !\n\r";
      cprintf("       You have LOST !\n\r";
      cprintf("The mileage you have covered\n\ris:";
      textcolor(MAGENTA);
      cprintf("%d",course);
      goon:
      while(bioskey(1)==0);
      if(bioskey(0)==0x1c0d)   /*  or if((char)bioskey(0)==13) */
      /*getch();
      getch();*/
      exit (0);
      goto goon;
      }
/* if
  {
  cleardevice();
      outtextxy(200,100,"You made a car ACCIDENT !";
      outtextxy(280,120,"     You have LOST !";
      getch();
      closegraph();
      exit;
  }*/
/* }*/
}
goto loop;
}

void goto_xy(int x, int y)
{
union REGS regs;
regs.h.ah=2;
regs.h.dl=y;
regs.h.dh=x;
regs.h.bh=0;
int86(0x10, &regs, &regs);
}
void display_menu(char *menu[], int x, int y, int count)
{
register int i;
for(i=0;i<count;i++,x++)
{
goto_xy(x, y);
cprintf(menu);
}
}

void disp_box(int x1, int y1, int x2, int y2, int attrib)
{
unsigned char *boxchar[6]={"H","H","H","H","H","H"};
register int i;
for(i=x1;i<=x2;i++)
{
chineseputs(i, y1, boxchar[1],attrib);
chineseputs(i, y2, boxchar[1],attrib);
}
for(i=y1;i<=y2;i++)
{
chineseputs(x1, i, boxchar[3],attrib);
chineseputs(x2, i, boxchar[3],attrib);
}
chineseputs(x1, y1, boxchar[0],attrib);
chineseputs(x2, y1, boxchar[2],attrib);
chineseputs(x2, y2, boxchar[5],attrib);
chineseputs(x1, y2, boxchar[4],attrib);
}
void chineseputs(int x, int y, char *p, int attrib)
{
union REGS r;
while(*p)
{
r.h.ah=2;
r.h.dl=x++;
r.h.dh=y;
int86(0x10, &r, &r);
r.h.ah=9;
r.h.bh=0;
r.x.cx=1;
r.h.al=*p++;
r.h.bl=attrib;
int86(0x10, &r, &r);
}
}
int get_resp(int x, int y, int count, char *menu[], char *keys)
{
union inkey
{
char ch[2];
int i;
}c;
int arrow_choice=0, key_choice;
y++;
goto_xy(x, y);
chineseputs(y, x, menu[0], REV_VID);
for(;
{
while(!bioskey(1));
c.i=bioskey(0);
goto_xy(x+arrow_choice, y);
chineseputs(y, x+arrow_choice, menu[arrow_choice], NORM_VID);
if(c.ch[0])
{
key_choice=is_in(keys, tolower(c.ch[0]));
if(key_choice) return key_choice-1;
switch(c.ch[0])
{
case '\r': return arrow_choice;
case ' ': arrow_choice++;
break;
case ESC: return 5;
}
}
else
{
switch(c.ch[1])
{
case 72: arrow_choice--;
break;
case 80: arrow_choice++;
break;
}
}
if(arrow_choice==count) arrow_choice=0;
if(arrow_choice<0) arrow_choice=count-1;
goto_xy(x+arrow_choice, y);
chineseputs(y, x+arrow_choice, menu[arrow_choice], REV_VID);
}
}
int is_in(char *s, char c)
{
register int i;
for(i=0;*s;i++)
if(*s++==c) return i+1;
return 0;
}
int popup(char *menu[], char *keys, int count, int x, int y, int border)
{
register int i, len;
int endx, endy, choice;
unsigned *p;
if((x>24)||(x<0)||(y>79)||(y<0))
{
printf("range error";
return -2;
}
len=10;
for(i=0;i<count;i++)
if(strlen(menu)>len) len=strlen(menu);
endy=len+1+y;
endx=count+1+x;
if((endx+1>24)||(endy+1>79))
{
printf("menu dont'fit";
return -2;
}
/*p=(unsigned int*)malloc((endx-x+1) *(endy-y+1));
if(!p) exit(1);
save_video(x, endx+1, y, endy+1, p);*/
if(border) disp_box(y, x, endy, endx, YELLOW);
display_menu(menu, x+1, y+1, count);
choice=get_resp(x+1, y, count, menu, keys);
/*restore_video(x, endx+1, y, endy+2, (unsigned char *)p);
free (p);*/
return choice;
}

int coustomize()
{
int delaytime;
delaytime=0;
window(36,10,76,20);
textcolor(GREEN);
textbackground(BLUE);
clrscr();
cprintf("\n Please input the delaytime (in milli-\n\r second):\n\r The greater the delaytime is,the slower  the game is. It depends on your PC CPU   frequency as well as your own preferenc  es.The suggested num is:\n\n\r";
textcolor(RED);
cprintf("      ***  from 100 to 10000  ***\n\r";
textcolor(GREEN);
cprintf("     input here:";
cscanf("%d",&delaytime);
return delaytime;
}
void light(void)
{
    rectangle(535,65,565,155);
    /*floodfill(545,100,BLUE);*/
    setfillstyle(1,RED);
    fillellipse(550,80,10,10);
    sound(650);
    delay(300);
    nosound();
    delay(100);
    setfillstyle(1,YELLOW);
    fillellipse(550,110,10,10);
    sound(650);
    delay(300);
    nosound();
    delay(100);
    setfillstyle(1,GREEN);
    fillellipse(550,140,10,10);
    sound(650);
    delay(300);
    nosound();
    delay(100);
    setcolor(10);
    setlinestyle(SOLID_LINE,0,3);
    rectangle(150,400,450,460);
    outtextxy(160,410,"Ready,Begin!";
}


[此贴子已经被作者于2005-1-24 23:30:37编辑过]



[ Last edited by GOTOmsdos on 2005-10-22 at 00:35 ]

附件 1: zip_car.rar (2005-10-22 00:34, 292.94 K, 下载附件所需积分 1 点 ,下载次数: 72)
2005-1-15 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yyz985
初级用户




积分 194
发帖 35
注册 2005-1-10
来自 上海
状态 离线
『第 2 楼』:  





我的主页:http://yyz985.go.nease.net
QQ:249590012    yyz985@yahoo.com.cn
2005-1-15 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (249590012)  编辑帖子  回复  引用回复
bush
银牌会员




积分 2165
发帖 730
注册 2004-4-21
状态 离线
『第 3 楼』:  

代碼被ubb搞坏啦!

2005-1-21 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
crshen
中级用户




积分 447
发帖 126
注册 2004-2-10
状态 离线
『第 4 楼』:  

不错



从来不用别人的东西,要用,也先改成自己的再说!
2005-1-22 00:00
查看资料  发送邮件  发短消息 网志  OICQ (67154440)  编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 5 楼』:  

"代碼被ubb搞坏啦!" 什么意思?

2005-1-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bush
银牌会员




积分 2165
发帖 730
注册 2004-4-21
状态 离线
『第 6 楼』:  

void disp_box后都变成斜体了!

2005-1-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 7 楼』:  

是啊,我也不知道怎么回事? 不过,没关系的,如有兴趣的话,复制一下就行了,或者下载上传的文件就更方便了,...

2005-1-23 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bush
银牌会员




积分 2165
发帖 730
注册 2004-4-21
状态 离线
『第 8 楼』:  

复制肯定不行!因爲:代碼中的被當作UBB格式轉掉了。不信你自己檢查

2005-1-23 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 9 楼』:  

那就下载上传的文件吧...

2005-1-24 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
orientlin
新手上路





积分 8
发帖 2
注册 2005-8-26
状态 离线
『第 10 楼』:  我想要下载啊

我想要下载啊,怎么不让下啊?

2005-9-6 13:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 11 楼』:  

游戏已上传..
欢迎试玩..

2005-10-22 00:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kdlipm
初级用户





积分 31
发帖 16
注册 2005-12-4
状态 离线
『第 12 楼』:  

顶一下

2005-12-5 02:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
henrya2
中级用户





积分 486
发帖 171
注册 2006-2-12
状态 离线
『第 13 楼』:  


不错



Those who do not study the past are condemned to repeat it
2006-3-4 22:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: