#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"dos.h"
#define KEY_P 0x1970
#define KEY_R 0x1372
#define KEY_Y 0x1579
#define KEY_ENTER 0x1c0d
#define KEY_ESC 0x11B
#define card_size 10 //牌体大小
int main()
{
void put_card(int color,int number,int card_x,int card_y);/*color:0背景牌3红
桃4方片5米花6黑桃,number:1到13,card_x,y:扑克左上角位置坐标*/ void put_player_info(int pc_pl,int score,int win,int info_x,int info_y);//pc_pl电脑_人,score分数,win0电脑赢,1人赢,xy画图位置
void game_again(int player_score[],int card_info[]);
int pc_pl_bet(int z[]);
void GAME_OVER();
void game_control(int player_bet_money[],int y[]);
void information();
void state();//声明函数
int card_color_number[12]={0,0,0,0,0,0,0,0,0,0,0,0};
int player_money[2]={1000,1000};
game_again(player_money,card_color_number);//初始化扑克,花色,钱game_control(player_money,card_color_number);
return 0;
}
void game_again(int player_score[],int card_info[])
{
int i;//i控制循环,对应按键扫描码
srand((unsigned)time(NULL));//随机数起点
for(i=0;i<12;i=i+2)
{
card_info[i]=rand()%4+3;//随机产生花色
card_info[i+1]=rand()%13+1;//随即产生数值
}
put_card(0,0,10,2);
put_card(0,0,19,2);
put_card(0,0,28,2);//打印背景牌
put_player_info(0,player_score[0],1,37,2);//打印小电脑
put_card(card_info[6],card_info[7],10,11);
put_card(card_info[8],card_info[9],19,11);
put_card(card_info[10],card_info[11],28,11);//利用函数调用,打印任意位置,任意大小,任意花色的扑克
put_player_info(1,player_score[1],1,37,11);//打印小孩
}
void state()
{
window(30,21,60,21);
textcolor(BLACK);
textbackground(WHITE);
clrscr();
}
void game_control(int player_bet_money[],int y[])
{
int ch,bet_money;
int win;
while(1)
{
information();
ch=bioskey(0);//得到按键
switch(ch)
{
case KEY_P:
{
state();
printf("Restart the game?(KEY P again)");
ch=bioskey(0);
if(ch==KEY_P)
{
player_bet_money[0]=1000;
player_bet_money[1]=1000;
game_again(player_bet_money,y);
}
else
{
delline();
gotoxy(1,1);
}
}
break;//按P键重新开始游戏
case KEY_R:
{
state();
printf("Fresh the cord?(KEY R again)");
ch=bioskey(0);
if(ch==KEY_R)game_again(player_bet_money,y);
else
{
delline();
gotoxy(1,1);
}
}
break;//按R键重新发牌
case KEY_ENTER:
state();
printf("Bet?(KEY ENTER again)");
ch=bioskey(0);
if(ch==KEY_ENTER)
{
state();
printf("How Much:");
scanf("%d",&bet_money);
win=pc_pl_bet(y);
if(win==0){player_bet_money[0]+=bet_money;player_bet_money[1]-=bet_m oney;}
else
if(win==1){player_bet_money[1]+=bet_money;player_bet_money[0]-=bet_money; }
else{state();printf("Dogfall");}
put_player_info(0,player_bet_money[0],win,37,2);//打印小电脑
put_player_info(1,player_bet_money[1],win,37,11);//打印小孩
getch();
game_again(player_bet_money,y);
if((player_bet_money[0]<=0)||(player_bet_money[1]<=0)||(player_bet_money[ 0]>=2000)||(player_bet_money[1]>=2000))
GAME_OVER(player_bet_money);
}
else
{
delline();
gotoxy(1,1);
}
}
break;//按ENTER键下注,并比出结果
case KEY_ESC://按两次ESC键退出游戏
{
state();
printf("End the game?(KEY ESC again)");
ch=bioskey(0);
if(ch==KEY_ESC)exit(0);
else
{
delline();
gotoxy(1,1);
}
}
}
}
}
int pc_pl_bet(int z[])
{
int pc_pl;
int i,j;
put_card(z[0],z[1],10,2);
put_card(z[2],z[3],19,2);
put_card(z[4],z[5],28,2);//打印电脑牌
for(i=1;i<6;i+=2)
for(j=1;j<6-i;j+=2)
{
if(z[j] { pc_pl=z[j]; z[j]=z[j+2]; z[j+2]=pc_pl;//排列电脑三张牌 if(z[j+6] { pc_pl=z[j+6]; z[j+6]=z[j+8]; z[j+8]=pc_pl;//排列玩家三张牌 } } if(z[0]==z[2]&&z[2]==z[4])z[0]=4;else z[0]=0; if(z[6]==z[8]&&z[8]==z[10])z[6]=4;else z[6]=0;//同花顺,牌权放在z[0]、z[6]中 z[2]=z[1]-z[3];z[4]=z[3]-z[5];z[8]=z[7]-z[9];z[10]=z[9]-z[11]; if(z[2]==0&&z[4]==0)z[0]=16;if(z[8]==0&&z[10]==0)z[6]=16; if(z[2]==1&&z[4]==1)z[0]+=8;if(z[8]==1&&z[10]==1)z[6]+=8; if((z[2]&&z[4])==0)z[0]+=2;if((z[8]&&z[10])==0)z[6]+=2; if((z[2]*z[4])>1)z[0]+=2;if((z[8]*z[10])>1)z[6]+=2; if(z[0]>z[6])return 0; else if(z[0] else { if((z[0]==16)||(z[0]==12)||(z[0]==8))//比“炸”比“顺连”比“连” if(z[1]>z[7])return 0; else return 1; }//当牌权相等时候,判断,待完~ if(z[0]==6)//比“顺对” { if(z[1]>z[7])return 0; else return 1; } if(z[0]==2)//比“对” { if(z[1]>z[7])return 0; else return 1; } if(z[0]==1)//比“单” { if(z[1]>z[7])return 0; else if((z[1]==z[7])&&(z[3]>z[9]))return 0; else if((z[1]==z[7])&&(z[3]==z[9])&&(z[3]>z[9]))return 0; else if((z[1]==z[7])&&(z[3]==z[9])&&(z[3]==z[9]))return 3; else return 1; } } } void put_player_info(int pc_pl,int score,int win,int info_x,int info_y)//pc_pl电脑_人,score钱,win0电脑赢,1人赢,xy画图位置 { window(info_x,info_y,info_x+card_size-1,info_y+card_size-2); textcolor(BLACK); textbackground(WHITE); clrscr(); if(pc_pl==0) { cprintf(" ______"); gotoxy(1,2); cprintf(" | ____ |"); gotoxy(1,3); if(win==0) cprintf(" || $$ ||"); else cprintf(" || ||"); gotoxy(1,4); cprintf(" ||____||"); gotoxy(1,5); cprintf(" | _____|"); gotoxy(3,5); textcolor(RED); putch('*'); textcolor(BLACK); gotoxy(1,6); cprintf(" / \"\"\"\" \\"); gotoxy(1,7); cprintf("(________)"); gotoxy(1,8); cprintf("Money:%d",score); } else { gotoxy(1,2); cprintf(" _"); gotoxy(1,3); cprintf(" .' '."); gotoxy(1,4); if(win==1) cprintf(" / $ $ \\"); else cprintf(" / o o \\"); gotoxy(1,5); cprintf("( (_ )"); gotoxy(1,6); cprintf(" \\ _ /"); gotoxy(1,7); cprintf(" `._.'"); gotoxy(1,9); cprintf("Money:%d",score); } } void GAME_OVER(int player_end_money[]) { int ch; int money[2]={1000,1000},y[12]={0,0,0,0,0,0,0,0,0,0,0,0}; window(1,1,80,25); textcolor(RED); textbackground(WHITE); clrscr(); gotoxy(10,4); printf("---------------------"); gotoxy(10,6); printf("COM %d",player_end_money[0]); gotoxy(10,8); printf("---------------------"); gotoxy(10,10); printf("YOU %d",player_end_money[1]); gotoxy(10,12); printf("---------------------"); gotoxy(16,16); printf("Play Again?(ENTER)"); ch=bioskey(0); if(ch==KEY_ENTER) game_again(money,y); else { printf("Thank You for palying!\nPress anykey to exit."); getch(); } } void put_card(int color,int number,int card_x,int card_y)/*color:0背景牌3红桃4方片5米花6黑桃,number:1到13,card_x,y:扑克左上角位置坐标*/ { int i,j; textmode(C80); window(card_x,card_y,card_x+card_size-1,card_y+card_size-2);//window(x1,y1, x2,y2) textcolor(BLACK); textbackground(WHITE); clrscr(); /*下面程序段输出纸牌边框*/ gotoxy(1,1); putch(0xda);/*定位并输出纸牌左上角图形字符*/ for(i=2;i { gotoxy(i,1);/*定位光标*/ putch(0xc4);/*输出横线字符*/ } gotoxy(card_size-1,1); putch(0xbf);/*定位并输出纸牌右上角图形字符*/ for(i=2;i { gotoxy(1,i); putch(0xb3);/*输出左边框*/ gotoxy(card_size-1,i); putch(0xb3);/*输出右边框*/ } gotoxy(1,card_size-1); putch(0xc0);/*定位并输出纸牌左下角图形字符*/ for(i=2;i putch(0xc4);/*输出横线字符*/ } gotoxy(card_size-1,card_size-1); putch(0xd9);/*定位并输出纸牌右下角图形字符*/ if((color==3)||(color==4))textcolor(RED); else if((color==5)||(color==6))textcolor(BLACK); else { for(i=2;i for(j=2;j { textcolor(BLUE); gotoxy(i,j); putch(6);/*输出背景*/ } }/*输出纸牌颜色,红桃方片为红色,黑桃米花为黑色,0时候打印背景牌*/ if((number<10)&&(number>1))/*输出纸牌number*/ { gotoxy(2,2); putch(number+48);/*输出左上角的文字*/ gotoxy(card_size-2,card_size-2); putch(number+48);/*输出右下角的文字*/ } else if(number==1) { gotoxy(2,2); putch(65); gotoxy(card_size-2,card_size-2); putch(65); } else if(number==10) { gotoxy(2,2); putch(49); gotoxy(3,2); putch(48); gotoxy(card_size-3,card_size-2); putch(49); gotoxy(card_size-2,card_size-2); putch(48); } else if(number==11) { gotoxy(2,2); putch(74); gotoxy(card_size-2,card_size-2); putch(74); } else if(number==12) { gotoxy(2,2); putch(81); gotoxy(card_size-2,card_size-2); putch(81); } else if(number==13) { gotoxy(2,2); putch(75); gotoxy(card_size-2,card_size-2); putch(75); } //else printf(" Over number"); /*下面程序段输出color*/ if(color!=0) { gotoxy(2,3); putch(color); gotoxy((card_size+1)/2,(card_size+1)/2); putch(color); gotoxy(card_size-2,card_size-3); putch(color); } } void information() { window(50,2,60,19); textcolor(BLACK); textbackground(WHITE); clrscr(); cprintf("Information"); cprintf("==========="); }