游戏开发工具

C语言在屏幕的任意位置输出字符,开发小游戏的第一步

第一步:创建角色 

首先,我们打开我们的编程软件,可以 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; 
        } 
    } 
}

好了,大家接下来就可以运行一下看看效果了,我们现在可以按键盘上的上 下左右键来控制屏幕中笑脸的移动了。效果如下图所示:

1.jpg


第三步:显示地图  

接下来,让我们来开始制作地图。我们可以用一个二维数组把屏幕上每个“格 子”都对应起来,当对应屏幕上相应格子的二维数组的值为 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); 
}

现在让我们编译一下看看效果,大家应该能够看到地图上有许多“心”, 如下图。

1.jpg


第四步:判断吃“心”  

我们在 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();
    } 
}

 你可以通过各种办法把胜利画面做得更加漂亮,现在让我们运行一下。吃 完所有的“心”后,你应该能看到如下画面。 

1.jpg


第六步:美化  

接下来,就让我们把游戏做得更漂亮些。我们添加一个头文件 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); 
}

这样子,一个简单的游戏例子就完成了,运行后大家应该能够看到如下界面:

1.jpg