`
sylinx_yqg
  • 浏览: 143491 次
  • 性别: 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语言本身不支持图形用户界面(GUI),但开发者可能会借助如ncurses库来创建控制台式的文本界面,通过字符模拟出扑克牌的显示,以及接收用户的键盘输入来控制游戏流程。 总的来说,《基于C语言的扑克牌小游戏》...

    一个简易的用C语言编写的蜘蛛纸牌小游戏

    【标题】中的“一个简易的用C语言编写的蜘蛛纸牌小游戏”表明我们要讨论的是一个使用C语言开发的蜘蛛纸牌游戏。...它是一个理想的项目,可以帮助开发者巩固C语言基础,学习游戏逻辑,以及如何创建用户友好的交互体验。

    21点扑克牌游戏(C#源码)

    通过分析这款21点扑克牌游戏的C#源码,开发者不仅可以学习到C#编程语言的实际运用,还能深入理解游戏逻辑的实现,同时提升在UI设计、数据结构和算法、错误处理等方面的能力。对于初学者来说,这是一个很好的实践项目...

    C语言 斗地主 游戏

    斗地主是一种流行的扑克牌游戏,通常由三位玩家参与,玩家通过出牌策略进行竞争。在C语言中实现斗地主游戏,需要考虑以下几个核心知识点: 1. 数据结构:首先,你需要定义一种数据结构来存储和管理牌。这可能包括...

    C语言实现纸牌洗牌发牌

    在编程领域,实现一个纸牌游戏的洗牌和发牌功能是常见的练习,它涉及到随机数生成、数组操作以及逻辑思维。在这个项目中,我们使用C语言来完成这个任务。C语言是一种强大的、低级别的编程语言,适合进行系统级编程和...

    C语言开发-经典游戏-像素蜘蛛纸牌

    - 游戏布局:学习如何用C语言表示游戏桌面上的牌堆、储备区、基础列等元素。 - 牌的移动规则:编程实现合法的牌移动,包括从储备区到桌面、牌堆之间的转移等。 4. **算法实现**: - 排序算法:可能涉及快速排序...

    C语言实现扑克牌游戏

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

    用C语言实现的扑克游戏简单实用(C++)

    在这个名为“用C语言实现的扑克游戏简单实用(C++)”的项目中,开发者采用C++编程语言创建了一个基础的扑克游戏。虽然这个程序可能最初是作为课堂作业设计的,但它提供了一个学习和扩展的基础,让学生和爱好者们...

    c语言24点游戏源码-c语言文件读写操作

    首先,24点游戏是一种智力游戏,玩家需要从四张随机给出的扑克牌(数值为1到13)中,通过加减乘除运算,使得运算结果等于24。在C语言中实现这个游戏,我们需要设计算法来检查所有可能的组合,并判断是否能得出24。 ...

    c语言编写的梭哈游戏项目

    梭哈游戏是一种流行扑克牌游戏,通过C语言实现,我们可以深入理解C语言的内存管理、数据结构、逻辑控制以及函数调用等核心概念。 【描述】中的关键点在于"结构体"、"枚举"和"共用体"的使用,这些都是C语言中非常...

    拱猪游戏(c语言)

    游戏开始时,每名玩家随机抽取一张牌作为起始牌,然后按照特定的出牌顺序进行。C语言中的随机数生成函数`rand()`和种子设置函数`srand()`可以用来实现这一功能。 在拱猪游戏中,程序需要处理以下几个关键部分: 1....

    标准C写的21点游戏

    《标准C写的21点游戏》 在编程学习过程中,编写简单的游戏程序是常见的实践方式,可以帮助初学者更好地理解和运用编程语言。本文将详细介绍一款使用标准C语言编写的21点游戏,它允许最多五位玩家参与,让我们一同...

    C#程序写的塔罗牌游戏源代码

    本项目是一个基于C#编程语言实现的塔罗牌游戏,主要用于学习和实践C#的编程技巧,特别是在使用枚举(Enum)类型方面。塔罗牌游戏通常涉及到随机性、数据结构以及面向对象的设计原则,这些都是C#编程中的重要概念。...

    C语言斗地主程序

    此外,由于斗地主游戏涉及到随机性(发牌、出牌顺序),因此还需要熟悉C语言中的随机数生成函数,如`srand()`和`rand()`。游戏的核心逻辑包括: 1. **数据结构设计**:为了存储牌型和玩家的手牌,需要设计合适的...

    C语言实现简易扑克牌游戏

    《C语言实现简易扑克牌游戏》 在编程领域,实现各种游戏可以帮助我们更好地理解数据结构和算法的应用。本文将详细探讨如何使用C语言编写一个简单的扑克牌游戏。这个游戏的规则如下:一副扑克牌平均分为两份,两位...

    基于C语言-跑得快扑克牌游戏开发指南

    一个基于C语言实现的简单跑得快扑克牌游戏。通过这个项目,我们不仅能够体验到游戏开发的乐趣,还能深入理解数据结构、算法和图形编程的基本概念。我们将逐步解析代码的各个部分,探讨其功能和实现细节,帮助读者...

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

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

Global site tag (gtag.js) - Google Analytics