c语言编程游戏代码大全(c语言程序游戏代码)
c语言小游戏代码
最基础的贪吃蛇的代码
#includestdio.h
#includewindows.h//基本型态定义。支援型态定义函数。使用者界面函数 图形装置界面函数。
#includeconio.h //用户通过按键盘产生的对应操作 (控制台)
#includestdlib.h
#includetime.h //日期和时间头文件
#define LEN 30
#define WID 25
int Snake[LEN][WID] = {0}; //数组的元素代表蛇的各个部位
char Sna_Hea_Dir = 'a';//记录蛇头的移动方向
int Sna_Hea_X, Sna_Hea_Y;//记录蛇头的位置
int Snake_Len = 3;//记录蛇的长度
clock_t Now_Time;//记录当前时间,以便自动移动
int Wait_Time ;//记录自动移动的时间间隔
int Eat_Apple = 1;//吃到苹果表示为1
int Level ;
int All_Score = -1;
int Apple_Num = -1;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出的句柄 windows.h
//句柄 :标志应用程序中的不同对象和同类对象中的不同的实例 方便操控,
void gotoxy(int x, int y)//设置光标位置
{
COORD pos = {x,y}; //定义一个字符在控制台屏幕上的坐标POS
SetConsoleCursorPosition(hConsole, pos); //定位光标位置的函数windows.h
}
void Hide_Cursor()//隐藏光标 固定函数
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(hConsole, cursor_info);
}
void SetColor(int color)//设置颜色
{
SetConsoleTextAttribute(hConsole, color);
//是API设置字体颜色和背景色的函数 格式:SetConsoleTextAttribute(句柄,颜色);
}
void Print_Snake()//打印蛇头和蛇的脖子和蛇尾
{
int iy, ix, color;
for(iy = 0; iy WID; ++iy)
for(ix = 0; ix LEN; ++ix)
{
if(Snake[ix][iy] == 1)//蛇头
{
SetColor(0xf); //oxf代表分配的内存地址 setcolor:34行自定义设置颜色的函数
gotoxy(ix*2, iy);
printf("※");
}
if(Snake[ix][iy] == 2)//蛇的脖子
{
color = rand()%15 + 1; //rand()函数是产生随机数的一个随机函数。C语言里还有 srand()函数等。
//头文件:stdlib.h
if(color == 14)
color -= rand() % 13 + 1; //变色
SetColor(color);
gotoxy(ix*2, iy);
printf("■");
}
if(Snake[ix][iy] == Snake_Len)
{
gotoxy(ix*2, iy);
SetColor(0xe);
printf("≈");
}
}
}
void Clear_Snake()//擦除贪吃蛇
{
int iy, ix;
for(iy = 0; iy WID; ++iy)
for(ix = 0; ix LEN; ++ix)
{
gotoxy(ix*2, iy);
if(Snake[ix][iy] == Snake_Len)
printf(" ");
}
}
void Rand_Apple()//随机产生苹果
{
int ix, iy;
do
{
ix = rand() % LEN;
iy = rand() % WID;
}while(Snake[ix][iy]);
Snake[ix][iy] = -1;
gotoxy(ix*2, iy);
printf("⊙");
Eat_Apple = 0;
}
void Game_Over()//蛇死掉了
{
gotoxy(30, 10);
printf("Game Over");
Sleep(3000);
system("pause nul");
exit(0);
}
void Move_Snake()//让蛇动起来
{
int ix, iy;
for(ix = 0; ix LEN; ++ix)//先标记蛇头
for(iy = 0; iy WID; ++iy)
if(Snake[ix][iy] == 1)
{
switch(Sna_Hea_Dir)//根据新的蛇头方向标志蛇头
{
case 'w':
if(iy == 0)
Game_Over();
else
Sna_Hea_Y = iy - 1;
Sna_Hea_X = ix;
break;
case 's':
if(iy == (WID -1))
Game_Over();
else
Sna_Hea_Y = iy + 1;
Sna_Hea_X = ix;
break;
case 'a':
if(ix == 0)
Game_Over();
else
Sna_Hea_X = ix - 1;
Sna_Hea_Y = iy;
break;
case 'd':
if(ix == (LEN - 1))
Game_Over();
else
Sna_Hea_X = ix + 1;
Sna_Hea_Y = iy;
break;
default:
break;
}
}
if(Snake[Sna_Hea_X][Sna_Hea_Y]!=1Snake[Sna_Hea_X][Sna_Hea_Y]!=0Snake[Sna_Hea_X][Sna_Hea_Y]!=-1)
Game_Over();
if(Snake[Sna_Hea_X][Sna_Hea_Y] 0)//吃到苹果
{
++Snake_Len;
Eat_Apple = 1;
}
for(ix = 0; ix LEN; ++ix)//处理蛇尾
for(iy = 0; iy WID; ++iy)
{
if(Snake[ix][iy] 0)
{
if(Snake[ix][iy] != Snake_Len)
Snake[ix][iy] += 1;
else
Snake[ix][iy] = 0;
}
}
Snake[Sna_Hea_X][Sna_Hea_Y] = 1;//处理蛇头
}
void Get_Input()//控制蛇的移动方向
{
if(kbhit())
{
switch(getch())
{
case 87:
Sna_Hea_Dir = 'w';
break;
case 83:
Sna_Hea_Dir = 's';
break;
case 65:
Sna_Hea_Dir = 'a';
break;
case 68:
Sna_Hea_Dir = 'd';
break;
default:
break;
}
}
if(clock() - Now_Time = Wait_Time)//蛇到时间自动行走
{
Clear_Snake();
Move_Snake();
Print_Snake();
Now_Time = clock();
}
}
void Init()//初始化
{
system("title 贪吃毛毛蛇");
system("mode con: cols=80 lines=25");
Hide_Cursor();
gotoxy(61, 4);
printf("You Score:");
gotoxy(61, 6);
printf("You Level:");
gotoxy(61, 8);
printf("The Lenght:");
gotoxy(61, 10);
printf("The Speed:");
gotoxy(61, 12);
printf("Apple Num:");
int i;
for(i = 0; i Snake_Len; ++i)//生成蛇
Snake[10+i][15] = i+1;
int iy, ix;//打印蛇
for(iy = 0; iy WID; ++iy)
for(ix = 0; ix LEN; ++ix)
{
if(Snake[ix][iy])
{
SetColor(Snake[ix][iy]);
gotoxy(ix*2, iy);
printf("■");
}
}
}
void Pri_News()//打印信息
{
SetColor(0xe);
gotoxy(73,4);
All_Score += Level;
printf("%3d", All_Score);
gotoxy(73, 6);
printf("%3d", Level);
gotoxy(73, 8);
printf("%3d",Snake_Len);
gotoxy(73, 10);
printf("0.%3ds", Wait_Time/10);
gotoxy(73, 12);
printf("%d", Apple_Num);
}
void Lev_Sys()//等级系统
{
if(((Apple_Num-1) / 10) == Level)
{
++Level;
if(Wait_Time 50)
Wait_Time -= 50;
else
if(Wait_Time 10)
Wait_Time -= 10;
else
Wait_Time -= 1;
}
}
int main(void)
{
Init();
srand((unsigned)time(NULL));//设置随机数的种子
Now_Time = clock();
int speed1=1000,speed2,a;
printf("\n");
printf("请输入你想要的速度\n");
scanf("%d",speed2);
Level=1;
Wait_Time=speed1-speed2;
printf("请输入你想要的苹果数\n");
scanf("%d",a);
while(a--)
Rand_Apple();
while(1)
{
if(Eat_Apple)
{
++Apple_Num;
Rand_Apple();
Lev_Sys();
Pri_News();
}
Get_Input();
Sleep(10);
}
return 0;
}
俄罗斯方块C语言代码
俄罗斯方块C源代码
#include?stdio.h
#include?windows.h
#include?conio.h
#include?time.h
#define??ZL??4 ? ? //坐标增量,?不使游戏窗口靠边
#define?WID??36 ?? //游戏窗口的宽度
#define?HEI??20 ?? //游戏窗口的高度
int?i,j,Ta,Tb,Tc; ? ?? //?Ta,Tb,Tc用于记住和转换方块变量的值
int?a[60][60]={0}; ?? //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框
int?b[4]; ? ? ?? //标记4个"口"方块:1有,0无,类似开关
int?x,y,?level,score,speed; ?? //方块中心位置的x,y坐标,游戏等级、得分和游戏速度
int?flag,next; ? //当前要操作的方块类型序号,下一个方块类型序号
void?gtxy(int?m,?int?n); ? //以下声明要用到的自编函数
void?gflag(?);? //获得下一方块序号
void?csh(?);? //初始化界面
void?start(?);? //开始部分
void?prfk?(?);? //打印方块
void?clfk(?);? //清除方块
void?mkfk(?);? //制作方块
void?keyD(?);? //按键操作
int??ifmov(?);? //判断方块能否移动或变体
void clHA(?);? //清除满行的方块
void?clNEXT(?);? //清除边框外的NEXT方块
int?main(?)
{?csh(?); ??
?? while(1)
? ?? {start(?);??//开始部分
? ? ?? while(1)
? ? ?? {?prfk(?);??
? ? ? ?? Sleep(speed);? //延时
? ? ? ? ? clfk(?);
? ? ? ? ? Tb=x;Tc=flag;??//临存当前x坐标和序号,以备撤销操作
? ? ? ? ? keyD(?); ?
? ? ? ? ? y++;?????//方块向下移动
? ? ? ?? if?(ifmov(?)==0)?{?y--;?prfk(?);?dlHA(?);?break;}?//不可动放下,删行,跨出循环
? ? ?? }
? ? ? for(i=y-2;iy+2;i++){?if?(i==ZL)?{?j=0;?}?}? //方块触到框顶
? ?? if?(j==0)?{?system("cls");gtxy(10,10);printf("游戏结束!");?getch();?break;?}?
? ?? clNEXT(?); ? //清除框外的NEXT方块
? ? }
? return?0;
}
void?gtxy(int?m,?int?n)??//控制光标移动
{COORD?pos;??//定义变量
pos.X?=?m;??//横坐标
pos.Y?=?n;???//纵坐标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),?pos);
}
void?csh(?)????//初始化界面
{gtxy(ZL+WID/2-5,ZL-2);?printf("俄罗斯方块");??????//打印游戏名称
gtxy(ZL+WID+3,ZL+7);?printf("*******?NEXT:");??//打印菜单信息
gtxy(ZL+WID+3,ZL+13);?printf("**********");
gtxy(ZL+WID+3,ZL+15);?printf("Esc?:退出游戏");
gtxy(ZL+WID+3,ZL+17);?printf("↑键:变体");
gtxy(ZL+WID+3,ZL+19);?printf("空格:暂停游戏");
gtxy(ZL,ZL);??printf("╔");??gtxy(ZL+WID-2,ZL);??printf("╗");??//打印框角
gtxy(ZL,ZL+HEI);??printf("╚");??gtxy(ZL+WID-2,ZL+HEI);??printf("╝");
a[ZL][ZL+HEI]=2;??a[ZL+WID-2][ZL+HEI]=2;??//记住有图案
for(i=2;iWID-2;i+=2)?{gtxy(ZL+i,ZL);??printf("═");?}??//打印上横框
for(i=2;iWID-2;i+=2)?{gtxy(ZL+i,ZL+HEI);?printf("═");?a[ZL+i][ZL+HEI]=2;?}?//下框
for(i=1;iHEI;i++)?{?gtxy(ZL,ZL+i);??printf("║");?a[ZL][ZL+i]=2;?}??//左竖框记住有图案
for(i=1;iHEI;i++)?{gtxy(ZL+WID-2,ZL+i);?printf("║");?a[ZL+WID-2][ZL+i]=2;?}?//右框
CONSOLE_CURSOR_INFO?cursor_info={1,0};???//以下是隐藏光标的设置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);
level=1;?score=0;?speed=400;
gflag(?);??flag=next;??//获得一个当前方块序号
}
void?gflag(?) ? //获得下一个方块的序号
{?srand((unsigned)time(NULL));?next?=?rand()%19+1; }
void?start(?)??//开始部分
{?gflag(?);?Ta=flag;?flag=next;??//保存当前方块序号,将下一方块序号临时操作
x=ZL+WID+6;?y=ZL+10;?prfk(?);??//给x,y赋值,在框外打印出下一方块
flag=Ta;?x=ZL+WID/2;?y=ZL-1;??//取回当前方块序号,并给x,y赋值
}
void?prfk?(?)??//打印俄罗斯方块
{?for(i=0;i4;i++)?{b[i]=1;?}??//数组b[4]每个元素的值都为1
mkfk?(?);??//制作俄罗斯方块
for(?i=?x-2;?i=x+4;?i+=2?)??//打印方块
{?for(j=y-2;j=?y+1;j++)?{?if(?a[i][j]==1??jZL?){?gtxy(i,j);?printf("□");?}?}?}
gtxy(ZL+WID+3,ZL+1); ? printf("level?:?%d",level); ?//以下打印菜单信息
gtxy(ZL+WID+3,ZL+3);? printf("score?:?%d",score);
gtxy(ZL+WID+3,ZL+5);? printf("speed?:?%d",speed);
}
void?clfk(?)??//清除俄罗斯方块
{?for(i=0;i4;i++)?{?b[i]=0;?}??//数组b[4]每个元素的值都为0
mkfk?(?);??//制作俄罗斯方块
for(?i=x-2;?i=x+4;?i+=2?)??//清除方块
{?for(j=y-2;j=y+1;j++){?if(?a[i][j]==0??jZL?){?gtxy(i,j);?printf("??");?}?}?}
}
void?mkfk(?)??//制作俄罗斯方块
{?a[x][?y]=b[0];??//方块中心位置状态:?1-有,0-无
switch(flag)???//共6大类,19种小类型
{?case?1:?{?a[x][y-1]=b[1];?a[x+2][y-1]=b[2];?a[x+2][y]=b[3];?break;?}??//田字方块
case?2:?{?a[x-2][y]=b[1];?a[x+2][y]=b[2];?a[x+4][y]=b[3];?break;?}??//直线方块:----
case?3:?{?a[x][y-1]=b[1];?a[x][y-2]=b[2];?a[x][y+1]=b[3];?break;?}??//直线方块:?|
case?4:?{?a[x-2][y]=b[1];?a[x+2][y]=b[2];?a[x][y+1]=b[3];?break;?}??//T字方块
case?5:?{?a[x][y-1]=b[1];?a[x][y+1]=b[2];?a[x-2][y]=b[3];?break;?}??//T字顺时针转90度
case?6:?{?a[x][y-1]=b[1];?a[x-2][y]=b[2];?a[x+2][y]=b[3];?break;?}??//T字顺转180度
case?7:?{?a[x][y-1]=b[1];?a[x][y+1]=b[2];?a[x+2][y]=b[3];?break;?}??//T字顺转270度
case?8:?{?a[x][y+1]=b[1];?a[x-2][y]=b[2];?a[x+2][y+1]=b[3];?break;?}?//Z字方块
case?9:?{?a[x][y-1]=b[1];?a[x-2][y]=b[2];?a[x-2][y+1]=b[3];?break;?}??//Z字顺转90度
case?10:?{?a[x][y-1]=b[1];?a[x-2][y-1]=b[2];?a[x+2][y]=b[3];?break;?}??//Z字顺转180度
case?11:?{?a[x][y+1]=b[1];?a[x+2][y-1]=b[2];?a[x+2][?y]=b[3];?break;?}?//Z字顺转270度
case?12:?{?a[x][y-1]=b[1];?a[x][y+1]=b[2];?a[x-2][y-1]=b[3];?break;?}??//7字方块
case?13:?{a[x-2][y]=b[1];?a[x+2][y-1]=b[2];?a[x+2][y]=b[3];?break;?}??//7字顺转90度
case?14:?{?a[x][y-1]=b[1];?a[x][y+1]=b[2];?a[x+2][y+1]=b[3];?break;?}??//7字顺转180度
case?15:?{?a[x-2][y]=b[1];?a[x-2][y+1]=b[2];?a[x+2][y]=b[3];?break;?}??//7字顺转270度
case?16:?{?a[x][y+1]=b[1];?a[x][y-1]=b[2];?a[x+2][y-1]=b[3];?break;?}??//倒7字方块
case?17:?{?a[x-2][y]=b[1];?a[x+2][y+1]=b[2];?a[x+2][y]=b[3];?break;?}??//倒7字顺转90度
case?18:?{?a[x][y-1]=b[1];?a[x][y+1]=b[2];?a[x-2][y+1]=b[3];?break;?}??//倒7字顺转180度
case?19:?{?a[x-2][y]=b[1];?a[x-2][y-1]=b[2];?a[x+2][y]=b[3];?break;?}??//倒7字顺转270度
}
}
void?keyD(?)??//按键操作
{?if?(kbhit(?))
{?int?key;
?? key=getch();
if?(key==224)
{?key=getch();
? ? ?? if?(key==75)?{?x-=2;?}??//按下左方向键,中心横坐标减2
if?(key==77)?{?x+=2;?}??//按下右方向键,中心横坐标加2
? ? ? if?(key==72)?????//按下向上方向键,方块变体
{?if?(flag=2??flag=3?)?{?flag++;?flag%=2;?flag+=2;?}
if?(?flag=4??flag=7?)?{?flag++;?flag%=4;?flag+=4;?}
if?(flag=8??flag=11?)?{?flag++;?flag%=4;?flag+=8;?}
if?(flag=12??flag=15?)?{?flag++;?flag%=4;?flag+=12;?}
if?(?flag=16??flag=19?)?{?flag++;?flag%=4;?flag+=16;?}?}
? ? ?? }
? ? if?(key==32)?????//按空格键,暂停
{?prfk(?);?while(1)?{?if?(getch(?)==32)?{?clfk(?);break;}?}?}? //再按空格键,继续游戏
? ? if?(ifmov(?)==0)?{?x=Tb;?flag=Tc;?}? //如果不可动,撤销上面操作
? ? else?{?prfk(?);?Sleep(speed);?clfk(?);?Tb=x;Tc=flag;} ? //如果可动,执行操作
}
}
int?ifmov(?)???//判断能否移动
{?if?(a[x][y]!=0)?{?return?0;?}??//方块中心处有图案返回0,不可移动
else{?if?(?(flag==1??(?a[x][?y-1]==0??a[x+2][y-1]==0??a[x+2][y]==0?)?)?||
? ? ?? (flag==2??(?a[x-2][y]==0??a[x+2][y]==0??a[x+4][y]==0?)?)?||
? ? ?? (flag==3??(?a[x][y-1]==0??a[x][y-2]==0??a[x][y+1]==0?)?)?||
? ? ?? (flag==4??(?a[x-2][y]==0??a[x+2][y]==0??a[x][y+1]==0?)?)?||
? ? ?? (flag==5??(?a[x][y-1]==0??a[x][y+1]==0??a[x-2][y]==0?)?)?||
? ? ?? (flag==6??(?a[x][?y-1]==0??a[x-2][y]==0??a[x+2][y]==0?)?)?||
? ? ?? (flag==7??(?a[x][y-1]==0??a[x][y+1]==0??a[x+2][y]==0?)?)?||
? ? ?? (flag==8??(?a[x][y+1]==0??a[x-2][y]==0??a[x+2][y+1]==0?)?)?||
? ? ?? (flag==9??(?a[x][y-1]==0??a[x-2][y]==0??a[x-2][y+1]==0?)?)?||
? ? ?? (flag==10??(?a[x][y-1]==0??a[x-2][y-1]==0??a[x+2][y]==0?)?)?||
? ? ?? (flag==11??(?a[x][y+1]==0??a[x+2][y-1]==0??a[x+2][y]==0?)?)?||
? ? ?? (flag==12??(?a[x][y-1]==0??a[x][y+1]==0??a[x-2][y-1]==0?)?)?||
? ? ? ( flag==13 ( a[x-2][y]==0 a[x+2][y-1]==0 a[x+2][y]==0 ) ) ||
????( flag==14 ( a[x][y-1]==0 a[x][y+1]==0 a[x+2][y+1]==0 ) ) ||
? ?? (flag==15 ( a[x-2][y]==0 a[x-2][y+1]==0 a[x+2][y]==0 ) ) ||
? ?? (flag==16 ( a[x][y+1]==0 a[x][y-1]==0 a[x+2][y-1]==0 ) ) ||
? ?? ( flag==17 ( a[x-2][y]==0 a[x+2][y+1]==0 a[x+2][y]==0 ) ) ||
????(flag==18 ( a[x][y-1]==0 a[x][y+1]==0 a[x-2][y+1]==0 ) ) ||
? ?? (flag==19 ( a[x-2][y]==0 a[x-2][y-1]==0
? ? ? ? ? ? ?a[x+2][y]==0?)?)?)?{?return?1;?}
}
return?0; ? //其它情况返回0
}
void?clNEXT(?) ? //清除框外的NEXT方块
{?flag?=?next;??x=ZL+WID+6;??y=ZL+10;??clfk(?);?}
void clHA(?) ? //清除满行的方块
{?int?k,?Hang=0; ?? //k是某行方块个数,?Hang是删除的方块行数
for(j=ZL+HEI-1;j=ZL+1;j--)??//当某行有WID/2-2个方块时,则为满行
{?k=0;?for(i=ZL+2;iZL+WID-2;i+=2)
{?if?(a[i][j]==1)???//竖坐标从下往上,横坐标由左至右依次判断是否满行
{?k++; ? //下面将操作删除行
? ?? if?(k==WID/2-2)? { ? for(k=ZL+2;kZL+WID-2;k+=2)
? ? ? ?? {?a[k][j]=0;?gtxy(k,j);?printf("??");?Sleep(1);?}
? ? ? ? for(k=j-1;kZL;k--)
? ? ? ? {?for(i=ZL+2;iZL+WID-2;i+=2)??//已删行数上面有方块,先清除再全部下移一行
? ? ? ? ? {?if(a[i][k]==1)?{?a[i][k]=0;?gtxy(i,k);?printf("??");a[i][k+1]=1;
? ? ? ? ? ? gtxy(i,k+1);?printf("□");?}?}
? ? ? ? ? }
? ? ? ? j++;?????//方块下移后,重新判断删除行是否满行
? ? ? ? Hang++;??//记录删除方块的行数
? ? ?? }
? ? }
?? }
}
score+=100*Hang; ? //每删除一行,得100分
if?(?Hang0??(score%500==0?||?score/500?level-1?)?) ?//得分满500速度加快升一级
? {?speed-=20;?level++;?if(speed200)speed+=20; }
}
c语言游戏编程,下落的小鸟 求代码
下落的小鸟
#includestdio.h
#includestdlib.h
#includeconio.h
#includetime.h
#includeWindows.h
int Grade = 1, Score = 0, Max_blank = 9, Distance = 18;
struct Birds{int x; int y;}; ?//定义一种Birds数据类型(含3个成员)
Birds *Bird = (Birds*)malloc(sizeof(Birds)); ?//定义Birds类型 指针变量Bird并赋初值
struct Bg{int x, y; int l_blank; Bg *pri; Bg *next;};? //定义一种Bg数据类型(含5个成员)
Bg *Bg1 = (Bg*)malloc(sizeof(Bg));? //定义Bg类型 指针变量Bg1并赋初值
void Position(int x, int y) ?//光标定位函数(用于指定位置输出)
{COORD pos = { x - 1, y - 1 };
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos);
}
void Csh( ) ?//初始化界面
{
printf("══════════════════════════════════════\n");
printf(" ■■ ■■ C语言版 Flappy Bird \n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■ 瞎搞人:yyposs原创\n");
printf(" ■■ ■■ 瞎搞日期:2014.2\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■ 改编:鸣蝉百2021.7\n");
printf(" ■■ ■■ 操作:按向上方向键让小鸟起飞\n");
printf(" ■■\n");
printf(" ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■ DEVc++运行通过\n");
printf("══════════════════════════════════════\n");
printf("? 按键继续…");
getch( );
system("cls");
}
void PrFK( ) ?//输出方框(游戏范围区)
{int i;
Position(1, 1); printf("╔");? Position(79, 1); printf("╗");
Position(1, 24); printf("╚");? Position(79, 24); printf("╝");
for (i = 3; i = 78; i += 2){Position(i, 1); printf("═"); Position(i, 24); printf("═");}
for(i=2;i=23;i++)
{ Position(1,i); printf("║");if(i11)printf("0%d",i-1);else printf("%d",i-1);
Position(79,i); printf("║");
}
Position(4, 25); printf("小鸟即将出现,请准备按键起飞… ");
getch( );
Position(4, 25); printf("????????????????????????????????? ");
}
void CreatBg( )? //创建障碍物坐标(便于打印输出)
{Bg *Bg2 = (Bg*)malloc(sizeof(Bg));
Bg1-x = 90; Bg1-y = 8;? //确定障碍物的一对基本坐标(此时值是在游戏框之外)
Bg2-x = Bg1-x + Distance; Bg2-y = 9;? //下一障碍物的基本坐标x、y
Bg1-l_blank = Max_blank - Grade;? //障碍物上下两部分之间的空白距离l_blank
Bg2-l_blank = Max_blank - Grade;
Bg1-next = Bg2; Bg1-pri = Bg2;
Bg2-next = Bg1; Bg2-pri = Bg1;
}
void InsertBg(Bg *p)? //随机改变障碍物的y坐标,让空白通道有上下变化
{int temp;
Bg *Bgs = (Bg*)malloc(sizeof(Bg));
Bgs-x = p-pri-x + Distance;
Bgs-l_blank = Max_blank - Grade;
srand((int)time(0)); ?//启动随机数发生器
temp = rand( ); ?//产生一个随机数并赋值给temp
if (temp % 2 == 0)
{if ((temp % 4 + p-pri-y + Max_blank - Grade)21)
Bgs-y = p-pri-y + temp % 4;
else Bgs-y = p-pri-y;
}
else
{if ((p-pri-y - temp % 4)2)Bgs-y = p-pri-y - temp % 4;
else Bgs-y = p-pri-y;
}
Bgs-pri = p-pri; Bgs-next = p;
p-pri-next = Bgs; p-pri = Bgs;
}
void CreatBird( )? //建立小鸟的坐标(初始打印输出小鸟的位置)
{Bird-x = 41; Bird-y = 10;}
int CheckYN(Bg *q)? //判断游戏结束与否(值为0是要结束,为1没有要结束)
{Bg *p = q; int i = 0;
while (++i = 5)
{if (Bird-y23)return 0;
if (Bird-x == p-xBird-y = p-y)return 0;
if ((Bird-x == p-x || Bird-x == p-x + 1 || Bird-x == p-x + 2) Bird-y == p-y)return 0;
if (Bird-x == p-xBird-yp-y + p-l_blank)return 0;
if ((Bird-x == p-x || Bird-x == p-x + 1 || Bird-x == p-x + 2) Bird-y == p-y + p-l_blank)
return 0;
p = p-next;
}
return 1;
}
void Check_Bg(Bg *q)? //核查开头的障碍物坐标是否在游戏区内
{Bg *p = q; int i = 0, temp;
while (++i = 5)
{if (p-x-4)p = p-next;
else
{srand((int)time(0)); ?temp = rand();
if (temp % 2 == 0)
{if ((temp % 4 + p-y + Max_blank - Grade)21)p-y = p-y + temp % 4;
else p-y = p-y; p-x = p-pri-x + Distance;
p-l_blank = Max_blank - Grade;
}
else
{if ((p-y - temp % 4)2)p-y = p-y - temp % 4;
else p-y = p-y; p-x = p-pri-x + Distance;
p-l_blank = Max_blank - Grade;
}
}
}
}
void Prt_Bg(Bg *q)? //打印输出障碍物(依据其x、y坐标进行相应输出)
{Bg *p = q; int i = 0, k, j;
while (++i = 5)
{if (p-x0 p-x = 78)
{for (k = 2; kp-y; k++){Position(p-x + 1, k); printf("■"); printf("■"); printf(" ");}
Position(p-x, p-y);
printf("■"); printf("■"); printf("■"); printf(" ");
Position(p-x, p-y + p-l_blank);
printf("■"); printf("■"); printf("■"); printf(" ");
k = k + p-l_blank + 1;
for (k; k = 23; k++){Position(p-x + 1, k); printf("■"); printf("■"); printf(" ");}
}
p = p-next;
if (p-x == 0)
{for (j = 2; jp-y; j++){Position(p-x + 1, j); printf(" "); printf(" ");}
Position(p-x + 1, p-y);
printf(" "); printf(" "); printf(" ");
Position(p-x + 1, p-y + Max_blank - Grade);
printf(" "); printf(" "); printf(" ");
j = j + Max_blank - Grade + 1;
for (j; j = 22; j++){Position(p-x + 1, j); printf(" "); printf(" ");}
}
}
}
void PrtBird( )? //打印输出小鸟
{Position(Bird-x, Bird-y - 1); printf(" ");
Position(Bird-x, Bird-y); printf("Ю");
Position(38, 2); printf("Score:%d", Score);
}
void Loop_Bg(Bg *q)? //障碍物x坐标左移,并记录成绩
{Bg *p = q; int i = 0;
while (++i = 5)
{p-x = p-x - 1; p = p-next;
if (Bird-x == p-x)
{Score += 1;
if (Score % 4 == 0 Grade4)Grade++;
}
}
}
int main( )
{int i = 0; int t;
while (1)
{
Csh( );PrFK( );CreatBg( );
InsertBg(Bg1);InsertBg(Bg1);InsertBg(Bg1);
CreatBird( );
while (1)
{if (!CheckYN(Bg1))break;
Check_Bg(Bg1);Prt_Bg(Bg1);
PrtBird( );Loop_Bg(Bg1);
Bird-y = Bird-y + 1;
if (GetAsyncKeyState(VK_UP)) ?//按下了向上方向键
{Position(Bird-x, Bird-y - 1);printf(" ");
Bird-y = Bird-y - 4;
}
Sleep(200);? //程序延时200毫秒(数值大小决定游戏速度快慢)
i = 0;
}
Position(6, 25);
printf("游戏结束!? 请输入:0.退出? 1.重玩");
scanf("%d",t);
if (t==0)break;
system("cls"); Score = 0;
}
return 0;
}
怎样用C语言编写一个小游戏?
“贪吃蛇”C代码:
#include stdio.h
#include stdlib.h
#include conio.h
#include time.h
#include Windows.h
#define W 78? //游戏框的宽,x轴
#define H 26? //游戏框的高,y轴
int dir=3; ???//方向变量,初值3表示向“左”
int Flag=0; ??//吃了食物的标志(1是0否)
int score=0;? //玩家得分
struct food{ int x;? //食物的x坐标
? ? ? ? ? ? ? ? ? int y;? //食物的y坐标
? ? ? ? ? ? ? ?? }fod; ?//结构体fod有2个成员
struct snake{ int len;? //身长
? ? ? ? ? ? ? ? ?? int speed;? //速度
? ? ? ? ? ? ? ? ?? int x[100];
? ? ? ? ? ? ? ? ?? int y[100];
? ? ? ? ? ? ? ? ? }snk;? //结构体snk有4个成员
void gtxy( int x,int y) ?//控制光标移动的函数
{ COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void gtxy( int x,int y);? //以下声明要用到的几个自编函数
void csh( );? //初始化界面
void keymove( ); //按键操作移动蛇
void putFod( );? //投放食物
int? Over( ); ??//游戏结束(1是0否)
void setColor(unsigned short p, unsigned short q); //设定显示颜色
int main( )?? //主函数
{ csh( );
? while(1)
? ? { Sleep(snk.speed);
? ? ? keymove( );
? ? ? putFod( );
? ? ? if(Over( ))
? ? ?? {system(“cls”);
? ? ? ? gtxy(W/2+1,H/2); printf(“游戏结束!T__T”);
? ? ? ? gtxy(W/2+1,H/2+2); printf(“玩家总分:%d分”,score);
? ? ? ? getch( );
? ? ? ? break;
? ? ?? }
?? }
?? return 0;
}
void csh( )? //初始化界面
{ int i;
gtxy(0,0);
CONSOLE_CURSOR_INFO cursor_info={1,0};? //以下两行是隐藏光标的设置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);
for(i=0;i=W;i=i+2)? //横坐标要为偶数,因为这个要打印的字符占2个位置
{ setColor(2, 0);? //设定打印颜色为绿字黑底
? gtxy(i,0); ?printf("■"); ?//打印上边框
? gtxy(i,H); printf("■"); ?//打印下边框
}
for(i=1;iH;i++)
{ gtxy(0,i); printf("■"); ?//打印左边框
?? gtxy(W,i); printf("■"); ?//打印右边框
}
while(1)
??{ srand((unsigned)time(NULL));? //初始化随机数发生器srand( )
? fod.x=rand()%(W-4)+2;? //随机函数rand( )产生一个从0到比”(W-4)”小1的数再加2
? fod.y=rand()%(H-2)+1;? //随机函数rand( )产生一个从0到比”(H-2)”小1的数再加1
? if (fod.x%2==0) break;? //fod.x是食物的横坐标,要是2的倍数(为偶数)
}
setColor(12, 0);? //设定打印颜色为淡红字黑底
gtxy(fod.x,fod.y); printf("●"); ?//到食物坐标处打印初试食物
snk.len=3; ?????//蛇身长
snk.speed=350;? //刷新蛇的时间,即是移动速度
snk.x[0]=W/2+1;? //蛇头横坐标要为偶数(因为W/2=39)
snk.y[0]=H/2;?? ?//蛇头纵坐标
setColor(9, 0);? //设定打印颜色为淡蓝字黑底
gtxy(snk.x[0], snk.y[0]); ?printf("■"); ?//打印蛇头
for(i=1;isnk.len;i++)
? ? { snk.x[i]=snk.x[i-1]+2; ?snk.y[i]=snk.y[i-1];
? ? ? gtxy(snk.x[i],snk.y[i]); ?printf("■"); ?//打印蛇身
?? }
setColor(7, 0);? //恢复默认的白字黑底
return;
}
void keymove( )? //按键操作移动蛇
{ int key;
if( kbhit( ) )??? //如有按键输入才执行下面操作
?? { key=getch( );
? ?? if (key==224)? //值为224表示按下了方向键,下面要再次获取键值
? ? ?? { key=getch( );
? ? ? ?? if(key==72dir!=2)dir=1;? //72表示按下了向上方向键
? ? ? ?? if(key==80dir!=1)dir=2;? //80为向下
? ? ? ?? if(key==75dir!=4)dir=3;? //75为向左
? ? ? ?? if(key==77dir!=3)dir=4;? //77为向右
? ? ?? }
?? if (key==32)
? ? ? { while(1) if((key=getch( ))==32) break; }? //32为空格键,这儿用来暂停
? }
if (Flag==0)? //如没吃食物,才执行下面操作擦掉蛇尾
? { gtxy(snk.x[snk.len-1],snk.y[snk.len-1]); ?printf("? "); }
int i;
for (i = snk.len - 1; i 0; i--) ?//从蛇尾起每节存储前一节坐标值(蛇头除外)
{ snk.x[i]=snk.x[i-1]; ?snk.y[i]=snk.y[i-1]; }
switch (dir)? //判断蛇头该往哪个方向移动,并获取最新坐标值
{ case 1: snk.y[0]--; break; ??//dir=1要向上移动
? case 2: snk.y[0]++; break;? //dir=2要向下移动
? case 3: snk.x[0]-=2; break;? //dir=3要向左移动
? case 4: snk.x[0]+=2; break;? //dir=4要向右移动
}
setColor(9, 0);
gtxy(snk.x[0], snk.y[0]); printf("■"); ?//打印蛇头
if (snk.x[0] == fod.x snk.y[0] == fod.y)? //如吃到食物则执行以下操作
?? { printf("\007"); snk.len++; score += 100; snk.speed -= 5; Flag = 1; } //007是响铃
else Flag = 0; ? //没吃到食物Flag的值为0
if(snk.speed150) snk.speed= snk.speed+5;? //作弊码,不让速度无限加快
}
void putFod( )? //投放食物
{ if (Flag == 1)? //如吃到食物才执行以下操作,生成另一个食物
?? { while (1)
??{ int i,n= 1;
???srand((unsigned)time(NULL));? //初始化随机数发生器srand( )
? ?fod.x = rand( ) % (W - 4) + 2;? //产生在游戏框范围内的一个x坐标值
? ?fod.y = rand( ) % (H - 2) + 1;? //产生在游戏框范围内的一个y坐标值
? ?for (i = 0; i snk.len; i++) ??//随机生成的食物不能在蛇的身体上
?{ if (fod.x == snk.x[i] fod.y == snk.y[i]) { n= 0; break;} }
???if (n fod.x % 2 == 0) break; ?//n不为0且横坐标为偶数,则食物坐标取值成功
??}
?setColor(12, 0);
? ? ? gtxy(fod.x, fod.y); ?printf("●"); ? //光标到取得的坐标处打印食物
?? }
return;
}
int Over( )? //判断游戏是否结束的函数
{ int ?i;
setColor(7, 0);
gtxy(2,H+1); printf(“暂停键:space.”); ?//以下打印一些其它信息
gtxy(2,H+2); printf(“游戏得分:%d”,score);
if (snk.x[0] == 0 || snk.x[0] == W) return 1;? //蛇头触碰左右边界
if (snk.y[0] == 0 || snk.y[0] == H) return 1;? //蛇头触碰上下边界
for (i = 1; i snk.len; i++)
{ if (snk.x[0] == snk.x[i] snk.y[0] == snk.y[i]) return 1; }? //蛇头触碰自身
return 0; ? //没碰到边界及自身时就返回0
}
void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)
{? HANDLE? handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute( handle, ForeColor + BackGroundColor * 0x10 );
} ? //用来设定颜色的函数
关于用C语言编写的小游戏的游戏代码,如黑白棋贪吃蛇等
我这儿有c语言的自写俄罗斯方块,请指教:#include
#include
#include
#include
#include
#include
#include
#define ESC 0x011b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define SPACE 0x3920
#define Y 0x1579
#define N 0x316e
#define clearkbd(); while(bioskey(1)) bioskey(0); /*清空键盘缓冲队列*/
void update();
void messagebox();
void process();
void initremove();
void initinfo();
void initbox();
void initposition();
void next_shape();
typedef struct shape /*形状单一状态的记录*/
{ int attr;
int co[8];
}shape;
typedef struct RE_AB /*相对,绝对坐标记录*/
{ int Rx,Ry;
int x1,x2,y1,y2;
}RE_AB;
RE_AB RA;
shape p[19]={ { RED,0,1,1,0,1,1,2,1 }, /*数组中保证y最大的在最后,以便initposition使用*/
{ RED,0,1,1,0,1,1,1,2 },
{ RED,0,0,1,0,2,0,1,1 },
{ RED,0,0,0,1,1,1,0,2 },
{ GREEN,0,0,1,0,2,0,3,0 },
{ GREEN,0,0,0,1,0,2,0,3 },
{ CYAN,0,0,0,1,1,0,1,1 },
{ BROWN,0,0,1,0,1,1,2,1 },
{ BROWN,1,0,0,1,1,1,0,2 },
{ BLUE,1,0,2,0,1,1,0,1 },
{ BLUE,0,0,0,1,1,1,1,2 },
{ MAGENTA,0,0,0,1,0,2,1,2 },
{ MAGENTA,2,0,0,1,1,1,2,1},
{ MAGENTA,0,0,1,0,1,1,1,2 },
{ MAGENTA,0,0,0,1,1,0,2,0 },
{ YELLOW,0,2,1,0,1,1,1,2 },
{ YELLOW,0,0,1,0,2,0,2,1 },
{ YELLOW,1,0,0,0,0,1,0,2},
{ YELLOW,0,0,0,1,1,1,2,1 },
};
int nback,nleft,nright,r_f[12][22],rs1,rs2,xcors,xcorb,ycors,ycorb;
/*检查方快有没有左,右,下接触,游戏区内所有格子有无颜色记录数组,rs1形状记录,rs2为提示框用,记录小格子在游戏区中的位置,按键存储*/
void interrupt (*oldint)(); /*系统定时中断*/
int count_down=0,count_other=0; /*中断记时*/
void interrupt newint() /*设置新的中断程序*/
{ count_down++;
count_other++;
oldint();
}
void intenable() /*设置中断向量表,启动新的中断程序*/
{ oldint=getvect(0x1c);
disable();
setvect(0x1c,newint);
enable();
}
void intrestore() /*恢复中断向量*/
{ disable();
setvect(0x1c,oldint);
enable();
}
void HZ12(int x0,int y0,int w,int color,char *s) /*根据字模,在dos下显示汉字*/
/*横坐标,纵坐标,字间隔,汉字颜色,汉字字符串*/
{ FILE *fp;
register char buffer[24];
register char str[2];
unsigned long fpos;/*fpos为最终偏移动量*/
register int i,j,k;
fp=fopen(hzk12,r);/*打开12*12汉字苦*/
while(*s)/*一直到字符串结束为止*/
{
if(*s0)/*汉字输出*/
{ str[0]=(*s)-0xa0;
str[1]=*(s+1)-0xa0;
fpos=((str[0]-1)*94+(str[1]-1))*24L;/*计算汉字在hzk12的偏移量*/
fseek(fp,fpos,SEEK_SET);/*指针移动到当前位置*/
fread(buffer,24,1,fp);/*读取一个汉字到数组中*/
for(i=0;i12;i++)/*12行*/
for(j=0;j2;j++)/*两个字节*/
for(k=0;k8;k++)/*8位*/
if (((buffer[i*2+j](7-k))0x1)!=NULL)/*是一就画点*/
putpixel(x0+8*j+k,y0+i,color);
s+=2;/*一个汉字占两个字节,现在将指针移动两个字节*/
x0+=w;/*显示坐标也按照间隔移动*/
}
else/*显示非汉字字符*/
{ settextstyle(0,0,1);
setcolor(color);
str[0]=*s;str[1]=0;
outtextxy(x0,y0+3,str);/*显示单个字符*/
x0+=w-7;/*显示单个字符后的x坐标变化*/
s++;/*指针移动到下一个字节*/
}
}
fclose(fp);
}
void translation() /*把相对坐标解释为绝对坐标*/
{ if(RA.Rx==1)
{ RA.x1=1; RA.x2=16; }
else
{ RA.x1=16*(RA.Rx-1); RA.x2=16*RA.Rx; }
if(RA.Ry==1)
{ RA.y1=1; RA.y2=16; }
else
{ RA.y1=16*(RA.Ry-1); RA.y2=16*RA.Ry; }
}
int check_b() /*检查是否到达低部*/
{ int x,y,i,zf=0; /*zf为是否有颜色填充记录*/
for(i=0;i7;i++,i++)
{ x=RA.Rx+p[rs1].co[i];
y=RA.Ry+p[rs1].co[i+1];
if(y=6)
zf+=r_f[x-15][y-6+1];
}
if(zf==0)
return 1;
else
return 0;
}
int finish()
{ int tfull=0,i; /*判断顶层空间是否有填充*/
for(i=1;i11;i++)
tfull+=r_f[i][1];
if(tfull!=0)
return 1; /*告诉judge()可以结束了*/
}
int check_l() /*检查形状是否与左接触*/
{ int x,y,i,zf=0;
for(i=0;i7;i++,i++)
{ x=RA.Rx+p[rs1].co[i];
y=RA.Ry+p[rs1].co[i+1];
if(y6)
zf+=r_f[x-15-1][y-6];
if(y=6x==16)
zf+=1;
}
if(zf==0)
return 1;
else
return 0;
}
int check_r() /*检查形状是否与右接触*/
{ /*zf为是否有颜色填充记录*/
int x,y,i,zf=0; /*zf为是否有颜色填充记录*/
for(i=0;i7;i++,i++)
{
x=RA.Rx+p[rs1].co[i];
y=RA.Ry+p[rs1].co[i+1];
if(y6)
zf+=r_f[x-15+1][y-6];
if(y=6x==25)
zf+=1;
}
if(zf==0)
return 1;
else
return 0;
}
void check_touch()
{ nback=check_b();
nleft=check_l();
nright=check_r();
}
void draw(int cb) /*画形状,cb=1以填充色画形状,cb=2以背景色画形状,cb=3以白色画形状*/
{ int i,recordx=RA.Rx,recordy=RA.Ry;
for(i=0;i7;i++,i++)
{ RA.Rx+=p[rs1].co[i];
RA.Ry+=p[rs1].co[i+1];
if(RA.Ry=6)
{ RA.Rx=recordx;
RA.Ry=recordy;
continue;
}
translation();
if(cb==1)
setfillstyle(1,p[rs1].attr);
else
if(cb==2)
setfillstyle(1,BLACK);
else
if(cb==3)
{ setfillstyle(1,WHITE);
r_f[RA.Rx-15][RA.Ry-6]=1; /*置对应数组标记元素*/
}
bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1);
RA.Rx=recordx;
RA.Ry=recordy;
}
}
void mov(int key) /*向下,左,右移动方块*/
{ draw(2);
if(key==LEFTnleft)
RA.Rx--;
else
if(key==RIGHTnright)
RA.Rx++;
else
RA.Ry++;
nback=check_b();
if(nback) /*判断形状有没有到达底部,有就将其颜色变为白色*/
draw(1);
else
draw(3);
}
void change() /*变换形状*/
{ int status=rs1,buffer,i,x,y,zf=0;
if(p[rs1].attr==p[rs1+1].attr)
rs1++;
else
while(p[rs1].attr==p[rs1-1].attr)
rs1--;
for(i=0;i7;i++,i++) /*检查变化形状后是否与已存形状发生冲突*/
{ x=RA.Rx+p[rs1].co[i];
y=RA.Ry+p[rs1].co[i+1];
if(y6)
zf+=r_f[x-15][y-6];
}
if(zf!=0)
rs1=status;
buffer=rs1;
rs1=status;
status=buffer;
draw(2);
buffer=rs1;
rs1=status;
status=buffer;
nback=check_b(); /*判断变化后的形状是不是到达了低部,这个检查是十分必要的*/
if(nback)
draw(1);
else
draw(3);
}
void accelerate()
{ if(count_down=1)
{ check_touch(); /*消除上一步动作对方块状态的影响*/
count_down=0;
if(nback) /*0表示到达底部,1表示没有到达*/
mov(DOWN);
}
}
void drawbox() /*画方块所在方框*/
{ int xcor,ycor;
for(xcor=xcors;xcor=xcorb;xcor++)
for(ycor=ycors;ycor=ycorb;ycor++)
{ if(xcor==xcors||xcor==xcorb||ycor==ycors||ycor==ycorb)
{ RA.Rx=xcor;
RA.Ry=ycor;
translation();
setfillstyle(1,DARKGRAY);
bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1);
}
}
}
void erasure(int k)
{ int i,j,recordx=RA.Rx,recordy=RA.Ry;
{ j=k-1;
for(;j0;j--)
{ for(i=1;i11;i++)
{ r_f[i][j+1]=r_f[i][j];
RA.Rx=i+15;
RA.Ry=j+1+6;
translation();
if(r_f[i][j+1]==1)
setfillstyle(1,WHITE);
else
setfillstyle(1,BLACK);
bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1);
RA.Rx=recordx;
RA.Ry=recordy;
}
}
}
}
void pause()
{ HZ12(450,400,15,BLACK,正常);
HZ12(450,400,15,GREEN,暂停);
for(;;)
if(bioskey(1)bioskey(0)==SPACE)
{ clearkbd();
HZ12(450,400,15,BLACK,暂停);
HZ12(450,400,15,RED,正常);
return;
}
}
void judge()
{ int i,j,full=0; /*full等于10说明某一行满,该消除了*/
if(finish()) /*判断游戏是否该结束了*/
messagebox(); /*win编程里有这个函数*/
for(j=1;j21;j++) /*判断某一行是否满了*/
{ for(i=1;i11;i++)
full+=r_f[i][j];
if(full==10)
erasure(j); /*消除这行*/
full=0;
}
}
void update() /*使程序可以重新运行*/
{ cleardevice();
setbkcolor(BLACK);
initinfo(); /*提示信息初始化*/
initbox(); /*游戏框架初始化*/
srand((unsigned)time(NULL)); /*随机器函数的初始化*/
rs1=random(19);
rs2=random(19);
next_shape();
initposition(); /*方块最开始的出现位置*/
initremove(); /*记录每个方格有无颜色填充数组初始化*/
HZ12(450,400,15,RED,正常);
process();
}
void EXIT()
{ closegraph();
intrestore(); /*恢复中断向量*/
exit(0);
}
void initremove()
{ int i,j;
for(i=0;i12;i++)
for(j=0;j22;j++)
if(i==0||i==11||j==0||j==21)
r_f[i][j]=1;
else
r_f[i][j]=0;
}
void initinfo()
{ char aStr[2];
setcolor(RED);
outtextxy(450,100,This game's writer is:);
HZ12(450,140,15,RED,该程序作者:NULL);
outtextxy(525,110,NULL);
outtextxy(450,180,FUNCTION FOR KEYS:);
outtextxy(450,200,UP:change the shape);
outtextxy(450,210,DOWN:accelerate);
outtextxy(450,220,LEFT:move left);
outtextxy(450,230,RIGHT:move right);
outtextxy(450,240,ESC:exit this game);
outtextxy(450,250,SPACE:pause);
HZ12(450,260,20,RED,上:);
HZ12(450,280,20,RED,下:);
HZ12(450,300,20,RED,左:);
HZ12(450,320,20,RED,右:);
HZ12(450,340,20,RED,ESC:退出);
HZ12(450,360,15,RED,空格: 暂停/开始);
HZ12(450,380,15,RED,目前状态:);
HZ12(20,200,15,RED,下一个形状);
aStr[0]=24;
aStr[1]=0;
aStr[6]=0;
HZ12(480,260,12,GREEN,aStr);
HZ12(500,260,12,GREEN,( 变形 ));
aStr[0]=25;
aStr[1]=0;
HZ12(480,280,12,GREEN,aStr);
HZ12(500,280,12,GREEN,( 加速 ));
aStr[0]=27;
aStr[1]=0;
HZ12(480,300,12,GREEN,aStr);
HZ12(500,300,12,GREEN,向左);
aStr[0]=26;
aStr[1]=0;
HZ12(480,320,12,GREEN,aStr);
HZ12(500,320,12,GREEN,向右);
}
void messagebox()
{ int key;
setcolor(GREEN);
setfillstyle(1,DARKGRAY);
rectangle(220,200,420,300);
bar(221,201,419,299);
HZ12(280,210,15,GREEN,GAME OVER);
HZ12(275,230,15,GREEN,重新游戏: Y);
HZ12(275,270,15,GREEN,退出游戏: N);
HZ12(450,400,15,BLACK,正常);
HZ12(450,400,15,GREEN,GAME OVER);
for(;;)
if(bioskey(1))
{ key=bioskey(0);
if(key==Y)
{ clearkbd();
update();
}
else
if(key==N)
{ clearkbd();
EXIT();
}
else
clearkbd();
}
}
void initbox()
{ xcors=15; /*画游戏框*/
xcorb=26;
ycors=6;
ycorb=27;
drawbox();
xcors=2; /*画提示框*/
xcorb=7;
ycors=6;
ycorb=11;
drawbox();
}
void initposition()
{ RA.Rx=18;
RA.Ry=6-p[rs1].co[7];;
RA.x1=0;
RA.x2=0;
RA.y1=0;
RA.y2=0;
}
void next_shape() /*画下一形状提示框*/
{ int recordx=RA.Rx,recordy=RA.Ry,buffer;
RA.Rx=3;
RA.Ry=7;
draw(2);
buffer=rs1;
rs1=rs2;
rs2=buffer;
draw(1);
RA.Rx=recordx;
RA.Ry=recordy;
buffer=rs1;
rs1=rs2;
rs2=buffer;
}
void process() /*游戏过程*/
{ for(;;)
{ check_touch();
if(!nback)
{ rs1=rs2;
rs2=random(19); /*产生另一种方块的码数*/
initposition();
judge(); /*判断某一行是否满了和这个游戏是否可以结束了*/
draw(1);
next_shape();
}
if(count_other=1)
{ count_other=0;
if(bioskey(1)) /*对按键的处理*/
{ int key=bioskey(0);
clearkbd(); /*清除键盘缓冲队列*/
if(key==ESC)
EXIT();
if(key==LEFTnleftnback)
mov(LEFT);
if(key==RIGHTnrightnback)
mov(RIGHT);
if(key==UPnback)
change();
if(key==SPACE)
pause();
if(key==DOWN)
accelerate();
}
}
if(count_down=4)
{ check_touch(); /*消除上一步动作对方块状态的影响*/
count_down=0;
if(nback) /*0表示到达底部,1表示没有到达*/
mov(DOWN);
}
}/*for*/
}
main()
{ int gdriver=DETECT,gmode=0;
initgraph(gdriver,gmode,d:turboc); /*启动图形与中断部分*/
intenable();
update();
}
用C语言编写的小游戏代码是什么?
“猜数字小游戏”,每个数字后按空格,最后按回车确认
#includestdio.h
#includestdlib.h
#includetime.h
int a[4],b[4];
int count=0;? //计算猜测次数
void csh( );? //初始化
void start( );? //开始游戏
int main( )
{ csh( );
start( );
}
void csh( )? //初始化
{ printf("\n\n???????? 猜? 数? 字? 小? 游? 戏\n\n");
printf(“? ??猜四个数字,如数字与顺序都正确记为A,数字正确位置不对记为B.\n”);
}
void start( )? //开始游戏
{int m,n;? //m是完全猜对的个数,n是顺序不对的个数
while(1)
{srand((unsigned)time(NULL));? //初始化随机数发生器srand( )
while(1) { for(int i=0;i4;i++) a[i]=rand( )%10; ?//rand( )函数每次随机产生一个0-9的数
if( (a[3]!=a[2]a[3]!=a[1]a[3]!=a[0])
(a[2]!=a[1]a[2]!=a[0])a[1]!=a[0] ) break; }? //4个随机数各自不相等
printf("?? ?请依次输入4个一位整数:\n\n? ?");
while(1)
{for(int i=0;i4;i++) scanf(“%d”,b[i]);
printf("?? ?你输入的是:%d? %d? %d? %d ",b[0],b[1],b[2],b[3]);
m=0;n=0;
for(int i=0;i4;i++)
{for(int j=0;j4;j++)
{ if(b[i]==a[j]i==j)m=m+1; if(b[i]==a[j]i!=j)n=n+1; }
}
count=count+1;
printf("????? %dA? %dB?? 你试了%d次\n? ?",m,n,count);
if(m==4)break;
if(count==8){ count=0; break; }
}
printf("\n");
if(m==4)printf("???? 你猜对了(^-^)! 就是:%d %d %d %d\n",a[0],a[1],a[2],a[3]);
else printf("???? 你输了(T-T)!哈哈!应该是:%d %d %d %d\n",a[0],a[1],a[2],a[3]);
int z;
printf("???? (要继续吗?1或0)\n? ?");
scanf(“%d”,z);
if(z==0) break;
}
}