| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 683 人关注过本帖
标题:丢骰子的程序——初学者可以来看看(其实很有用的)
收藏  订阅  推荐  打印 
wjse
Rank: 1
等级:新手上路
帖子:4
积分:142
注册:2006-8-24
丢骰子的程序——初学者可以来看看(其实很有用的)

前天三个同学在寝室,突然想要喝酒。打算丢骰子喝的,可是两层楼找下来居然没有个骰子!郁闷之余,写了这个程序,暂时用了一下,后来改进了一写东西,在这里发出来,算是给初学者一个例子吧,挺简单的。就算不想看,也可以真的当骰子来用,绝对随机,不会作弊哟!

程序开始时提示输入骰子数量(最少一个,最多四个),回车后出现界面。只要按任意键不放,骰子就开始摇,放开后立即停止。如果要退出就按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;
}
}
}

搜索更多相关主题的帖子: 骰子  作弊  
2007-3-21 23:48
cdmalcl
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:19
帖子:3701
积分:38098
注册:2005-9-23

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

出售C语言经典视频、资料与工具光盘 20元一张 想要E-MAIL
lichuanliang007@yahoo.com.cn
2007-3-22 00:21
wangjianguo
Rank: 1
等级:新手上路
帖子:13
积分:238
注册:2007-4-6

不能运行啊 ,老大

2007-4-7 12:13
hjj1123
Rank: 3Rank: 3
等级:中级会员
帖子:198
积分:2148
注册:2006-7-29

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

qq:674940174
2007-4-13 09:04
hahahan
Rank: 2
等级:注册会员
帖子:48
积分:594
注册:2007-4-10

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

没事儿你就多到这儿转转
2007-4-13 23:39
沉默改良者
Rank: 1
等级:新手上路
帖子:6
积分:160
注册:2007-4-15

2007-4-15 03:22
玖莉
Rank: 1
等级:新手上路
帖子:18
积分:280
注册:2007-4-14

以下是引用hahahan在2007-4-13 23:39:52的发言:
win-tc下运行正常
不错不错 色子可以动起来 就是停不了啊 呵呵

只好重起电脑喽!


编程初学者
2007-4-21 17:05
奔跑的鸟
Rank: 3Rank: 3
等级:中级会员
帖子:334
积分:3910
注册:2006-1-20

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

简单的快乐着~
2007-5-3 19:57
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.071363 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved