wjse 发表于 2007-3-21 23:48

丢骰子的程序——初学者可以来看看(其实很有用的)

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

cdmalcl 发表于 2007-3-22 00:21

挺有意思<BR>但是感觉还能优化

wangjianguo 发表于 2007-4-7 12:13

<P>不能运行啊 ,老大<BR></P>

hjj1123 发表于 2007-4-13 09:04

绝对随机?你的随机数是依靠“do{number[0]=random(7);}while(number[0]==0);“这句话中的函数random()生成的 它是个伪随机函数,算法网上可以找到。我还以为你自己写了随机数生成算法。不过你 的程序挺有 创意的。<BR>

hahahan 发表于 2007-4-13 23:39

win-tc下运行正常<BR>不错不错  色子可以动起来  就是停不了啊  呵呵

沉默改良者 发表于 2007-4-15 03:22

[em25]

玖莉 发表于 2007-4-21 17:05

<DIV class=quote><B>以下是引用<U>hahahan</U>在2007-4-13 23:39:52的发言:</B><BR>win-tc下运行正常<BR>不错不错  色子可以动起来  就是停不了啊  呵呵</DIV>
<p>只好重起电脑喽!<BR>[em06] [em17] [em02]

奔跑的鸟 发表于 2007-5-3 19:57

第一次可以停,第二次就挺不下了,是不是键盘缓存的问题???清一下试试看

页: [1]

编程论坛