上一篇文章已经实现了如何识别花色和点数,这篇文章主要是用QT给程序加一个可视化界面。
由于我之前完全没有接触过QT,所以编写出来的界面很丑,QT在VS里自带一个界面设计师,类似于下图,编写个界面还是很方便的,对相关的控制直接写响应函数就可以了。
添加菜单和标签栏
实现一个从本地文件选取一张要识别的效果
对扑克牌进行识别,调用到前两章写到的函数
对识别结果进行显示
最后的效果如下
多张有些误差,将红桃10识别成了红桃9,梅花7识别成了黑桃7,其余正确,因为模板数量较小的问题,所以这个误差我还是可以接受的。
到这就完成了整个小程序的开发。现将程序的源码链接放在下面
//downloadcsdnnet/download/fyueqiao/12072016
1电子扑克牌是一种基于电脑技术的游戏,使用计算机程序来模拟扑克牌的行为。
2电子扑克牌的程序通常由一系列的算法组成,用于模拟现实中扑克牌的行为,包括洗牌、发牌、比牌等。
3洗牌算法可以帮助洗牌,让牌更加随机,以此来模拟真实洗牌过程。
4发牌算法可以帮助发牌,让牌更加安全,以此来模拟真实发牌过程。
5比牌算法可以模拟不同玩家之间的比牌过程,以此来判断谁赢得最终的比赛。
6扑克牌游戏程序还可以实现更多的功能,比如支持实时聊天功能,以及支持更多的游戏模式等等。
#include<iostream>
#include<string>
using namespace std;
struct puke
{
string str;
puke next;
};
struct puke creat(void)
{
int i;
struct puke head,p,q;
p=new puke;
head=p;
q=p;
cin>>p->str;
for(i=0;i<25;i++)
{
q=p;
p=new puke;
cin>>p->str;
q->next=p;
}
q=q->next;
q->next=NULL;
return head;
}
struct puke last(struct pukehead)
{
while(head->next!=NULL)
{
head=head->next;
}
return head;
}
/void display(struct puke head)
{
while(head!=NULL)
{
cout<<head->str;
head=head->next;
}
} /
int main()
{
puke head1,last1,head2,last2;
puke p1,p2,q1,q2;
int i,j=0,k=0,n=0,m;
bool flag;
head1=creat();
head2=creat();
p1=head1;
p2=head2;
last1=last(head1);
last2=last(head2);
// display(head1);
string str[52];
for(i=0;;i++)
{
if(i%2==0)
{
str[n]=p1->str;
p1=p1->next;
flag=0;
}
else
{
str[n]=p2->str;
p2=p2->next;
flag=1;
}
m=n;
cout<<str[n]<<endl;
n++;
for(j=0;j<m;j++)
{
if(str[m]==str[j])
{
k=m;
n=j;
// cout<<m<<" "<<k<<" "<<n<<" "<<flag<<endl;
if(flag==0)
{
for(j;j<=k;j++)
{
last1->next=q1;
q1=new puke;
q1->str=str[j];
last1=q1;
str[j]='0';
}
last1->next=NULL;
}
if(flag==1)
{
for(;j<=k;j++)
{
last2->next=q2;
q2=new puke;
q2->str=str[j];
last2=q2;
str[j]='0';
}
last2->next=NULL;
}
continue;
}
}
if(p1==NULL||p2==NULL)
{
break;
}
}
// cout<<i<<endl;
if(p1==NULL)
cout<<"Bob"<<endl;
else
cout<<"Alice"<<endl;
return 0;
}
自己电脑上测试可以。。求采纳。
#include "stdioh"
#include "stdlibh"
#include "timeh"
int main()
{
//黑桃:spade,红心:hearts,草花:flower,方块:diamonds
//King(大王)、Tetrarch(小王)
//2、3、4、5、6、7、8、9、10、J、Q、K、A
char poker[54] = {"S2","S3","S4","S5","S6","S7","S8","S9","S10","SJ","SQ","SK","SA",
"H2","H3","H4","H5","H6","H7","H8","H9","H10","HJ","HQ","HK","HA",
"F2","F3","F4","F5","F6","F7","F8","F9","F10","FJ","FQ","FK","FA",
"D2","D3","D4","D5","D6","D7","D8","D9","D10","DJ","DQ","DK","DA",
"Tetrarch","King"};
int num[54];
//获取随机数 存储至数组num中
int i = 0;
//使用当前时间作为随机数种子来获取真正的随机数
time_t t;
srand((unsigned) time(&t));
while (1)
{
int temp = rand()%54;
int ret=0;
for (int j=0;j<i;j++)
{
if (temp==num[j])
{
ret = 1;
break;
}
}
if (ret == 0)
{
num[i++] = temp;
}
if (i==54)
{
break;
}
}
//输出扑克牌,每4张换行一次
for (int k=0;k<54;k++)
{
if(k%4 == 0)
printf("\n");
printf("%s ",poker[num[k]]);
}
return 0;
}
输入效果:
D4 King H5 D3
SQ F6 FQ S4
FJ SK S9 F9
HA S7 S10 H10
D8 HK H3 HJ
F8 HQ D10 H7
F5 H6 S3 SA
DA D2 H4 H9
D6 DK D9 S5
S6 S8 F4 DJ
FA F3 S2 Tetrarch
D5 FK F2 DQ
F10 H2 F7 H8
SJ D7 请按任意键继续
#include<conioh>
#include<timeh>
#include<stdioh>
#include<stdlibh>
int jisuan(int);
int comptotal;
char s1[]="A234567890JQK";
//char s2[4][5]={"红桃","黑桃","草花","方块"};
char s2[4]={3,4,5,6};
int poke[52];
int ch;
int win=0;
int computer[5],user[5];
int usertotal;
int users;
int k;
int main()
{ void xipai(int poke[]);
void ai();
int i,j;
////////////////////////////////////////////////////////上面是变量和声明
printf("\n这是简单的廿一点游戏:\n");
for(i=0;i<52;i++)
{
if(i%13==0)putchar('\n');
poke[i]=i;
printf("%c%c%c ",s2[i/13],s1[i%13]=='0''1':' ',s1[i%13]);
}
putchar('\n');
/////////////////////////////////////////////////////////主代码
k=0;
xipai(poke);
while(ch!=27)
{ comptotal=0;
usertotal=0;
if(k>=42)
{
printf("\n剩余牌数不足十张,重新洗牌");
xipai(poke);
k=0;
}
printf("\n\n\n\n\n\n\n\n新局开始:\n");
printf("现在共有牌%2d张\n",52-k);
if(win==0)
{
computer[0]=k++;
user[0]=k++;
printf("\n电脑做庄,要牌:");
ai();
}
else
{
printf("\n玩家做庄,要牌:\n\t回车要牌\n\t空格过牌");
user[0]=k++;
computer[0]=k++;
}
printf("\n玩家开始要牌:\n");
usertotal=jisuan(poke[user[0]]);
printf("%c%c%c 共%2d点\t",s2[poke[user[0]]/13],s1[poke[user[0]]%13]=='0''1':' ',s1[poke[user[0]]%13],usertotal);
users=0;
ch=1;
while(ch!=32&&users<4)
{
ch=getch();
switch(ch)
{
case 27:
goto end;
break;
case 32:
break;
case 13:
user[++users]=k;
usertotal+=jisuan(poke[user[users]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d点\t",s2[poke[k]/13],s1[poke[k]%13]=='0''1':' ',s1[poke[k]%13],usertotal);
k++;
if(usertotal>=21)ch=32;
break;
default:
break;
}
}
if(win==1)
{
printf("\n电脑开始要牌:\n");
ai();
}
printf("\n\n\n玩家的点数是%2d",usertotal);
printf("\n电脑的点数是%2d",comptotal);
printf("\n\n本局结算:");
if(comptotal>21&&usertotal<=21)
{
printf("\n\n电脑爆牌了");
win=1;
printf("\n恭喜,你赢了");
}
if(usertotal>21&&comptotal<=21)
{
printf("\n\n你爆牌了");
printf("\n下次小心点");
win=0;
}
if(usertotal>21&&comptotal>21)
{
printf("\n\n你们两个,怎么都这么不小心啊,都撑死了还要吗");
}
if(usertotal<=21&&comptotal<=21)
{
if(usertotal>comptotal)
{
win=1;
printf("\n\n不错,你赢了");
}
else if(usertotal<comptotal)
{
win=0;
printf("\n\n撑死胆大的,饿死胆小的,没胆子,输了吧");
}
else
printf("\n\n平了,算你走运");
}
getch();
}
end:
return 0;
}
void xipai(int poke[])
{
int y,tmp,i,j;
for(j=0;j<7;j++)
for(i=0;i<52;i++)
{
srand(time(0));
y=rand()%10;
tmp=poke[i];
poke[i]=poke[(yii)%52];
poke[(yii)%52]=tmp;
}
}
///////////////////////////////////////////////子函数
void ai()
{
int i;
comptotal=jisuan(poke[computer[0]]);
printf("\n%c%c%c 共%2d点\t",s2[poke[computer[0]]/13],s1[poke[computer[0]]%13]=='0''1':' ',s1[poke[computer[0]]%13],comptotal);
for(i=0;i<4;i++)
{
if(comptotal<17)
{
computer[i+1]=k++;
comptotal+=jisuan(poke[computer[i+1]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d点\t",s2[poke[computer[i+1]]/13],s1[poke[computer[i+1]]%13]=='0''1':' ',s1[poke[computer[i+1]]%13],comptotal);
}
}
}
int jisuan(int i)
{int dian;
switch(i%13)
{
case 0:
case 10:
case 11:
case 12:
dian=1;
break;
default:
dian=i%13+1;
}
return dian;
}
用字符串解决此题更简单易懂!!!
用abcdefghijklm依次代表1234567890jqk
下面是程序:
var
st,st1,st2:string;
i:integer;
begin
st:='abcdefghijklm';
while length(st)>1 do begin
st:=copy(st,2,length(st)-1);
st1:=copy(st,1,1);
st2:=copy(st,2,length(st)-1);
st:=st2+st1;
end;
writeln(st);
writeln;
st:='m';
for i:=1 to 12 do begin
st1:=copy(st,length(st),1);
if length(st)<>1 then st2:=copy(st,1,length(st)-1) else st2:='';
st:=st1+st2;
st:=chr(12-i+ord('a'))+st;
end;
writeln(st);
end
以上就是关于写一个识别扑克牌花色和点数的小程序(三)全部的内容,包括:写一个识别扑克牌花色和点数的小程序(三)、电子扑克牌原理、c/c++扑克牌游戏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)