问题补充说明:比如俄罗斯方块。请写一下原代码,写的时候请谢的美观一些向电脑上一样,万分感谢。编写完了是不是还要绘图什么的请详细说一下。谢谢,我在学单片机但是对游戏的兴趣还是大一些。
“贪吃来自蛇”C代码:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<Windows.h>
#defineW78 //游戏框的宽,x轴
#defineH26 //游戏框的高,y轴
intdir=3; //方向变量,初值3表示向“360问答左”
intFlag=0; //吃了食物的标志(1是0否)
intscore=0; //玩家得分
structfood{intx; //卫剂吗护尼赵事想到输食物的x坐标
inty; //食物的y坐标
}fod; //结构体fod有2个成员
structsnake{intlen; //身长
intspeed; //速度
intx[100];
inty[100];
}snk; //结构体snk有4个成员
voidgtxy(intx,inty) //控制光标抗与气升导先艺紧移动的函数
{COORDcoord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HAND调盐缺时倒LE),coord);
}
voidgtxy(intx,inty); /影季周儿装孔首施/以下声明要用到的几个自编函数
voidcsh(); //初始化界面
voidkeymove();//按键操西作移动蛇
voidput空谈Fod(); //投放食物
int Over(); /航损/游戏结束(1是0否)
voidsetColor(unsignedshortp,unsignedshortq);//设定显示颜色
intmain() //主函数
{csh();
while(1)
{Sleep(***.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;
}
}
return0;
}
voidcsh() //初始化界面
{inti;
gtxy(0,0);
CONSOLE_CURSOR_INFOcursor_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;导城职谈认析氧i<H;i++)
{gtxy(0,i);printf("■"); //打印左边框
gtxy(W,i);print冲若况够受友告f("■"); //打印右边框
}
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("●"); //到食物坐标处打印初试食物
***.len=3; //蛇身长
***.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;i<***.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;
}
voidkeymove() //按键操作移动蛇
{intkey;
if(kbhit()) //如有按键输入才执行下面操作
{key=getch();
if(key==224) //值为224表示按下了方向键,下面要再次获取键值
{key=getch();
if(key==72&&dir!=2)dir=1; //72表示按下了向上方向键
if(key==80&&dir!=1)dir=2; //80为向下
if(key==75&&dir!=4)dir=3; //75为向左
if(key==77&&dir!=3)dir=4; //77为向右
}
if(key==32)
{while(1)if((key=getch())==32)break;} //32为空格键,这儿用来暂停
}
if(Flag==0) //如没吃食物,才执行下面操作擦掉蛇尾
{gtxy(snk.x[***.len-1],snk.y[***.len-1]); printf(" ");}
inti;
for(i=***.len-1;i>0;i--) //从蛇尾起每节存储前一节坐标值(蛇头除外)
{snk.x[i]=snk.x[i-1]; snk.y[i]=snk.y[i-1];}
switch(dir) //判断蛇头该往哪个方向移动,并获取最新坐标值
{case1:snk.y[0]--;break; //dir=1要向上移动
case2:snk.y[0]++;break; //dir=2要向下移动
case3:snk.x[0]-=2;break; //dir=3要向左移动
case4: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");***.len++;score+=100;***.speed-=5;Flag=1;}//007是响铃
elseFlag=0; //没吃到食物Flag的值为0
if(***.speed<150)***.speed=***.speed+5; //作弊码,不让速度无限加快
}
voidputFod() //投放食物
{if(Flag==1) //如吃到食物才执行以下操作,生成另一个食物
{while(1)
{inti,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<***.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;
}
intOver() //判断游戏是否结束的函数
{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)return1; //蛇头触碰左右边界
if(snk.y[0]==0||snk.y[0]==H)return1; //蛇头触碰上下边界
for(i=1;i<***.len;i++)
{if(snk.x[0]==snk.x[i]&&snk.y[0]==snk.y[i])return1;} //蛇头触碰自身
return0; //没碰到边界及自身时就返回0
}
voidsetColor(unsignedshortForeColor=7,unsignedshortBackGroundColor=0)
{ HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle,ForeColor+BackGroundColor*0x10);
} //用来设定颜色的函数
标签:C语言,小游戏,编写