i=(MouseY-90)20;y坐标 MouseOff(); if(Mine[i][j].flag==0&&Mine[i][j].num!=0)本来没红旗现在显示红旗 { DrawRedflag(i,j); Mine[i][j].flag=1; } else if(Mine[i][j].flag==1)有红旗标志再按右键就红旗消失 { DrawEmpty(i,j,0,8); Mine[i][j].flag=0; } }
MouseOn(); sleep(1); } } }
案例六 速算24 6.3.4 源程序 #define N 20 #define COL 100 #define ROW 40
#include \
#include \系统时间函数 #include \图形函数 #include \动态地址分配函数 #include \库函数 #include \字符串函数 #include \字符操作函数 char p[4][13]={
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},扑克牌,10用0来表示
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}}; typedef struct node {
int data;
struct node link; }STACK1; 栈1
typedef struct node2
{
char data;
struct node2 link; }STACK2; 栈2
void init(void);图形驱动 void close(void);图形关闭
void play(void);发牌的具体过程 void rand1(int j);随机发牌函数
void change(char e,char a); 中缀变后缀函数 int computer(char s); 后缀表达式计算函数 STACK1 initstack1(STACK1 top); 栈1初始化 STACK1 push(STACK1 top,int x); 栈1入栈运算 STACK1 pop(STACK1 top); 栈1删除栈顶元素 int topx(STACK1 top); 栈1读栈顶元素
STACK1 ptop(STACK1 top,int x); 栈1读出栈顶元素值并删除栈顶元素 int empty(STACK1 top); 判栈1是否为空函数 STACK2 initstack2(STACK2 top); 栈2初始化 STACK2 push2(STACK2 top,char x); 栈2入栈运算 STACK2 pop2(STACK2 top); 栈2删除栈顶元素 char topx2(STACK2 top); 栈2读栈顶元素
STACK2 ptop2(STACK2 top,char x); 栈2读出栈顶元素值并删除栈顶元素 int empty2(STACK2 top); 判栈2是否为空函数 int text1(char s) ; 显示文本 main() {
char s[N],s1[N],ch; int i,result;
int gdriver, gmode; clrscr(); 清屏 init(); 初始化函数 while(1) {
setbkcolor(BLACK); 设置背景颜色 cleardevice();清屏 play(); 发牌
gotoxy(1,15); 移动光标
printf(\ printf(\enter express accroding to above four number\\n\提示信息
printf(\提示输入字符串格式 printf(\ scanf(\输入字符串压回车键
change(s1,s); 调用change函数将中缀表达式s1转换为后缀表达式s result=computer(s); 计算后缀表达式的值,返回结果result
if(result==24) 如果结果等于24 text1(\调用函数text1显示字符串\ else text1(\否则函数text1显示字符串\ printf(\提示信息,是否继续 scanf(\输入一字符
if(ch=='n'||ch=='N') 如果该字符等于n或N break; 跳出循环,程序结束 } 否则,开始下一轮循环 close(); return; 返回 }
void rand1(int j)随机发牌函数 {
int kind,num; char str[3],n; randomize();
while(1)循环直到有牌发 {
kind=random(4); 花色随机数 num=random(13); 大小随机数
if(p[kind][num]!=-1) 该数未取过 { n=p[kind][num]; 取相应位置的扑克牌数 p[kind][num]=-1; 牌发好以后相应位置的元素置-1 break; } }
switch(kind)花式的判断 {
case 0:setcolor(RED);sprintf(str,\红桃 case 1:setcolor(BLACK);sprintf(str,\黑桃 case 2:setcolor(RED);sprintf(str,\方片 case 3:setcolor(BLACK);sprintf(str,\草花 }
settextstyle(0,0,2);
outtextxy(COL+j100-30,ROW+100-46,str);显示左上角花色 outtextxy(COL+j100+16,ROW+100+32,str); 显示右下角花色 if(n!='0')输出其他牌 {
settextstyle(0,0,3); sprintf(str,\
outtextxy(COL+j100-5,ROW+100-5,str);显示牌的大小 }
else输出10的时候 {
sprintf(str,\
outtextxy(COL+j100-6,ROW+100-5,str); } }
void play(void)发牌的具体过程 {
int j;
for(j=0;j<4;j++) {
bar(COL+j100-35,ROW+100-50,COL+j100+35,ROW+1100+50);画空牌 setcolor(BLUE);
rectangle(COL+j100-32,ROW+100-48,COL+j100+32,ROW+100+48); 画矩形框
rand1(j); 随机取牌 delay(10000); 延时显示 } }
void init(void)图形驱动 {
int gd=DETECT,gm;
initgraph(&gd,&gm,\ cleardevice(); }
void close(void)图形关闭 {
closegraph(); }
void change(char e,char a) 中缀字符串e转后缀字符串a函数 {
STACK2 top=NULL; 定义栈顶指针 int i,j;char w; i=0; j=0;
while(e[i]!='\\0') 当字符串没有结束时 {
if(isdigit(e[i])) 如果字符是数字 { do{ a[j]=e[i]; 将数字原样拷贝到数组a中 i++; e数组的下标加1 j++; a数组的下标加1 }while(e[i]!='.'); 直到字符为数字结束符“.”为止