第一步:创建角色
首先,我们打开我们的编程软件,可以 tc20 或者 tc30 等,我这里就用 win-tc 作为演示。
我们新建一个文件,先将其保存,并命名为 game.c 然后然我们通过简单的编程来显示我们的主角,这里我们以一个笑脸字符来代表 主角。
#include <stdio.h>
main()
{
printf("%c",2);
getch();
}
大家看到,我们这里调用 stdio.h,这个头文件包含了很多输入输出的函数, 我们这里用到 printf 函数和 getch 函数都包含在 stdio.h 头文件中。只要调用 stdio.h 才能使用以上两个函数。
程序从 main()开始执行后有两个语句。
printf("%c",2);其中的 2 是显示 ASCII 码序号为 2 的那个字符,看起来就像一个 笑脸,其他的 ASCII 码大家可以从网上搜索到。
而对于 getch();我们可以当做是 等待按键输入的函数,如果没有按键输入,程序就被卡在 getch();的地方,这样 程序才不会很快就结束了。
第二步:控制角色
接下来,我们想方设法来让我们的主角可以根据我们的按键而动起来。当我 们按下键盘“上”的时候,主角就往上移动。其他方向亦是如此。 我们先来看看如何判断按键的输入呢, 在 bios.h 头文件中有一个 bioskey 函 数,可以判断我们的按键。我们可以通过如下的结构来判断按键:
while("")
{
当按键为上时发生什么事 当按键为下时发生什么事 当按键为左时发生什么事 当按键为右时发生什么事 }
其中的 while(""){„„}就是将{}里面的内容无限次地循环。同时我们可以通 过 switch 语句来判断玩家到底按了哪个按键。
再来说说两个会用到的函数,clrscr 函数是清屏函数,也就是把屏幕上的内 容清空。gotoxy(横坐标, 纵坐标)这个函数会把光标移动到我们指定的坐标,使 后面的输出在指定位置开始。
为了调用的方便,我们还添加一个函数 draw 专门来负责显示。
看看我们修改后的代码, 中间的内容是注释
#include <stdio.h>
#include <bios.h>
int x=10, y=10;
void draw(int x,int y)
{
clrscr();
gotoxy(x, y);
printf("%c",2);
}
void main()
{
draw(x,y);
while("")
{
switch(bioskey(0))
{
case 18432:
y-=1;
draw(x,y);
break;
case 20480:
y+=1;
draw(x,y);
break;
case 19200:
x-=1;
draw(x,y);
break;
case 19712:
x+=1;
draw(x,y);
break;
}
}
}
好了,大家接下来就可以运行一下看看效果了,我们现在可以按键盘上的上 下左右键来控制屏幕中笑脸的移动了。效果如下图所示:
第三步:显示地图
接下来,让我们来开始制作地图。我们可以用一个二维数组把屏幕上每个“格 子”都对应起来,当对应屏幕上相应格子的二维数组的值为 0 时,屏幕在那个位 置不显示任何内容,而当它的值为 1 的时候,屏幕上显示一个“心”。
现在就让我们来定义这个二维数组,我这里以总共有 15 行和 15 列来作为演 示,大家可以根据实际需要来增加。我们在 int x=10, y=10;的后面加上以下代 码:
int map[15][15]={
1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,};
这个数组总共有 15*15=225 个数,我在这里把花括号里面的数值分为 15 行, 每行 15 列是为了让我们编辑时的代码格式和我们将来屏幕上显示的一致。数值 中大部分的值是 0,而有小部分是 1,我们将在代码为 1 的地方(也就是屏幕上 对应的坐标)来显示一个“心”的符号。
我们先在 int x=10, y=10;后面定义两个变量,用来控制循环。代码如下: int i,j; 接下来我们来修改 draw 函数,让我们的地图被显示出来。修改后 draw 函 数的代码如下,其中中间的内容是注释。
void draw(int x,int y)
{
clrscr();
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
if(map[i][j]==1)
{
gotoxy(j+1, i+1);
printf("%c",3);
}
}
}
gotoxy(x, y);
printf("%c",2);
}
现在让我们编译一下看看效果,大家应该能够看到地图上有许多“心”, 如下图。
第四步:判断吃“心”
我们在 void main()前面来定义一个函数 tell(),这个函数的作用就是判断 角色是否“吃”到“心”了,如果吃到了,就让相应地“心”消失。代码如下:
void tell()
{
if(map[y-1][x-1]==1)
{
map[y-1][x-1]=0;
}
}
然后我们在 main()中来调用 tell(),修改后的相应代码如下:
switch(bioskey(0))
{
case 18432:
y-=1;
tell();
draw(x,y);
break;
case 20480:
y+=1;
tell();
draw(x,y);
break;
case 19200:
x-=1;
tell();
draw(x,y);
break;
case 19712:
x+=1; tell();
draw(x,y);
break;
}
我们就这样在主角坐标变化后进行判断。我们编译一下看看效果,你应该能 把地图上的“心”给吃掉了。
第五步:胜利判断
我们要在主角吃完所有的“心”后显示胜利信息,因此我们在 int i,j;后面 定义两个变量 n0 和 n,并让他们的初始值为 0。其中 n0 将用来计算游戏开始时 总共有多少个“心”,n 将用来计算已经有多少个“心”被主角吃掉了。代码如 下: int n0=0,n=0; 我们在 main()后面来计算 n0 的值,代码如下: main()
{
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(map[j][i]==1)
n0=n0+1;
这样我们就能对 map 中每个数进行列举并判断它的值是不是 1,如果是 1 则 让 n0 增加 1。这样子 n0 就能计算游戏开始时总共有多少个“心”了。 我们现在来修改 tell()让游戏能判断出我们是否已经胜利。修改如下:
void tell()
{
if(map[y-1][x-1]==1)
{
map[y-1][x-1]=0 ;n++;
}
if(n>=n0)
{
clrscr();
printf("win");
getch();
}
}
你可以通过各种办法把胜利画面做得更加漂亮,现在让我们运行一下。吃 完所有的“心”后,你应该能看到如下画面。
第六步:美化
接下来,就让我们把游戏做得更漂亮些。我们添加一个头文件 conio.h,很 多文字效果函数都在这个头文件里面。代码如下:
#include <conio.h>
我们先把背景颜色设置为白色,我们在 main 里面第一行添加:
textbackground(15);
textbackground 是改变背景颜色的函数,括号里面的参数分别代表的颜色如下:
0 黑色 1 蓝色 2 绿色 3 青色
4 红色 5 洋红 6 棕色 7 淡灰
8 深灰 9 深蓝 10 淡绿 11 淡青
12 淡红 13 淡洋红 14 黄色 15 白色
如果你现在运行游戏的话,可能发现主角和“心”不见了,这是因为主角和 “心”的颜色和背景的颜色相同。
我们接下来来修改 draw()让主角和心显示不同的颜色。其中 textcolor(参数)就是一个可以设置输出字符颜色的函数,括号 里的参数与 textbackground()里的参数是一样的。
同时为了能更好地显示带颜 色的字符,我们把 printf()换成一个更适用于显示带颜色字符的 cprintf()。修 改后的 draw()代码如下:
void draw(int x,int y)
{
clrscr();
textcolor(9);
for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
if(map[i][j]==1)
{
gotoxy(j+1, i+1);
cprintf("%c",3);
}
}
textcolor(2);
gotoxy(x, y);
cprintf("%c",2);
}
这样子,一个简单的游戏例子就完成了,运行后大家应该能够看到如下界面: