C语言第一次课

/**************************************************************************************************************

**文件:Tetris.c

**编写者:huangminqiang

**编写日期:2010年12月8号

**简要描述:俄罗斯方块游戏

**修改者:

**修改日期:2012年12月12号 第3次修改

**注:后期功能有些不太完善,主要因为时间原因。VC6.0环境能正常的跑起来。

**************************************************************************************************************/

#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <time.h>

//游戏窗口

#define FrameX 4   //游戏窗口左上角的X轴坐标

#define FrameY 4   //游戏窗口左上角的Y轴坐标

#define Frame_height  20 //游戏窗口的高度

#define Frame_width   18 //游戏窗口的宽度

//定义全局变量

int i,j,temp,temp1,temp2; //temp,temp1,temp2用于记住和转换方块变量的值

int a[80][80]={0};   //标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案

int b[4];     //标记4个"口"方块:1表示有方块,0表示无方块

//声明俄罗斯方块的结构体

struct Tetris

{

int x;     //中心方块的x轴坐标

int y;     //中心方块的y轴坐标

int flag;    //标记方块类型的序号

int next;    //下一个俄罗斯方块类型的序号

int speed;    //俄罗斯方块移动的速度

int count;    //产生俄罗斯方块的个数

int score;    //游戏的分数

int level;    //游戏的等级

};

//函数原型声明

//光标移到指定位置

void gotoxy(HANDLE hOut, int x, int y);

//制作游戏窗口

void make_frame();

//随机产生方块类型的序号

void get_flag(struct Tetris *);

//制作俄罗斯方块

void make_tetris(struct Tetris *);

//打印俄罗斯方块

void print_tetris(HANDLE hOut,struct Tetris *);

//清除俄罗斯方块的痕迹

void clear_tetris(HANDLE hOut,struct Tetris *);

//判断是否能移动,返回值为1,能移动,否则,不动

int if_moveable(struct Tetris *);

//判断是否满行,并删除满行的俄罗斯方块

void del_full(HANDLE hOut,struct Tetris *);

//开始游戏

void start_game();

int  main()

{

//制作游戏窗口

make_frame();

//开始游戏

start_game();

}

/******光标移到指定位置**************************************************************/

void gotoxy(HANDLE hOut, int x, int y)

{

COORD pos;

pos.X = x;  //横坐标

pos.Y = y;  //纵坐标

SetConsoleCursorPosition(hOut, pos);

}

/******制作游戏窗口******************************************************************/

void make_frame()

{

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //定义显示器句柄变量

gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);   //打印游戏名称

printf("俄罗斯方块");

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);  //打印选择菜单

printf("**********下一个方块:");

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);

printf("**********");

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17);

printf("↑键:变体");

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);

printf("空格:暂停游戏");

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);

printf("Esc :退出游戏");

gotoxy(hOut,FrameX,FrameY);       //打印框角并记住该处已有图案

printf("╔");

gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);

printf("╗");

gotoxy(hOut,FrameX,FrameY+Frame_height);

printf("╚");

gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);

printf("╝");

a[FrameX][FrameY+Frame_height]=2;

a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2;

for(i=2;i<2*Frame_width-2;i+=2)

{

gotoxy(hOut,FrameX+i,FrameY);

printf("═");         //打印上横框

}

for(i=2;i<2*Frame_width-2;i+=2)

{

gotoxy(hOut,FrameX+i,FrameY+Frame_height);

printf("═");         //打印下横框

a[FrameX+i][FrameY+Frame_height]=2;    //记住下横框有图案

}

for(i=1;i<Frame_height;i++)

{

gotoxy(hOut,FrameX,FrameY+i);

printf("║");         //打印左竖框

a[FrameX][FrameY+i]=2;       //记住左竖框有图案

}

for(i=1;i<Frame_height;i++)

{

gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);

printf("║");         //打印右竖框

a[FrameX+2*Frame_width-2][FrameY+i]=2;   //记住右竖框有图案

}

}

/******制作俄罗斯方块********************************************************************/

void make_tetris(struct Tetris *tetris)

{

a[tetris->x][tetris->y]=b[0];    //中心方块位置的图形状态:1-有,0-无

switch(tetris->flag)      //共6大类,19种类型

{

case 1:         //田字方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 2:         //直线方块:----

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y]=b[2];

a[tetris->x+4][tetris->y]=b[3];

break;

}

case 3:         //直线方块: |

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y-2]=b[2];

a[tetris->x][tetris->y+1]=b[3];

break;

}

case 4:         //T字方块

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y]=b[2];

a[tetris->x][tetris->y+1]=b[3];

break;

}

case 5:         //T字顺时针转90度方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y]=b[3];

break;

}

case 6:         //T字顺时针转180度方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 7:         //T字顺时针转270度方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 8:         //Z字方块

{

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x+2][tetris->y+1]=b[3];

break;

}

case 9:         //Z字顺时针转90度方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x-2][tetris->y+1]=b[3];

break;

}

case 10:        //Z字顺时针转180度方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 11:        //Z字顺时针转270度方块

{

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 12:        //7字方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y-1]=b[3];

break;

}

case 13:        //7字顺时针转90度方块

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x-2][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 14:        //7字顺时针转180度方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y+1]=b[3];

break;

}

case 15:        //7字顺时针转270度方块

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 16:        //倒7字方块

{

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y-1]=b[3];

break;

}

case 17:        //倒7字顺指针转90度方块

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x-2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 18:        //倒7字顺时针转180度方块

{

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y+1]=b[3];

break;

}

case 19:        //倒7字顺时针转270度方块

{

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

}

}

//******判断是否可动*************************************************************************/

int if_moveable(struct Tetris *tetris)

{

if(a[tetris->x][tetris->y]!=0)//当中心方块位置上有图案时,返回值为0,即不可移动

{

return 0;

}

else

{

if( //当为田字方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动

( tetris->flag==1  && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

//或为直线方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动

( tetris->flag==2  && ( a[tetris->x-2][tetris->y]==0   &&

a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]==0 ) )   ||

( tetris->flag==3  && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]==0 ) )   ||

( tetris->flag==4  && ( a[tetris->x-2][tetris->y]==0   &&

a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]==0 ) )   ||

( tetris->flag==5  && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]==0 ) )   ||

( tetris->flag==6  && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]==0 ) )   ||

( tetris->flag==7  && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) )   ||

( tetris->flag==8  && ( a[tetris->x][tetris->y+1]==0   &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) ||

( tetris->flag==9  && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) ||

( tetris->flag==10 && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==11 && ( a[tetris->x][tetris->y+1]==0   &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==12 && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]==0 ) ) ||

( tetris->flag==13 && ( a[tetris->x-2][tetris->y]==0   &&

a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==14 && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) ||

( tetris->flag==15 && ( a[tetris->x-2][tetris->y]==0   &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==16 && ( a[tetris->x][tetris->y+1]==0   &&

a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]==0 ) ) ||

( tetris->flag==17 && ( a[tetris->x-2][tetris->y]==0   &&

a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ||

( tetris->flag==18 && ( a[tetris->x][tetris->y-1]==0   &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) ||

( tetris->flag==19 && ( a[tetris->x-2][tetris->y]==0   &&

a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) )

{

return 1;

}

}

return 0;

}

/******随机产生俄罗斯方块类型的序号**********************************************************/

void get_flag(struct Tetris *tetris)

{

tetris->count++;     //记住产生方块的个数

srand((unsigned)time(NULL));  //初始化随机数

if(tetris->count==1)

{

tetris->flag = rand()%19+1;  //记住第一个方块的序号

}

tetris->next = rand()%19+1;   //记住下一个方块的序号

}

/******打印俄罗斯方块**********************************************************************/

void print_tetris(HANDLE hOut,struct Tetris *tetris)

{

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

{

b[i]=1;         //数组b[4]的每个元素的值都为1

}

make_tetris(tetris);      //制作俄罗斯方块

for( i=tetris->x-2; i<=tetris->x+4; i+=2 )

{

for(j=tetris->y-2;j<=tetris->y+1;j++)

{

if( a[i][j]==1 && j>FrameY )

{

gotoxy(hOut,i,j);

printf("□");     //打印边框内的方块

}

}

}

//打印菜单信息

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);

printf("level : %d",tetris->level);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);

printf("score : %d",tetris->score);

gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);

printf("speed : %dms",tetris->speed);

}

/******清除俄罗斯方块的痕迹****************************************************************/

void clear_tetris(HANDLE hOut,struct Tetris *tetris)

{

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

{

b[i]=0;         //数组b[4]的每个元素的值都为0

}

make_tetris(tetris);      //制作俄罗斯方块

for( i=tetris->x-2; i<=tetris->x+4; i+=2 )

{

for(j=tetris->y-2;j<=tetris->y+1;j++)

{

if( a[i][j]==0 && j>FrameY )

{

gotoxy(hOut,i,j);

printf("  ");     //清除方块

}

}

}

}

/******判断是否满行并删除满行的俄罗斯方块****************************************************/

void del_full(HANDLE hOut,struct Tetris *tetris)

{       //当某行有Frame_width-2个方块时,则满行

int k,del_count=0;  //分别用于记录某行方块的个数和删除方块的行数的变量

for(j=FrameY+Frame_height-1;j>=FrameY+1;j--)

{

k=0;

for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2)

{

if(a[i][j]==1) //竖坐标依次从下往上,横坐标依次由左至右判断是否满行

{

k++;  //记录此行方块的个数

if(k==Frame_width-2)

{

for(k=FrameX+2;k<FrameX+2*Frame_width-2;k+=2)

{  //删除满行的方块

a[k][j]=0;

gotoxy(hOut,k,j);

printf("  ");

Sleep(1);

}

for(k=j-1;k>FrameY;k--)

{  //如果删除行以上的位置有方块,则先清除,再将方块下移一个位置

for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2)

{

if(a[i][k]==1)

{

a[i][k]=0;

gotoxy(hOut,i,k);

printf("  ");

a[i][k+1]=1;

gotoxy(hOut,i,k+1);

printf("□");

}

}

}

j++;   //方块下移后,重新判断删除行是否满行

del_count++; //记录删除方块的行数

}

}

}

}

tetris->score+=100*del_count; //每删除一行,得100分

if( del_count>0 && ( tetris->score%1000==0 || tetris->score/1000>tetris->level-1 ) )

{        //如果得1000分即累计删除10行,速度加快20ms并升一级

tetris->speed-=20;

tetris->level++;

}

}

/******开始游戏******************************************************************************/

void start_game()

{

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //定义显示器句柄变量

struct Tetris t,*tetris=&t;       //定义结构体的指针并指向结构体变量

unsigned char ch;         //定义接收键盘输入的变量

tetris->count=0;      //初始化俄罗斯方块数为0个

tetris->speed=300;      //初始移动速度为300ms

tetris->score=0;      //初始游戏的分数为0分

tetris->level=1;      //初始游戏为第1关

while(1)

{//循环产生方块,直至游戏结束

get_flag(tetris);     //得到产生俄罗斯方块类型的序号

temp=tetris->flag;     //记住当前俄罗斯方块序号

//打印下一个俄罗斯方块的图形(右边窗口)

tetris->x=FrameX+2*Frame_width+6;

tetris->y=FrameY+10;

tetris->flag = tetris->next;

print_tetris(hOut,tetris);

tetris->x=FrameX+Frame_width;  //初始中心方块x坐标

tetris->y=FrameY-1;     //初始中心方块y坐标

tetris->flag=temp;     //取出当前的俄罗斯方块序号

while(1)

{//控制方块方向,直至方块不再下移

label:print_tetris(hOut,tetris);//打印俄罗斯方块

Sleep(tetris->speed);   //延缓时间

clear_tetris(hOut,tetris);  //清除痕迹

temp1=tetris->x;    //记住中心方块横坐标的值

temp2=tetris->flag;    //记住当前俄罗斯方块序号

if(kbhit())

{        //判断是否有键盘输入,有则用ch↓接收

ch=getch();

if(ch==75)     //按←键则向左动,中心横坐标减2

{

tetris->x-=2;

}

if(ch==77)     //按→键则向右动,中心横坐标加2

{

tetris->x+=2;

}

if(ch==72)     //按↑键则变体即当前方块顺时针转90度

{

if( tetris->flag>=2 && tetris->flag<=3 )

{

tetris->flag++;

tetris->flag%=2;

tetris->flag+=2;

}

if( tetris->flag>=4 && tetris->flag<=7 )

{

tetris->flag++;

tetris->flag%=4;

tetris->flag+=4;

}

if( tetris->flag>=8 && tetris->flag<=11 )

{

tetris->flag++;

tetris->flag%=4;

tetris->flag+=8;

}

if( tetris->flag>=12 && tetris->flag<=15 )

{

tetris->flag++;

tetris->flag%=4;

tetris->flag+=12;

}

if( tetris->flag>=16 && tetris->flag<=19 )

{

tetris->flag++;

tetris->flag%=4;

tetris->flag+=16;

}

}

if(ch==32)     //按空格键,暂停

{

print_tetris(hOut,tetris);

while(1)

{

if(kbhit())   //再按空格键,继续游戏

{

ch=getch();

if(ch==32)

{

goto label;

}

}

}

}

if(if_moveable(tetris)==0) //如果不可动,上面操作无效

{

tetris->x=temp1;

tetris->flag=temp2;

}

else      //如果可动,执行操作

{

goto label;

}

}

tetris->y++;     //如果没有操作指令,方块向下移动

if(if_moveable(tetris)==0)  //如果向下移动且不可动,方块放在此处

{

tetris->y--;

print_tetris(hOut,tetris);

del_full(hOut,tetris);

break;

}

}

for(i=tetris->y-2;i<tetris->y+2;i++)

{//游戏结束条件:方块触到框顶位置

if(i==FrameY)

{

j=0;      //如果游戏结束,j=0

}

}

if(j==0)

{

system("cls");

getch();

break;

}

//清除下一个俄罗斯方块的图形(右边窗口)

tetris->flag = tetris->next;

tetris->x=FrameX+2*Frame_width+6;

tetris->y=FrameY+10;

clear_tetris(hOut,tetris);

}

}

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <time.h>

#define N 35

void print(int [][N]);//输出函数

void movebul(int [][N]);//子弹移动函数

void movepla(int [][N]);//敌机移动函数

void setting(void);//设置函数

void menu(void);//菜单函数

int scr[22][N]={0},pl=9,width=24,speed=3,density=30,score=0,death=0;//全局变量:界面、我机初始位、界面宽度、敌机速度、敌机密度、得分、死亡

main(void)

{

menu();

int i=0,j=0;

scr[21][pl]=1;

scr[0][5]=3;

while(1)

{

if(kbhit())

switch(getch())//控制左右移动和进入菜单

{

case ‘a‘:case ‘A‘:

if(pl>0)

scr[21][pl]=0,scr[21][--pl]=1;

break;

case ‘d‘:case ‘D‘:

if(pl<width-2)

scr[21][pl]=0,scr[21][++pl]=1;

break;

case ‘w‘:case ‘W‘:

scr[20][pl]=2;

break;

case 27 :

setting();

break;

}

if(++j%density==0)//控制生产敌机的速度

{

j=0;srand(time(NULL));

scr[0][rand()%width]=3;

}

if(++i%speed==0)//控制敌机移动速度,相对于子弹移动速度

movepla(scr);

movebul(scr);

print(scr);

if(i==30000)

i=0;//以免i 越界

}

}

void print(int a[][N])

{

system("cls");

int i,j;

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

{

a[i][width-1]=4;

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

{

if(a[i][j]==0)

printf(" ");

if(a[i][j]==1)

printf("\5");//输出我机的符号

if(a[i][j]==2)

printf(".");//子弹

if(a[i][j]==3)

printf("\3"); //输出敌机符号

if(a[i][j]==4)

printf("|");

if(i==0&&j==width-1)

printf("得分:%d",score);//右上角显示得分

if(i==1&&j==width-1)

printf("死亡:%d",death);

if(i==2&&j==width-1)

printf("设置:Esc");

if(i==3&&j==width-1)

printf("Copyright:王攀");

}

printf("\n");

}

}

void movebul(int a[][N])

{

int i,j;

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

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

{

if(i==0&&a[i][j]==2)

a[i][j]=0;

if(a[i][j]==2)

{

if(a[i-1][j]==3)

score+=10,printf("\7");

a[i][j]=0,a[i-1][j]=2;

}

}

}

void movepla(int a[][N])

{

int i,j;

for(i=21;i>=0;i--)//从最后一行往上是为了避免把敌机直接冲出数组。

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

{

if(i==21&&a[i][j]==3)

a[i][j]=0;//底行赋值0 以免越界。

if(a[i][j]==3)

a[i][j]=0,a[i+1][j]=3;

}

if(a[20][pl]==3&&a[21][pl]==1)

death++;

}

void setting(void)

{

int sw=0,i,j;

system("cls");

do{sw=0;printf("\n 游戏界面的大小:1.大2.小>> ");

switch(getche())

{

case ‘1‘:

width=34;

break;

case ‘2‘:

width=24;

break;

default:

printf("\n 错误,请重新选择...\n");

sw=1;

}

}

while(sw);

do

{

sw=0;

printf("\n 请选择敌机密度:1.大2.中3.小>> ");

switch(getche())

{

case ‘0‘:

density=10;

break;

case ‘1‘:

density=20;

break;

case ‘2‘:

density=30;

break;

case ‘3‘:

density=40;

break;

default:

printf("\n 错误,请重新选择...\n");

sw=1;

}

}while(sw);

do

{

sw=0;

printf("\n 敌机的飞行速度:1.快2.中3.慢>> ");

switch(getche())

{

case ‘1‘:

speed=2;

break;

case ‘2‘:

speed=3;

break;

case ‘3‘:

speed=4;

break;

default:

printf("\n 错误,请重新选择...\n");

sw=1;

}

}while(sw);

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

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

scr[i][j]=0;

scr[21][pl=9]=1;

printf("\n 按任意键保存...");

getch();

}

void menu(void)

{

printf("说明:按A D 控制我机左右飞行,W 发射子弹\n 设置:请按Esc\n 开始游戏:任意键\n                               by yan_xu");

if(getch()==27)

setting();

}

/*

该程序采用函数组成模块化结构;main函数中,首先调用menu()函数产生菜单,然后通过不停接收用户的按键,然后设置飞机和子弹移动;显示。

较为重要的是,一定要用if或是for限制住边界问题,以免碰撞或越界。

有一个比较重要的操作环节值得反复练习:

1.     图形窗口操作 

 象文本方式下可以设定屏幕窗口一样,图形方式下也可以在屏幕上某一区域设定窗口,只是设定的为图形窗口而已,其后的有关图形操作都将以这个窗口的左上角(0, 0)作为坐标原点,而且可为通过设置使窗口之外的区域为不可接触。这样,所有的图形操作就被限定在窗口内进行。 

void far setviewport(int xl,int yl,int x2, int y2,int clipflag); 设定一个以(xl,yl)象元点为左上角,(x2,y2)象元为右下角的图形窗口,其中

x1,y1,x2,y2是相对于整个屏幕的坐标。若 clipflag为非0,则设定的图形以外部分不可接触,若clipflag为0,则图形窗口以外可以接触。 void far clearviewport(void); 清除现行图形窗口的内容。  

void far getviewsettings(struct viewporttype far * viewport); 获得关于现行窗口的信息,并将其存于viewporttype定义的结构变量viewport中,其中viewporttype的结构说明如下: struct viewporttype{ int left, top, right, bottom; int cliplag; }; 注意: 

a. 窗口颜色的设置与前面讲过的屏幕颜色设置相同,但屏幕背景色和窗口背景色只能是一种颜色,如果窗口背景色改变,整个屏幕的背景色也将改变这与文本窗口不同。 

b 可以在同一个屏幕上设置多个窗口,但只能有一个现行窗口工作,要对其它窗口操作,通过将定义那个窗口的setviewport()函数再用一次即可。 c. 前面讲过图形屏幕操作的函数均适合于对窗口的操作。 

2.屏幕操作函数 

除了清屏函数以外,关于屏幕操作还有以下函数:  void far setactivepage(int pagenum);  

void far setvisualpage(int pagenum); 

unsined far imagesize(int xl,int yl,int x2,int y2); 这三个函数用于将屏幕上的图像复制到内存,然后再将内存中的图像送回到屏幕上。首先通过函数imagesize() 测试要保存左上角为(xl,yl),右上角为(x2,y2)的图形屏幕区域内的全部内容需多少个字节,然后再给mapbuf分配一个所测数字节内存空间的指针。通过调用getimage()函数就可将该区域内的图像保存在内存中,需要时可用putimage()函数将该图像输出到左上角为点(x, y)的位置上,其中getimage()函数中的参数op规定如何释放内存中图像。 

对于imagesize()函数,只能返回字节数小于64K字节的图像区域,否则将会出错,出错时返回

3.图形模式下的文本输出  

  在图形模式下,只能用标准输出函数,如printf(),puts(),putchar()函数输出文本到屏幕。除此之外,其它输出函数(如窗口输出函数)不能使用,即是可以输出的标准函数,也只以前景色为白色,按80列,25行的文本方式输出。    Turbo C2.0也提供了一些专门用于在图形显示模式下的文本输出函数。文本输出函数  

void far outtext(char far *textstring); 该函数输出字符串指针textstring所指的文本在现行位置。  

void far outtextxy(int x, int y, char far *textstring);该函数输出字符串指针textstring所指的文本在规定的(x, y)位置。其中x和y为象元坐标。

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

编辑游戏还是个很难的过程,不管是语言还是页面的设计都要求非常细致,相信经过努力会做出不错游戏。

时间: 2024-10-11 10:05:05

C语言第一次课的相关文章

大一C语言结课设计之《简单计算器》

/*===============================================*** 设计目的:简单计算器,计算形如10*(20.2-30.6)+5.0/2的表达式值 ** 简要原理:中缀式转逆波兰式(后缀式) ** IDE:Dev-Cpp 4.9.9.2 ** 注意事项:括号必须是英文状态的 ** 时间: 2014-6-17 \*===============================================*/ #include <stdio.h> #in

六周第一次课(1月15日) 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下

六周第一次课(1月15日)9.1 正则介绍_grep上9.2 grep中9.3 grep下 在计算机科学中,对"正则表达式" 的定义是:它使用单个字符串来描述或匹配一系列符合某个句法规则的字符串.在很多文本编辑器或其他工具里,正则表达式通常用来检索和替换那些符合某个模式的文本内容.许多程序设计语言也都支持利用正则表达式进行字符串操作.对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论是查找某个文档,还是查询某个日志文件并分析其容,都会用到正则表达式.其实正则表达式只是一种思

七月算法--12月机器学习在线班-第一次课笔记—微积分与概率论

七月算法--12月机器学习在线班-第一次课笔记—微积分与概率论 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

留念 C语言第一课简单的计算器制作

学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */ #include<stdio.h>  #include<stdlib.h> #include<conio.h>void displayMenu();void add();void sub();void multiply();void divide();void yushu();void jiecheng();void leijia();void jiechengleijia();int main(in

c语言第二课

c语言第二课: 八进制 0 0370 十六进制 0x (不区分大小写) 0xe3d ASCII码: ASCII码规定了128个英文字符与二进制的对应关系,占用一个字节(实际上只占用了一个字节的后面7位,最前面1位统一规定为0) Unicode: Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号,每个符号的对应的二进制都不一样.Unicode 规定可以使用多个字节表示一个字符,例如 a 的编码为 01100001,一个字节就够了,"好"的编码为 01011001 01

c语言第一课

c语言第一课: 类型: 不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算. 编译.运行程序: 程序源文件命名约定: cc.cxx.cpp.cp及.C 从命令行运行编译器: cc test1.cc 其中cc是编译器程序的名字.编译器生成一个可执行文件.Windows系统将会生成可执行文件 prog1.exe . UNIX系统中的编译器生成可执行文件a.out 运行: 在windows系统中运行一个可执行文件,需要提供可执行文件的文件名,可以忽略其扩展名.exe 在一些系统中,即使文件就在

选修课《创新创业运行力》第一次课有感

第一次给学生上 公共选修课--<创新创业运行力>,一看学生名单,200人,还真的压力非常大,但如今.我已经喜欢上这门课程了. 平台学习资料.手冊下载网址(http://pan.baidu.com/s/1eQxjFv8).请第一次学习的同学一定下载下来.细致阅读"学生手冊". 新建了一个QQ群(<创新创业运行力>.90363642).期待大家增加!有兴趣做管理员的同学,请通过QQ留言. 零:学习平台简单介绍 尔雅通识教育平台(课程网址:http://gdou.ts

二周第一次课(12月18日)

二周第一次课(12月18日)2.6 相对和绝对路径2.7 cd命令2.8 创建和删除目录mkdir/rmdir2.9 rm命令 相对和绝对路径: (根./)下的文件目录是绝对路径:[[email protected] ~]# ls /etc/sysconfig/network-scripts/ifcfg-ens33/etc/sysconfig/network-scripts/ifcfg-ens33 (当前目录下的文件目录)是相对路径:[[email protected] ~]# pwd/root

四周第一次课(1月2日)

四周第一次课(1月2日)4.10/4.11/4.12 lvm讲解 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性. 与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储.它使系统管理员可以更方便