`
sylinx_yqg
  • 浏览: 140646 次
  • 性别: Icon_minigender_1
  • 来自: 福建 漳州
社区版块
存档分类
最新评论

学习c时写的出牌游戏

阅读更多
主要学习c在DOS下如何驱动鼠标.
 #include<graphics.h>
 #include<stdio.h>
 #include<time.h>
 #include<dos.h>
 #define CARDCOLOR 5
 #define XP 500 /*显示牌的地方,可通过该值来改变*/
 #define YP 400
 #define NUMBER 17 /*没人牌的个数*/
 #define BKCOLOR 1

static int xnow=300,ynow=250,button=0;/*定义全局变量,保存鼠标信息*/
static cursoron[16][16],pattrib[16][16];/*定义全局变量,保存经过的各点信息*/
static int calbutton=0,outnumber=0;
/***************************************
定义54张牌
****************************************/
struct card
{
  int figure;
  int symbol;
  int flag[5];
}cards[54],outcards[17],player1[17],outcomputer[17];

/***************************************
初始化54张牌
****************************************/
void initcard()
{
 register int i=0;
	for(i=0;i<52;i++)
           {
             cards[i].figure=(i+1)%13;
	     cards[i].symbol=(i)/13 + 3;
             cards[i].flag[0]=0;
             cards[i].flag[1]=0;
	     cards[i].flag[2]=0;
	     }
  cards[52].figure=14;
  cards[53].figure=14;
  cards[52].symbol=1;
  cards[53].symbol=2;
}
/***************************************
洗牌,利用发生器产生随机数,做250次对换
****************************************/
void washcard()
 {
    register int i;
    struct card temp;
    int j=0,k=0;
    srand(time(NULL));
    	for(i=0;i<500;i++)
         {
           j=rand() % 54;
           k=rand() % 54;
	   temp=cards[j];
           cards[j]=cards[k];
           cards[k]=temp;
          }
 }
/*************************************
 牌的框架
 **************************************/
 void box(int xposition,int yposition,int n)
 {
 		int i=0;
			 for(i=0;i<n;i++)
 	        {
			setcolor(CARDCOLOR);
			bar3d(xposition-25*i,yposition-100,xposition-
                              25*(i+1),yposition,1,1);

		      }
	}


/***************************************
显示54张牌
****************************************/

void showcard(struct card *p,int n,int x, int y)
 {
   int i=0,m;
   char buff[3];
   m=n;
   box(x,y,m);
   	for(i=0;i<n;i++,p++)
           {

	     sprintf(buff,"%c%d",p->symbol,p->figure);
	     outtextxy(x-22-25 * i,y-90,buff);

	    sprintf(buff,"%d",p->flag[0]);
	     outtextxy(x-22-25 * i,y-80,buff);

             sprintf(buff,"%d",p->flag[1]);
	     outtextxy(x-22-25 * i,y-70,buff);

             sprintf(buff,"%d",p->flag[2]);
	     outtextxy(x-22-25 * i,y-60,buff);
           }
}
/***********************************************
对54张牌进行从小到大排列,并将没张牌的信息保存
***********************************************/
  void sortcard(struct card p[])
 {
   register int i=0,j=0;
   int flag=0;
   struct card t;
	for(i=0; i< 17;i++)

	  {   flag=0;
	       for(j=0;j<17-i-1;j++)
              {
		if(p[j].figure >= p[j+1].figure)
                  {
		      t=p[j];
                      p[j]=p[j+1];
		      p[j+1]=t;
		     flag=1;
                   }
               }
	    if(flag==0) break;
             }
       for(i=17; i<33;i++)

	  {   flag=0;
	       for(j=0;j<33-i-1;j++)
              {
		if(p[j].figure >= p[j+1].figure)
                  {
		      t=p[j];
                      p[j]=p[j+1];
		      p[j+1]=t;
		     flag=1;
                   }
               }
	    if(flag==0) break;
             }
        for(i=34; i<50;i++)

	  {   flag=0;
	       for(j=0;j<50-i-1;j++)
              {
		if(p[j].figure >= p[j+1].figure)
                  {
		      t=p[j];
                      p[j]=p[j+1];
		      p[j+1]=t;
		     flag=1;
                   }
               }
	    if(flag==0) break;
             }
  }

/***************************************
将每张牌所能组成的一条龙张数表示出来
****************************************/
int longer(struct card p[],int m,int number)
/*返回第一张牌的最长接龙,m表示第M张牌,m表示总共的张数*/
{
   int mark=1,j=0;
   	for(j=m;j<number;j++)
            {

              if((p[j].figure == p[j+1].figure-1) && (j+1)<number)
                 mark=mark+1;
              else
                   {if((p[j].figure == p[j+1].figure) && (j+1)<number) continue;
                    else break;
                   }

             }
     return mark;
}
/***************************************
对牌进行扫描,将一组牌所能组成的
一条龙张数表示出来
****************************************/
void inforcard(struct card p[],int num)
  {
    register int i=0;
    int len=0,j=0,tem=0;
    	for(i=0;i< num;i++)
            {
               if( p[i].figure == p[i+1].figure && p[i+1].figure == p[i+2].figure
                       && p[i+2].figure == p[i+3].figure && i+3<num)
                  {
                    p[i].flag[0]=4;
                    p[i+1].flag[0]=4;
                    p[i+2].flag[0]=4;
                    p[i+3].flag[0]=4;
                    i=i+3;
                   }
                 else
                     if( p[i].figure == p[i+1].figure && p[i+1].figure == p[i+2].figure
                             && i+2<num)
                        {
                         p[i].flag[0]=3;
                         p[i+1].flag[0]=3;
                         p[i+2].flag[0]=3;
                         i=i+2;
                        }
                      else
                           if( p[i].figure == p[i+1].figure && i+1<num)
                           {
                            p[i].flag[0]=2;
                            p[i+1].flag[0]=2;
                            i=i+1;
                           }
               }
           for(i=0;i<num;i++)
            {
               tem=0;
               len=longer(cards,i,num); /*牌的长度*/
               j=i;
               while(j<i+len)
                 {
		   p[i+tem].flag[1]=len;
		   if(p[i+tem].figure!=p[i+tem+1].figure) j=j+1;
                   tem++;
                  }

	       i=i+tem-1;    /*i会再加1*/
             }
  }
/*************************************
 初始为图形模式
 **************************************/
  initgraphs()
 {
  int gd=DETECT,gm=12;
  registerbgidriver(EGAVGA_driver);
  initgraph(&gd,&gm,"\\tc");
 }

/*************************************
 将数组转换为而进制
 **************************************/

void change(long q[])
{
   int i=0,j=0;
	for(i=0;i<16;i++)
           {
             for(j=0;j<16;j++)
               {
                 cursoron[i][j]=q[i]%2;
                 q[i]=q[i]/2;

                 }
             }
 }
/*************************************
 鼠标的位图
 **************************************/
void initcursor()
{


   long oncursor[16]=
   {

    0xC000,0xA000,0x9000,0x8800,
    0x8400,0x8200,0x8100,0x8080,
    0x8040,0x89E0,0x9100,0xA880,
    0xC440,0x8220,0x01F0,0x0000
   };

  change(oncursor);
}
/*****************************************
 用来画鼠标,并保存鼠标所在地方的点的信息
 *****************************************/

void on_mouse(xnow,ynow)
{
  int i=0,j=0;
   	for(i=0;i<16;i++)

               for(j=0;j<16;j++)
                    {
		      pattrib[i][j]=getpixel(xnow+i,ynow+j);
                      if(cursoron[i][j]==1)
		      putpixel(xnow+i,ynow+j,10);
                    }
}
/*************************************
 将原来的鼠标隐藏,还原原来的点的值
 **************************************/
void off_mouse(xnow,ynow)
 {
   int i=0,j=0;
     	for(i=0;i<16;i++)
            for(j=0;j<16;j++)

		putpixel(xnow+i,ynow+j,pattrib[i][j]);

 }

/*************************************
 鼠标复位
 **************************************/
 char InitMs()
{
  union REGS Inr, Outr;
  Inr.x.ax=0;
  int86(0x33,&Inr,&Outr);
  if(Outr.x.ax==0) return 0;
  else return 1;
}


/*************************************
 判断鼠标是否移动
 **************************************/

int movemouse()
{
  int x0,y0,but0;
  union REGS rin;
  rin.x.ax=3;
  int86(0x33,&rin,&rin);
  x0=rin.x.cx;
  y0=rin.x.dx;
  but0=rin.x.bx;
  if(xnow!=x0 || ynow!=y0 || but0!=button)  return 1;
  else return 0;
}

/*************************************
 读取鼠标新的信息
 **************************************/
int MouseRead()
{
   union REGS rin;
  rin.x.ax=3;
  int86(0x33,&rin,&rin);
  button=rin.x.bx;
  xnow=rin.x.cx;
  ynow=rin.x.dx;
  return -1;
}

/***************************************
  函数用来清除原来的牌,并在新的位置显示
******************************************/
 void clear(int x,int y,int flag) /*FLAG为1时,牌向上突出*/
 {
   int i=0,j=0;
   unsigned attrib[100][25];

     if(flag==0)
        {
         for(i=0;i<100;i++)
	   for(j=0;j<25;j++)
             {
	       attrib[i][j]=getpixel(x+j,y-40+i);
               putpixel(x+j,y-40+i,BKCOLOR);
              }
          for(i=0;i<100;i++)
	    for(j=0;j<25;j++)
	       putpixel(x+j,y+i,attrib[i][j]);

         }
      else
         {
           for(i=0;i<100;i++)
	   for(j=0;j<25;j++)
             {
	       attrib[i][j]=getpixel(x+j,y+i);
               putpixel(x+j,y+i,BKCOLOR);
              }

           for(i=0;i<100;i++)
	    for(j=0;j<25;j++)
	       putpixel(x+j,y-40+i,attrib[i][j]);

	  }
 }
 /***************************************
  函数用来清除原来的牌
******************************************/
 void card_cls(int x1,int y1,int x2,int y2)
  {
   int i=0,j=0;
   		for(i=x1;i<=x2;i++)
	  	    for(j=y1;j<=y2;j++)
             putpixel(i,j,BKCOLOR);

  }
/***************************************
  函数用来初始化PLAYER1的牌
******************************************/
void swplayer1()
{
  int i=0;
   	for(i=0;i<17;i++)
              player1[i]=cards[i];
}
/***************************************
  函数用来让电脑出牌
******************************************/
computer_out(int numb)
 {
   int i=0;
   switch(numb)
      {

          case 1:
		  for(i=0;i<17;i++)
                     {
			if(cards[17+i].flag[1]==1 &&
			   cards[17+i].figure > outcards[0].figure)
			{ outcomputer[0] = cards[17+i];

			  showcard(outcomputer,1,20,YP-250);
                          break;
                         }
                       }
	}
}
/***************************************
  函数用来更新PLAYER1的牌
******************************************/
void reduplayer1()
{
  int i=0,j=0;
   	for(i=0;i<17;i++)
            {
             player1[i].flag[2]=0;
             if(player1[i].figure!=-1)
	        player1[j++]=player1[i];

            }


}
/***************************************
  函数用来出牌
******************************************/
int outcard(int num)
 {
	 int i=0,cflag=0;

 	 		for(i=0;i<num;i++)
				{ if(player1[i].flag[2]%2 == 1 && player1[i].figure!=-1)
				    {
             outcards[cflag++] = player1[i];
             player1[i].figure=-1;
             player1[i].flag[2]=0;
            }
				}
 	 switch (cflag)
 	 {
		case 1:	card_cls(XP-400,YP-250,XP-50,YP-150);
                        showcard(outcards,1,XP-50,YP-150);
			computer_out(1);
			break;
		case 2:
                              if(outcards[0].figure== outcards[1].figure)
			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                   showcard(outcards,2,XP-50,YP-150);
                                   break;
                                 }
			     else { outtextxy(100,100,"error");break;}
                 case 3:
                             if(outcards[0].figure== outcards[1].figure &&
                                    outcards[1].figure== outcards[2].figure)
			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                   showcard(outcards,3,XP-50,YP-150);
                                   break;
                                 }
			     else { outtextxy(100,100,"error");break;}
		case 4:
			     if((outcards[0].figure== outcards[1].figure &&
			     	  outcards[1].figure== outcards[2].figure)     ||
			     	  (outcards[1].figure== outcards[2].figure &&
			     	   outcards[2].figure== outcards[3].figure )     ||
			     	  (outcards[0].figure== outcards[1].figure &&
			     	   outcards[1].figure== outcards[2].figure &&
			     	   outcards[2].figure== outcards[3].figure))
			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                    showcard(outcards,4,XP-50,YP-150);
                                     break;
                                  }
			     else { outtextxy(100,100,"error");break;}
	         case 5:
                             if(outcards[0].figure== outcards[1].figure-1 &&
			     	 outcards[1].figure== outcards[2].figure-1 &&
			     	 outcards[2].figure== outcards[3].figure-1 &&
                                 outcards[3].figure== outcards[4].figure-1 )
			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                    showcard(outcards,5,XP-50,YP-150);
                                     break;
                                  }
			     else { outtextxy(100,100,"error");break;}
                 case 6:
                             if((outcards[0].figure== outcards[1].figure-1 &&
			     	 outcards[1].figure== outcards[2].figure-1 &&
			     	 outcards[2].figure== outcards[3].figure-1 &&
                                 outcards[3].figure== outcards[4].figure-1 &&
                                 outcards[4].figure== outcards[5].figure-1)  ||
				 (outcards[0].figure== outcards[1].figure &&
			     	  outcards[2].figure== outcards[3].figure &&
			     	  outcards[4].figure== outcards[5].figure))

			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                    showcard(outcards,6,XP-50,YP-150);
                                     break;
                                  }
			     else { outtextxy(100,100,"error");break;}
                  case 7:
                             if(outcards[0].figure== outcards[1].figure-1 &&
			     	 outcards[1].figure== outcards[2].figure-1 &&
			     	 outcards[2].figure== outcards[3].figure-1 &&
                                 outcards[3].figure== outcards[4].figure-1 &&
                                 outcards[4].figure== outcards[5].figure-1 &&
                                 outcards[5].figure== outcards[6].figure-1 )

			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                    showcard(outcards,7,XP-50,YP-150);
                                     break;
                                  }
			     else { outtextxy(100,100,"error");break;}
                    case 8:
                             if(( outcards[0].figure== outcards[1].figure-1 &&
			     	 outcards[1].figure== outcards[2].figure-1 &&
			     	 outcards[2].figure== outcards[3].figure-1 &&
                                 outcards[3].figure== outcards[4].figure-1 &&
                                 outcards[4].figure== outcards[5].figure-1 &&
                                 outcards[5].figure== outcards[6].figure-1 &&
                                 outcards[6].figure== outcards[7].figure-1)||
                                 (outcards[0].figure== outcards[1].figure &&
			     	  outcards[2].figure== outcards[3].figure &&
			     	  outcards[4].figure== outcards[5].figure &&
				  outcards[6].figure== outcards[7].figure )
                                  )

			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                    showcard(outcards,8,XP-50,YP-150);
                                     break;
                                  }
			     else { outtextxy(100,100,"error");break;}
                   case 9:
                             if (outcards[0].figure== outcards[1].figure-1 &&
			     	 outcards[1].figure== outcards[2].figure-1 &&
			     	 outcards[2].figure== outcards[3].figure-1 &&
                                 outcards[3].figure== outcards[4].figure-1 &&
                                 outcards[4].figure== outcards[5].figure-1 &&
                                 outcards[5].figure== outcards[6].figure-1 &&
                                 outcards[6].figure== outcards[7].figure-1 &&
                                 outcards[7].figure== outcards[8].figure-1
                                 )

			         { card_cls(XP-400,YP-250,XP-50,YP-150);
                                    showcard(outcards,9,XP-50,YP-150);
                                     break;
                                  }
			     else { outtextxy(100,100,"error");break;}

 	 }
	reduplayer1();
	card_cls(XP-425,YP-150,XP,YP);
        outnumber=outnumber+cflag;
        showcard(player1,17-outnumber,XP,YP);
 	return cflag;
 }


/************************************************
  处理左右键的点击
  ***********************************************/
void dealclick()
 {
   char buff[10];

   int x=0,k=0,tem=XP - 25*NUMBER;
   
   if(getpixel(xnow,ynow) !=BKCOLOR && (button==1 || button==2))
    {
      off_mouse(xnow,ynow);
      x=(xnow-tem)/25*25+tem;
      k=16-(xnow-tem)/25;
      if(button==1)
        {
      	 player1[k].flag[2]=player1[k].flag[2]+1;
	 clear(x,YP-100,player1[k].flag[2]%2);
        }
      else
      	  if(button==2)
      	{
          outcard(17-outnumber);
          
      	}
      on_mouse(xnow,ynow);
    }

  }

main()
{
  initgraphs();
  setbkcolor(BKCOLOR);
  initcard();
  washcard();
  sortcard(cards);
  inforcard(cards,17);
  showcard(cards,17,XP,YP);
  InitMs();
  initcursor();
  swplayer1();
  on_mouse(xnow,ynow);
 do{
   if(movemouse())
   {
    off_mouse(xnow,ynow);
    MouseRead();
    printf("\r%4d   %4d   %4d",xnow,ynow,button);
    on_mouse(xnow,ynow);
   }
   dealclick();
  }while(!kbhit());

}
  • card.rar (28.6 KB)
  • 描述: 代码
  • 下载次数: 1
分享到:
评论

相关推荐

    C语言实现扑克牌游戏

    一款C语言实现的扑克牌小游戏,用到了随机函数,初学者可以看一下,方便日后学习。游戏规则: 游戏开始时,向所有参与者(庄家和闲家)分发两张扑克牌。玩家可以看到他们的牌以及点数总和。然而,庄家有一张牌暂时不...

    C语言作业代码-21点游戏(黑杰克/Black Jack)

    3. 对局规则:开局时两名玩家各取一张牌,然后判断是否要牌,玩家不要牌后本局游戏不可再要牌,两名玩家都不要牌或者有玩家手牌爆了则结束本局(每位玩家一局最多拿五张牌),有玩家爆了则没爆的玩家获胜,若两名...

    c语言难点分析整理,C语言

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 ...

    高级C语言详解

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 ...

    史上最强的C语言资料

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 ...

    C语言难点分析整理

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 ...

    高级C语言 C 语言编程要点

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 ...

    C语言学习实例220例

    c语言开发实例目录: 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 009 乘法口诀表 010 猜数字...

    高级进阶c语言教程..doc

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 ...

    免费下载:C语言难点分析整理.doc

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 ...

    C语言难点分析整理.doc

    42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针...

    上海电机学院C语言实训答案

    C语言程序设计是本科工科类各专业的重要基础课,主要学习程序设计的基本概念和方法,通过本门课程学习,使学生掌握C语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序设计的思想和编程技巧。 实训是...

    高级C语言.PDF

    1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 ..........................................

    C语言解析教程(原书第4版)(美) 凯利.pdf

     《c语言教程(原书第4版)》系统、完整,可作为c语言的参考手册,也非常适合作为学习c语言的入门和高级课程教材。 前言 第0章 从零开始 0.1 为什么要用c 0.2 ansi c标准 0.3 从c到c++ 0.4 从c和c++到java 第1章 ...

    c语言实例解析(第二版)高清pdf电子书

    本书主要讲解C语言编程涉及的各类常见实例,共分8篇,以“基础篇→数据结构篇→数值计算与趣味数学篇→图形篇→系统篇→常见试题解答篇→游戏篇→综合实例篇”具体展开,共汇集220个实例,基本涵盖了目前C语言编程的...

    c语言编写单片机技巧

    答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其...

    matlab代码做游戏-easy21:研一下神经网络与机器理论与应用第四次作业

    换句话说,即用摇杆动作调用步骤将打出发牌人的牌并返回最终的奖励和最终状态。 没有折扣(γ= 1)。 我们将使用这种环境进行强化学习。 (2)Easy21中的Q学习 应用Q学习来解决Easy21。 尝试使用不同的学习率α,...

Global site tag (gtag.js) - Google Analytics