前天三个同学在寝室,突然想要喝酒。打算丢骰子喝的,可是两层楼找下来居然没有个骰子!郁闷之余,写了这个程序,暂时用了一下,后来改进了一写东西,在这里发出来,算是给初学者一个例子吧,挺简单的。就算不想看,也可以真的当骰子来用,绝对随机,不会作弊哟!
程序开始时提示输入骰子数量(最少一个,最多四个),回车后出现界面。只要按任意键不放,骰子就开始摇,放开后立即停止。如果要退出就按ESC。
代码如下:
#include "stdio.h"
#include "graphics.h"
#include "bios.h"
#include "dos.h"
#include "stdlib.h"
#define LENGTH 40
#define ESC 0x11b
#define TIME 2000
void Init(void);/*初始化绘图环境*/
void drawdice(int x,int y,int number);/*画骰子*/
main()
{
int n=0;/*骰子的数量*/
int number[4];/*每个骰子的点数*/
int mx[4],my[4];/*各个骰子的中心坐标*/
/*输入骰子的数量n,不能小于1或大于4*/
while(n<=0 || n>4)
{
printf("\nEnter the number of dice(1-4):");
scanf("%d",&n);
}
Init();/*初始化图形*/
randomize();/*初始化随机数发生器*/
switch(n)
{
case 1:
{
mx[0]=getmaxx()/2;/*获得屏幕中心坐标*/
my[0]=getmaxy()/2;
/*先在屏幕上显示一个骰子*/
drawdice(mx[0],my[0],1);
while(1)/*如果没有按键,则无限循环*/
{
if(!bioskey(1))/*如果有按键*/
{
if(bioskey(0)==ESC) exit(0);/*如果按键为ESC,退出*/
}
/*随机生成点数,由于random()函数生成的随机数包括0,所以此处要反复,直到生成的数不为0*/
do{number[0]=random(7);}while(number[0]==0);
drawdice(mx[0],my[0],number[0]);
delay(TIME);/*延迟函数,使程序停顿一下,这样才能看清图形切换效果*/
}
break;
}
case 2:
{
/*骰子一的中心坐标*/
mx[0]=getmaxx()/2-LENGTH;
my[0]=getmaxy()/2;
/*骰子二的中心坐标*/
mx[1]=getmaxx()/2+LENGTH;
my[1]=getmaxy()/2;
/*先在屏幕上显示两个骰子*/
drawdice(mx[0],my[0],1);
drawdice(mx[1],my[1],1);
while(1)
{
if(!bioskey(1))
{
if(bioskey(0)==ESC) exit(0);
}
/*随机生成两个点数*/
do{number[0]=random(7);}while(number[0]==0);
do{number[1]=random(7);}while(number[1]==0);
/*画出骰子*/
drawdice(mx[0],my[0],number[0]);
drawdice(mx[1],my[1],number[1]);
delay(TIME);
}
break;
}
case 3:
{
/*上方骰子的中心坐标*/
mx[0]=getmaxx()/2;
my[0]=getmaxy()/2-LENGTH;
/*左下骰子的中心坐标*/
mx[1]=getmaxx()/2-LENGTH;
my[1]=getmaxy()/2+LENGTH;
/*右下骰子的中心坐标*/
mx[2]=getmaxx()/2+LENGTH;
my[2]=getmaxy()/2+LENGTH;
/*先在屏幕上显示三个骰子*/
drawdice(mx[0],my[0],1);
drawdice(mx[1],my[1],1);
drawdice(mx[2],my[2],1);
while(1)
{
if(!bioskey(1))
{
if(bioskey(0)==ESC) exit(0);
}
do{number[0]=random(7);}while(number[0]==0);
do{number[1]=random(7);}while(number[1]==0);
do{number[2]=random(7);}while(number[2]==0);
drawdice(mx[0],my[0],number[0]);
drawdice(mx[1],my[1],number[1]);
drawdice(mx[2],my[2],number[2]);
delay(TIME);
}
break;
}
case 4:
{
mx[0]=getmaxx()/2-LENGTH;/*左上*/
my[0]=getmaxy()/2-LENGTH;
mx[1]=getmaxx()/2+LENGTH;/*右上*/
my[1]=getmaxy()/2-LENGTH;
mx[2]=getmaxx()/2+LENGTH;/*右下*/
my[2]=getmaxy()/2+LENGTH;
mx[3]=getmaxx()/2-LENGTH;/*左下*/
my[3]=getmaxy()/2+40;
/*先在屏幕上显示四个骰子*/
drawdice(mx[0],my[0],1);
drawdice(mx[1],my[1],1);
drawdice(mx[2],my[2],1);
drawdice(mx[3],my[3],1);
while(1)
{
if(!bioskey(1))
{
if(bioskey(0)==ESC) exit(0);
}
/*随机生成四个骰子的点数*/
do{number[0]=random(7);}while(number[0]==0);
do{number[1]=random(7);}while(number[1]==0);
do{number[2]=random(7);}while(number[2]==0);
do{number[3]=random(7);}while(number[3]==0);
/*画出骰子*/
drawdice(mx[0],my[0],number[0]);
drawdice(mx[1],my[1],number[1]);
drawdice(mx[2],my[2],number[2]);
drawdice(mx[3],my[3],number[3]);
delay(TIME);
}
break;
}
}
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
cleardevice();
}
void drawdice(x,y,number)/*输入骰子中心坐标和点数,画出骰子*/
{
if(number<1 || number>6) {printf("\nError");exit(1);}/*检查随机生成的number是否超出范围*/
setfillstyle(SOLID_FILL,WHITE);/*白色填充*/
bar(x-(LENGTH/2),y-(LENGTH/2),x+(LENGTH/2),y+(LENGTH/2));/*画矩形*/
switch(number)/*根据点数画红点*/
{
case 1:
{
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
circle(x,y,LENGTH/4);/*画半径为10的圆*/
floodfill(x,y,RED);/*填充圆*/
break;
}
case 2:
{
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
/*上*/
circle(x,y-10,LENGTH/8);/*半径为5*/
floodfill(x,y-10,RED);
/*下*/
circle(x,y+10,LENGTH/8);
floodfill(x,y+10,RED);
break;
}
case 3:
{
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
/*中间*/
circle(x,y,LENGTH/8);/*半径为5*/
floodfill(x,y ,RED);
/*右上*/
circle(x+10,y-10,LENGTH/8);
floodfill(x+10,y-10,RED);
/*左下*/
circle(x-10,y+10,LENGTH/8);
floodfill(x-10,y+10,RED);
break;
}
case 4:
{
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
/*左上*/
circle(x-10,y-10,LENGTH/8);/*半径为5*/
floodfill(x-10,y-10,RED);
/*右上*/
circle(x+10,y-10,LENGTH/8);
floodfill(x+10,y-10,RED);
/*右下*/
circle(x+10,y+10,LENGTH/8);
floodfill(x+10,y+10,RED);
/*左下*/
circle(x-10,y+10,LENGTH/8);
floodfill(x-10,y+10,RED);
break;
}
case 5:
{
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
/*中间*/
circle(x,y,LENGTH/8);/*半径为5*/
floodfill(x,y,RED);
/*左上*/
circle(x-10,y-10,LENGTH/8);
floodfill(x-10,y-10,RED);
/*右上*/
circle(x+10,y-10,LENGTH/8);
floodfill(x+10,y-10,RED);
/*右下*/
circle(x+10,y+10,LENGTH/8);
floodfill(x+10,y+10,RED);
/*左下*/
circle(x-10,y+10,LENGTH/8);
floodfill(x-10,y+10,RED);
break;
}
case 6:
{
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
/*左*/
circle(x-10,y,LENGTH/10);/*半径为4*/
floodfill(x-10,y,RED);
/*左上*/
circle(x-10,y-10,LENGTH/10);
floodfill(x-10,y-10,RED);
/*右上*/
circle(x+10,y-10,LENGTH/10);
floodfill(x+10,y-10,RED);
/*右*/
circle(x+10,y,LENGTH/10);
floodfill(x+10,y,RED);
/*右下*/
circle(x+10,y+10,LENGTH/10);
floodfill(x+10,y+10,RED);
/*左下*/
circle(x-10,y+10,LENGTH/10);
floodfill(x-10,y+10,RED);
break;
}
}
}