如何用C语言制作24点游戏程序?
#定义N 20
#定义COL 100
#定义第40行
#包含“stdio.h”
#include "time.h" /*系统时间函数*/
#include "graphics.h" /*图形功能*/
#include "alloc.h"/*动态地址分配函数*/
#include "stdlib.h" /*库函数*/
#include "string.h" /*字符串函数*/
#include "ctype.h" /*字符操作函数*/
char p[4][13]={
{'a ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 ',' 0 ',' j ',' q ',' k'},/*扑克,10。
{'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结构节点
{
int数据;
结构节点*链接;
} stack 1;/*堆栈1*/
typedef结构节点2
{
char数据;
struct node2 * link
} STACK2/*堆栈2*/
void init(void);/*图形驱动程序*/
void close(无效);/*图形关闭*/
void play(无效);/*许可的具体流程*/
void rand 1(int j);/*随机交易功能*/
void change(char *e,char * a);/*中缀后缀函数*/
int计算机(char * s);/*后缀表达式计算函数*/
stack 1 * init stack 1(stack 1 * top);/*堆栈1的初始化*/
stack 1 * push(stack 1 * top,int x);/*堆栈1堆栈操作*/
stack 1 * pop(stack 1 * top);/* Stack 1删除栈顶元素*/
int topx(stack 1 * top);/* Stack 1读取堆栈的顶部元素*/
stack 1 * ptop(stack 1 * top,int * x);/* Stack 1读取堆栈顶部元素的值,并删除堆栈顶部元素*/
int empty(stack 1 * top);/*判断堆栈1是否为空函数*/
stack 2 * init stack 2(stack 2 * top);/*堆栈2初始化*/
STACK2 *push2(STACK2 *top,char x);/*堆叠2堆叠操作*/
stack 2 * pop 2(stack 2 * top);/* Stack 2删除堆栈的顶部元素*/
char top x2(stack 2 * top);/*堆栈2读取堆栈的顶部元素*/
STACK2 *ptop2(STACK2 *top,char * x);/* Stack 2读取顶部元素的值并删除顶部元素*/
int empty 2(stack 2 * top);/*判断栈2是否为空函数*
int text 1(char * s);/*显示文本*/
主()
{
char s[N],s1[N],ch;
int i,result
int gdriver,gmode
clr SCR();/*清空屏幕*/
init();/*初始化函数*/
while(1)
{
setbkcolor(黑色);/*设置背景颜色*/
clear device();/*清空屏幕*/
play();/*许可*/
gotoxy(1,15);/*移动光标*/
printf("-Note-\ n ");
printf("请根据以上四个数字输入快递\ n ");/*提示信息*/
printf("格式如下:2。*(5.+7.)\ n”);/*提示字符串格式*/
printf("-\ n ");
scanf("%s%c ",s1,& ampch);/*输入字符串并按Enter */
change(s1,s);/*调用change函数将中缀表达式s1转换为后缀表达式s*/
结果=计算机;/*计算后缀表达式的值并返回结果*/
If(result==24) /*如果结果等于24*/
text1("很好");/*调用函数text1显示字符串“非常好”*/
其他
text1("错!!!");/*否则,函数text1显示字符串“错误!!!"*/
printf("继续(y/n)?\ n ");/*提示信息,是否要继续*/
scanf("%c ",& ampch);/*输入一个字符*/
If(ch=='n'||ch=='N') /*如果字符等于N或N*/
打破;/*跳出循环,程序结束*/
}/*否则,开始下一个循环*/
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[种类][数量];/*取相应位置的扑克牌数量*/
p[kind][num]=-1;/*发牌后,相应位置的元素设置为-1*/
打破;
}
}
Switch(kind)/*花式判断*/
{
案例0:setcolor(红色);sprintf(str," %c ",3);打破;/*红心*/
案例1:setcolor(黑色);sprintf(str," %c ",3);打破;/*黑桃*/
案例二:setcolor(红色);sprintf(str," %c ",4);打破;/*正方形*/
案例三:setcolor(黑色);sprintf(str," %c ",5);打破;/*草花*/
}
settextstyle(0,0,2);
outtextxy(COL+j*100-30,ROW+100-46,str);/*在左上角显示颜色*/
out textxy(COL+j * 100+16,ROW+100+32,str);/*在右下角显示颜色*/
如果(n!='0')/*输出其他卡片*/
{
settextstyle(0,0,3);
sprintf(str," %c ",n);
outtextxy(COL+j*100-5,ROW+100-5,str);/*显示卡片的大小*/
}
Else/*输出10时*/
{
sprintf(str," %d ",10);
outtextxy(COL+j*100-6,ROW+100-5,str);
}
}
Void play(void)/*发牌的具体流程*/
{
int j;
for(j = 0;j & lt4;j++)
{
bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1 * 100+50);/*抽空牌*/
setcolor(蓝色);
矩形(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);/*画一个矩形框*/
rand 1(j);/*随机选卡*/
延时(10000);/*延迟显示*/
}
}
Void init(void)/*图形驱动程序*/
{
int gd=DETECT,GM;
init graph(& amp;gd,& ampgm," c:\ \ TC ");
clear device();
}
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(is digit(e[I])/*如果字符是数字*/
{
做{
a[j]= e[I];/*按原样将数字复制到数组A中*/
i++;下标到/*e数组加1*/
j++;/*数组的下标加上1*/
}while(e[i]!='.');/*直到字符是数字终止符。“*/
a[j]= ' . ';j++;/*复制数字终止符。“添加到A数组中,并且仍然保留结束标记*/
}
If (e [I] =' (')/*如果字符是"(" */
top=push2(top,e[I]);/*将其压入堆栈*/
If (e [I] =')')/*如果字符是")" */
{
top = ptop 2(top & amp;w);/*取出栈顶元素,从栈顶删除*/
而(w!=' (')/*如果字符不是'(' */
{
a[j]= w;/*在数组A中存储堆栈顶部的元素*/
j++;/*下标加1*/
top = ptop 2(top & amp;w);/*取出栈顶元素,从栈顶删除*/
}
}
If (e [I] ='+'|| e [I] ='-')/*如果字符是加号或减号*/
{
如果(!Empty2(top)) /*如果堆栈不为空*/
{
w=topx2(顶);
而(w!=' (')/*当栈顶元素不是'(' */
{
a[j]= w;
j++;/*将栈顶元素存储在表达式A中,加1*/
top = pop 2(top);/*删除栈顶元素*/
If(empty2(top)) /*如果堆栈为空*/
打破;/*跳出循环*/
其他
w=topx2(顶);/*否则读取堆栈的顶部元素*/
}
}
top=push2(top,e[I]);/*将当前e的字符元素压入堆栈*/
}
If (e [I] =' *' || e [I] ='/')/*如果字符是乘法或除法符号*/
{
如果(!Empty2(top)) /*如果堆栈不为空*/
{
w=topx2(顶);/*读取栈顶元素并将其存储在w中*/
当栈顶元素为乘法或除法时,While(w=='*'||w=='/')/*循环重复
{
a[j]= w;
j++;/*将栈顶元素存储在字符串A中,加1*/
top = pop 2(top);/*删除栈顶元素*/
If(empty2(top)) /*如果堆栈为空*/
打破;/*跳出循环*/
其他
w=topx2(顶);/*否则读取堆栈的顶部元素*/
}
}
top=push2(top,e[I]);/*将当前E字符元素压入堆栈*/
}
i++;下标到/*e加1*/
}
而(!Empty2(顶部))/*不为空时重复*/
top = ptop 2(top & amp;a[j++]);/*在数组A中存储栈顶元素*/
a[j]= ' \ 0 ';/*将字符串结束标记写入最后一个数组元素,形成一个字符串*/
}
Int computer(char *s) /*计算函数*/
{
stack 1 * top = NULL;
int i,k,num1,num2,result
I = 0;
while(s[i]!='\0') /*当字符串没有结束时,执行下列操作*/
{
if(is digit(s[I])/*判断字符是否为数字*/
{
k = 0;/* k的初始值是0*/
做{
k = 10 * k+s[I]--0;/*将字符连接成十进制数字*/
i++;/*i加1*/
}while(s[i]!='.');/*当字符不是“.”时重复循环*/
top=push(top,k);/*将生成的数字压入堆栈*/
}
If (s [I] ='+')/*如果是'+'*/
{
top = ptop(top & amp;num 2);/*取出栈顶元素,存放在num2 */
top = ptop(top & amp;num 1);/*取出栈顶元素,存入num1 */
结果= num 2+num 1;/*将num1和num2相加并存储在结果中*/
top=push(top,result);/*将结果压入堆栈*/
}
If (s [I] ='-')/*如果是'-'*/
{
top = ptop(top & amp;num 2);/*取出栈顶元素,存放在num2 */
top = ptop(top & amp;num 1);/*取出栈顶元素,存入num1 */
result = num 1-num 2;/*将num1减去num2的结果存储在Result */
top=push(top,result);/*将结果压入堆栈*/
}
If (s [I] =' *')/*如果是' *' */
{
top = ptop(top & amp;num 2);/*取出栈顶元素,存放在num2 */
top = ptop(top & amp;num 1);/*取出栈顶元素,存入num1 */
result = num 1 * num 2;/*将num1与num2的乘法结果存储在result */
top=push(top,result);/*将结果压入堆栈*/
}
If (s [I] ='/')/*如果是'/'*/
{
top = ptop(top & amp;num 2);/*取出栈顶元素,存放在num2 */
top = ptop(top & amp;num 1);/*取出栈顶元素,存入num1 */
result = num 1/num 2;/*将num1除以num2的结果存储在Result *中
top=push(top,result);/*将结果压入堆栈*/
}
i++;/*i加1*/
}
top = ptop(top & amp;结果);/*堆栈顶部最后一个元素的值是计算结果*/
返回结果;/*返回结果*/
}
Stack1 *初始化stack 1(stack 1 * top)/*初始化*/
{
top = NULL/*堆栈顶部指针设置为空*/
返回顶部;/*返回栈顶指针*/
}
stack 1 * push(stack 1 * top,int x)/*堆栈入口函数*/
{
stack 1 * p;/*临时指针类型是STACK1*/
p =(stack 1 *)malloc(sizeof(stack 1));/*申请STACK1大小的空间*/
If(p==NULL) /*如果p为空*/
{
printf("内存溢出\n!!");/*显示内存溢出*/
退出(0);/*退出*/
}
p->;数据= x;/*将值x保存到新空间*/
p->;link = top/*新节点的后继节点是当前栈顶指针*/
top = p;/*新的栈顶指针是新插入的节点*/
返回顶部;/*返回栈顶指针*/
}
栈1 * pop(栈1 * top)/*离栈*/
{
stack 1 * q;/*定义临时变量*/
q = top/*保存当前栈顶指针*/
top = top-& gt;链接;/*堆栈顶部的指针向后移动*/
免费(q);/*发布q*/
返回顶部;/*返回栈顶指针*/
}
Int topx(STACK1 *top) /*读取堆栈的顶部元素*/
{
If(top==NULL) /*堆栈是否为空*/
{
printf("Stack为null \ n ");/*显示堆栈为空的信息*/
返回0;/*返回整数0*/
}
返回顶部-& gt;数据;/*返回堆栈的顶部元素*/
}
Stack 1 * ptop(Stack 1 * top,int * x)/*获取栈顶元素并删除*/
{
* x = topx(top);/*读取栈顶元素*/
top=pop(顶);/*删除栈顶元素*/
返回顶部;/*返回栈顶指针*/
}
Int empty(STACK1 *top) /*判断堆栈是否为空*/
{
If(top==NULL) /* If empty */
返回1;/*返回1*/
其他
返回0;/*否则,0*/
}
Stack2 *初始化stack2 (stack2 * top)/*初始化*/
{
top = NULL/*堆栈顶部指针设置为空*/
返回顶部;/*返回栈顶指针*/
}
Stack 2 * push 2 (Stack 2 * top,char x)/* Stack函数*/
{
stack 2 * p;/*临时指针类型是STACK2*/
p =(stack 2 *)malloc(sizeof(stack 2));/*申请堆栈大小的空间2 */
If(p==NULL) /*如果p为空*/
{
printf("内存溢出\n!!");/*显示内存溢出*/
退出(0);/*退出*/
}
p->;数据= x;/*将值x保存到新空间*/
p->;link = top/*新节点的后继节点是当前栈顶指针*/
top = p;/*新的栈顶指针是新插入的节点*/
返回顶部;/*返回栈顶指针*/
}
STACK2 *pop2(STACK2 *top) /*超出堆栈*/
{
stack 2 * q;/*定义临时变量*/
q = top/*保存当前栈顶指针*/
top = top-& gt;链接;/*堆栈顶部的指针向后移动*/
免费(q);/*发布q*/
返回顶部;/*返回栈顶指针*/
}
Char topx2(STACK2 *top) /*读取栈顶元素*/
{
If(top==NULL) /*堆栈是否为空*/
{
printf("Stack为null \ n ");/*显示堆栈为空的信息*/
返回“”;/*返回空字符*/
}
返回顶部-& gt;数据;/*返回堆栈的顶部元素*/
}
Stack2 * ptop2 (stack2 * top,char * x)/*取栈顶元素并删除它*/
{
* x = top x2(top);/*读取栈顶元素*/
top = pop 2(top);/*删除栈顶元素*/
返回顶部;/*返回栈顶指针*/
}
Int empty2(STACK2 *top) /*判断堆栈是否为空*/
{
If(top==NULL) /* If empty */
返回1;/*返回1*/
其他
返回0;/*否则,0*/
}
int text1(字符)
{
setbkcolor(蓝色);/*将背景颜色设置为蓝色*/
clear device();/*清空屏幕*/
set color(12);/*将文本颜色设置为浅红色*/
settextstyle(1,0,8);/*三笔画字体,放大8倍*/
outtextxy(120,120,s);/*输出字符串s*/
setusercharsize(2,1,4,1);/*水平放大2倍,垂直放大4倍*/
set color(15);/*将文本颜色设置为*白色/
settextstyle(3,0,5);/*无行间笔画,放大5倍*/
outtextxy(220,220,s);/*输出字符串s*/
getch();/*在键盘上输入任意字符*/
返回;/* Return */
}