趣味程序导学C语言.docx

上传人:b****5 文档编号:7893938 上传时间:2023-01-27 格式:DOCX 页数:18 大小:62.38KB
下载 相关 举报
趣味程序导学C语言.docx_第1页
第1页 / 共18页
趣味程序导学C语言.docx_第2页
第2页 / 共18页
趣味程序导学C语言.docx_第3页
第3页 / 共18页
趣味程序导学C语言.docx_第4页
第4页 / 共18页
趣味程序导学C语言.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

趣味程序导学C语言.docx

《趣味程序导学C语言.docx》由会员分享,可在线阅读,更多相关《趣味程序导学C语言.docx(18页珍藏版)》请在冰豆网上搜索。

趣味程序导学C语言.docx

趣味程序导学C语言

趣味程序导学C语言

(请到附件里下载源代码与课件)

 

电脑游戏,一个熟悉而诱人的字眼,常常不经意地浮现在我们的脑海当中。

有梦幻神奇的《传奇》,有惊险刺激的《反恐精英》,有纯真童趣的《泡泡堂》,还有武林情仇,笑傲江湖的《剑侠情缘online》。

它是e时代常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化、世界观的全新传播方式。

作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢?

爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础学科。

一般来说,是比较枯燥的。

那么,我们能不能通过编一些小游戏来提高它的趣味性呢?

这样学习程序设计,就不会是一件艰苦、枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣。

这正是我这个讲座的目的。

1、 总是从Hello,world开始

学习编程的第一个程序,一般就是打印一个亲切的词语——“Hello,world!

”。

让我们来看看这个最简单的C程序:

#incolude/*把输入输出函数的头文件包含进来*/

intmain()

{

printf(“Hello,world!

”);/*在屏幕上输出字符串“Hello,world!

”*/

return0;/*退出main函数,并返回0*/

}

下面我们发现几个值得改进的地方,1、程序的运行结果一闪而过。

2、每执行这个程序一次都能看见上次运行留下的字符。

3、我们还希望屏幕输出一个笑脸来欢迎我们。

让我们来改进一下这个程序吧!

1、在return语句的前面加一句:

getch();,表示按任意键结束。

2、在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h。

3、ASCII码也有许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可以用printf(“%c”,2)来输出一个笑脸。

现在我们把Hello,world程序改成一个更好看的Hello,world了。

下面让我们开始做游戏吧!

2、 心动的开始,一个运动中的笑脸

大家小时侯喜欢看动画片吗?

哈哈,我猜你们都喜欢吧!

下面就让我们来做一个小动画吧。

在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来。

先在程序定义一个在屏幕中运动的点的结构:

structmove_point

{

intx,y;/*该点的位置,包括x坐标和y坐标*/

intxv,yv;/*该点在x轴、y轴的速度*/

};

运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体。

让我们看到以下代码:

gotoxy(man.x,man.y);/*把光标移到指定的坐标*/

printf(““);/*输出一个空格,把先前的字符擦去*/

然后我们让物体按其速度运动:

man.x+=man.xv;/*水平方向按x轴的速度运动*/

man.y+=man.yv;/*垂直方向按y轴的速度运动*/

运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让它下一刻的速度等于现在的速度的相反数。

最后打印出这个笑脸:

gotoxy(man.x,man.y);

printf(“%c\b”,2);/*输出ASCII码值为2的“笑脸”字符*/

怎么样?

是不是很有趣呢?

不过这个笑脸一直是自己运动,能不能让我们来控制它运动呢?

答案是肯定的,让我们继续往下学吧!

3、 交互的实现——让我们来控制笑脸运动

这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理。

接受按键我们用以下两条语句:

while(bioskey

(1)==0);/*等待按键*/

key=bioskey(0);/*把接收的按键的键盘码赋给变量key*/

然后用switch语句来判断按键以及执行相关操作,如下:

switch(key)/*对变量key的值进行判断*/

{

caseUP:

/*如果按的是向上键*/

…break;/*让物体向上运动,并退出switch*/

caseDOWN:

/*如果按的是向下键*/

…break;/*让物体向下运动,并退出switch*/

caseLEFT:

/*向左键*/

…break;;/*向左运动*/

caseRIGHT:

/*向右键*/

…break;/*向右运动*/

default:

break;/*其他按键则忽略处理*/

}

怎么样,是不是有了玩游戏的感觉了?

不过这个程序没有什么目的,也没有什么判断胜负的条件。

下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧!

4、 在迷宫中探索

小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢。

好的,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣。

首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中map[x][y]==‘#’表示在(x,y)坐标上的点是墙壁。

DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息。

在main函数里,我们定义了“小人”man的坐标和“目的地”des的坐标。

在游戏循环中,我们增加了一些用来判断胜负的语句:

if(man.x==des.x&&man.y==des.y)/*如果人的坐标等于目的地的坐标*/

{

gotoxy(35,3);

printf(“Ok!

Youwin!

”);/*输出胜利信息*/

….

}

在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不是有“墙壁”,如果有的话,就不能往前移动了。

好的,我们在判断按键的switch语句的各个分支加上了判断语句,如下:

if(map[…][…]==‘#’)break;/*如果前面是墙壁,就不执行下去*/

哇噻!

真棒,我们做出了一个完整的游戏了。

当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性。

不过,我们要设计一个更好玩的游戏——

5、 聪明的搬运工

大家一定玩过“搬运工”的游戏吧!

这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的“搬运工”吧!

程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,‘b’表示箱子,‘#’表示墙壁,‘*’表示目的地,‘i’表示箱子在目的地。

我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值。

游戏的主循环依然是接受按键。

当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:

如果前一格是空地或目的地,则人推箱子前进,否则不可移动。

好的,我们在switch中增加了这些判断语句。

程序还有一个重要的功能就是判断胜利。

数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了。

真棒啊!

我们可以做游戏了。

而且是一个老少皆宜,趣味十足的游戏呢!

当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢。

尾声:

C语言在计算机界中占有一个非常重要的地位,很多操作系统都是C语言开发的,比如大家耳熟能详的Unix、Windows、Linux等系统。

在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的。

C语言在与硬件联系紧密的编程中,也占有重要地位。

其实我觉得学习编程,可以通过一些小游戏、实用的例子来学习。

象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子。

而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了。

通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法。

好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏。

1、分形图案

  分形图是一种较为流行的艺术图形。

所谓分形,就是指组成部分与整体以某种方式相似,局部放大后可以在某种程度上再现整体,如图25所示,为一颗树的分形图,该树是由一些分支构成的,就其中某个分支来看,它具有与整颗树相似的形状。

绘制的原则是,先按某一方向画一条直线,然后在此线段上找到一系列节点,在每一个节点处向左、右偏转60度各画一条分支。

节点位置和节点处所画分支的长度比值按0.618分割。

/*分形图案1QW41.C*/

#defineg0.618

#definePAI3.14

#include

#include

#include

#include

floatthita=60.0;

voidgrow(intx,inty,floatlenth,floatfai);

voidmain()

{

  intgm,gd;

  detectgraph(&gd,&gm);

  initgraph(&gd,&gm,"\\tc\\bgi");

  grow(300,300,280.0,90.0);

  getch();

  closegraph();

}

voidgrow(intx,inty,floatlenth,floatfai)

{

  intx1,y1;

  intnx,ny,count;

  floatnlenth;

  x1=x+lenth*cos(fai*PAI/180.0);

  y1=y-lenth*sin(fai*PAI/180.0);

  line(x,y,x1,y1);

  if(lenth<10)return;

  nlenth=lenth;

  nx=x;

  ny=y;

  for(count=0;count<7;count++)

  {

     nx=nx+nlenth*(1-g)*cos(fai*PAI/180.0);

     ny=ny-nlenth*(1-g)*sin(fai*PAI/180.0);

     grow(nx,ny,nlenth*(1-g),fai+thita);

     grow(nx,ny,nlenth*(1-g),fai-thita);

     nlenth*=g;

  }

}

运行结果如下:

------------------------------------------------------------------------------------

2、分形图案2

  此例中也是一个分形图案。

给出的方法是:

先画一个大三角形,连接三角形的三条边的中点,得到四个较小的三角形,然后将外围的三个小三角形经过与大三角形相同的处理,得到一系列更小的三角形。

以此类推,将三角形不断地分割下去,直到最小的三角形的边长小于某个值时停止分割。

/*分形图案2QW42.C*/

#include

#include

voiddraw(intx1,inty1,intx2,inty2,intx3,inty3);

voidmain()

{

  intgm,gd;

  intx1=360,y1=100,x2=260,y2=273,x3=460,y3=273;

  detectgraph(&gd,&gm);

  initgraph(&gd,&gm,"\\tc\\bgi");

  line(x1,y1,x2,y2);

  line(x2,y2,x3,y3);

  line(x3,y3,x1,y1);

  draw(x1,y1,x2,y2,x3,y3);

  getch();

  closegraph();

}

voiddraw(intx1,inty1,intx2,inty2,intx3,inty3)

{

  intxm1,ym1,xm2,ym2,xm3,ym3,fx,fy;

  xm1=(x1+x2)/2;

  ym1=(y1+y2)/2;

  xm2=(x2+x3)/2;

  ym2=(y2+y3)/2;

  xm3=(x3+x1)/2;

  ym3=(y3+y1)/2;

  line(xm1,ym1,xm2,ym2);

  line(xm2,ym2,xm3,ym3);

  line(xm3,ym3,xm1,ym1);

  fx=xm1-xm2;

  fy=ym1-ym2;

  if((fx*fx+fy*fy)<150)return;

  draw(x1,y1,xm1,ym1,xm3,ym3);

  draw(xm1,ym1,x2,y2,xm2,ym2);

  draw(xm3,ym3,xm2,ym2,x3,y3);

}

程序运行结果如下:

------------------------------------------------------------------------

3、天空中运行的卫星

  动画显示中最基本和常用的技术是位图像操作,它可以把屏幕上一个矩形区域的图形复制到缓冲区中,也可以从缓冲区中将位块取出重现在屏幕上。

目标图像的擦除最简单的方法是采用XOR(异或方式,即将目标中的每个像素点和屏幕上相应的像素点作XOR运算,使目标变得可见,为了擦掉这一目标,只需简单地再将它与屏幕XOR一次,背景中被目标所遮盖的部分又可以还原成原来的状态。

  我们也可以利用AND和XOR运算,对被移动的目标事先作好两个特殊的掩模(mask),我们称为AND掩模和XOR掩模,这两个掩模的图形制作方式是不同的,AND掩模要求目标轮廓内位图像各点像素值为0,而XOR掩模应按目标的实际颜色去做,并将这两个掩模保存到缓冲区中去。

当一个目标在背景移动时,先将目标的AND掩模与屏幕相“与”,其结果在背景当前位置产生一个像素值为0的目标轮廓洞,然后再用目标的XOR掩模与AND掩模相异或,这两个掩模经混合后,目标以其正常的颜色出现在屏幕上。

这样通过采用目标位图的双掩模混合技术,当移动目标经过背景时,就不会出现目标颜色发生变化的情况。

  作为一个示例,程序运行后,在屏幕上出现繁星闪烁的星际空间,由经纬线组成的地球镶嵌在太空中,一颗卫星缓缓从屏幕中飞过,同时在屏幕上写出彩色大汉字“星际卫星运动轨迹”和“欢迎你使用该系统”,整个画面生动美观。

/*天空中运行的卫星Qw43.C*/

#include

#include

#include

#include

#include

#defineSTEP5

#defineDELAY150

#defineSIZE25

#defineYELLOW14

#defineRED4

void*xormask,*andmask,*covered;

voiddraw_earth();

voidget_mask(int,int,int,int);

voidputstar(void);

voidxshz();

intmain()

{

  intgmode=VGAHI,gdriver=VGA,midx,i,cx=1,cy;

  char*j1,*j2,*j3,*j4;

  initgraph(&gdriver,&gmode,"\\tc3\\bgi");

  cy=getmaxy()/2;

  covered=malloc(imagesize(cx,cy,cx+SIZE,cy+SIZE));

  xormask=malloc(imagesize(cx,cy,cx+SIZE,cy+SIZE));

  andmask=malloc(imagesize(cx,cy,cx+SIZE,cy+SIZE));

  getimage(cx,cy,cx+SIZE,cy+SIZE,covered);

  setfillstyle(SOLID_FILL,getmaxcolor());

  bar(cx,cy,cx+SIZE,cy+SIZE);

  get_mask(cx,cy+15,0,0);

  getimage(cx,cy,cx+SIZE,cy+SIZE,andmask);

  putimage(cx,cy,covered,COPY_PUT);

  get_mask(cx,cy+15,YELLOW,RED);

  getimage(cx,cy,cx+SIZE,cy+SIZE,xormask);

  putimage(cx,cy,xormask,XOR_PUT);

  draw_earth();

  putstar();

  j1="星际卫星运动轨迹";

  j2="欢迎您使用该系统";

  j3="地";

  j4="球";

  /*因为没有HZK24,所以下面一段显示汉字的程序没有调试*/

/*  xshz(j1,100,10,1,1,15,1,"k",10);

  xshz(j2,100,400,1,1,2,0,"s",10);

  xshz(j3,310,200,0,0,14,0,"s",1);

  xshz(j4,310,240,0,0,14,0,"s",1);

*/

  for(i=0;i<600;i+=STEP){

  putimage(cx+i,cy,covered,COPY_PUT);

  getimage(cx+STEP+i,cy,cx+SIZE+STEP+i,cy+SIZE,covered);

  putimage(cx+STEP+i,cy,andmask,AND_PUT);

  putimage(cx+STEP+i,cy,xormask,XOR_PUT);

  delay(DELAY);

  }

  getch();

  closegraph();

  return0;

}

voidget_mask(x,y,color1,color2)

{

  moveto(x+10,y);

  setcolor(color1);

  linerel(-3*3,2*4);

  moveto(x+10,y);

  linerel(-3*3,-2*4);

  moveto(x+25,y);

  linerel(-5*5,0);

  setfillstyle(1,color2);

  fillellipse(x+13,y,8,8);

}

voidputstar(void)

{

  intseed=1993;

  inti,dotx,doty,h,w,color,maxcolor;

  maxcolor=getmaxcolor();

  w=getmaxx();

  h=getmaxy();

  srand(seed);

  for(i=0;i<5000;++i)

  {

  dotx=1+random(w-1);

  doty=1+random(h-1);

  color=random(maxcolor);

  putpixel(dotx,doty,color);

  }

  srand(seed);

}

voiddraw_earth()

{

  intmidx,midy,i;

  midx=getmaxx()/2;

  midy=getmaxy()/2;

  setbkcolor(BLACK);

  setcolor(CYAN);

  for(i=0;i<=13;i++){

  ellipse(midx,midy,0,360,100,100-8*i);

  ellipse(midx,midy,0,360,100-8*i,100);

  }

  setcolor(RED);

  setlinestyle(SOLID_LINE,0,THICK_WIDTH);

  ellipse(midx,midy,130,50,160,30);

}

/*汉字显示函数*/

voidxshz(unsignedchar*hzc,intql,intqh,intlf,inthf,intqj,intbj,charzt[],intzj)

{

  FILE*fp;

  registerinti,j;

  unsignedcharqu,wei;

  intlo,k,qql,qqh;

  charzkn[]="d:

\\ucdos\\hzk24";

  charhzbp[72];

  if((fp=fopen(strcat(zkn,zt),"rb"))==NULL)

  {puts("filecannotopen!

\n");exit

(1);}

  qqh=qh;

  qql=ql;

  while(*hzc)    /*显示汉字串*/

  {

  qu=(*hzc-0xa1)&0x07f;

  wei=(*(++hzc)-0xa1)&0x07f;

  lo=(qu-15)*94+wei;

  hzc++;

  if(fseek(fp,lo*72L,SEEK_SET))

  {puts("fileseekerror!

\n");exit

(1);}

  if(fread(hzbp,1,72,fp)!

=72)

  {puts("filereaderror!

\n");exit

(1);}

  /*显示一个汉字*/

  for(i=0;i<24;i++)

  for(j=0;j<3;j++)

   for(k=0;k<8;k++)     /*显示一个字节*/

   {

     if((hzbp[i*3+j]>>(8-k))&1)

     setfillstyle(SOLID_FILL,qj);

     else

     setfillstyle(SOLID_FILL,bj);

     bar(qql,qqh,qql+lf,qqh+hf);

     qqh=qh+(j*8+k)*(hf+1);

     qql=ql+i*(lf+1);

   }

  ql=qql+zj;

  }

  fclose(fp);

}

 ——————————

4、腾飞的火箭

  腾飞的火箭也是一幅动画。

程序运行时首先在屏幕上出现大地和校园,然后一枚火箭冉冉升起,同时喷出红色的火焰。

/*腾飞的火箭QW44.C*/

#include

#include

#include

voidmain()

{

  inti,j,x=140,y;

  intdriver=DETECT;

  intmode=0;

  initgraph(&driver,&mode,"\\tc3\\bgi")

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1