论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

双人黑白棋子游戏

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:44:11

写个棋类游戏,练习下.在图形模式下主要显示数字比较麻烦,这里我就用一维数组来统计得分了.希望大家可以指点下在图形模式下应该如何像printf一样输出一个得分.这里的黑白玩家都用上下左右四个键控制,回车代表确认按下.

#include "graphics.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define ENTER 0x1c0d
int a[8][8]={0},key,scoreblack[2]={0},scorewhite[2]={0};
 qipan()/*开始画面*/
{int i,j;
 setbkcolor(BLUE);
 for(i=100;i<=420;i+=40)
  {
  line(100,i,420,i);
  line(i,100,i,420);
  }
 setcolor(0);/*取消圆四周的一圈东西*/
 setfillstyle(SOLID_FILL,15);
 fillellipse(500,200,15,15);
 setfillstyle(SOLID_FILL,8);
 fillellipse(500,300,15,15);
}
 playcolor(int t)/*设置棋子第一次的颜色*/
{
  if(t%2==0)
   setfillstyle(SOLID_FILL,15);
  else
   setfillstyle(SOLID_FILL,8);
}
 playcolortwo(int xx,int yy)/*走了一步后恢复原来那里的格子*/
{
 if(yy<100)
 setfillstyle(SOLID_FILL,BLUE);
 else
    switch(a[(xx-120)/40][(yy-120)/40])
    {
    case 1:
    setfillstyle(SOLID_FILL,15);break;
    case 2:
    setfillstyle(SOLID_FILL,8);break;
    default:
    setfillstyle(SOLID_FILL,BLUE);
    }
}
 qipanchange(int xxx,int yyx,int t)/*棋盘的变化,也就是黑白的变化*/
{
 int i,j,k,kk,ii,jj;
 i=(xxx-120)/40;
 j=(yyx-120)/40;
 playcolor(t);
 if(j<6)/*开始判定变化*/ /*往右边*/
  {
  for(k=j+1;k<8;k++)
    if(a[i][k]==a[i][j]||!a[i][k])
      break;
  if(a[i][k]&&k<8)
  for(kk=j+1;kk<k&&k<8;kk++)
   {
   a[i][kk]=a[i][j];
   fillellipse(120+i*40,120+kk*40,15,15);
   }
  }
 if(j>1)/*往左边*/
 {
 for(k=j-1;k>=0;k--)
   if(a[i][k]==a[i][j]||!a[i][k])
     break;
 if(a[i][k]&&k>=0)
 for(kk=j-1;kk>k&&k>=0;kk--)
   {
   a[i][kk]=a[i][j];
   fillellipse(120+i*40,120+kk*40,15,15);
   }
 }
 if(i<6)/*往下*/
 {
  for(k=i+1;k<8;k++)
    if(a[k][j]==a[i][j]||!a[k][j])
      break;
 if(a[k][j]&&k<8)
  for(kk=i+1;kk<k&&k<8;kk++)
  {
  a[kk][j]=a[i][j];
  fillellipse(120+kk*40,120+j*40,15,15);
  }
}
 if(i>1)/*往上*/
 {
 for(k=i-1;k>=0;k--)
   if(a[k][j]==a[i][j]||!a[k][j])
    break;
 if(a[k][j]&&k>=0)
 for(kk=i-1;kk>k&&k>=0;kk--)
 {
 a[kk][j]=a[i][j];
 fillellipse(120+kk*40,120+j*40,15,15);
 }
}
 if(i>1&&j<6)/*右上*/
 {
 for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
  if(a[k][kk]==a[i][j]||!a[k][kk])
    break;
 if(a[k][kk]&&k>=0&&kk<8)
 for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
  {
  a[ii][jj]=a[i][j];
  fillellipse(120+ii*40,120+jj*40,15,15);
  }
 }
 if(i<6&&j>1)/*左下*/
 {
 for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)
  if(a[k][kk]==a[i][j]||!a[k][kk])
   break;
 if(a[k][kk]&&k<8&&kk>=0)
 for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)
  {
  a[ii][jj]=a[i][j];
  fillellipse(120+ii*40,120+jj*40,15,15);
  }
 }
 if(i>1&&j>1)/*左上*/
 {
 for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
  if(a[k][kk]==a[i][j]||!a[k][kk])
   break;
 if(a[k][kk]&&k>=0&&kk>=0)
 for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
  {
  a[ii][jj]=a[i][j];
  fillellipse(120+ii*40,120+jj*40,15,15);
  }
 }
 if(i<6&&j<6)/* 右下*/
 {
 for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
   if(a[k][kk]==a[i][j]||!a[k][kk])
     break;
 if(a[k][kk]&&kk<8&&k<8)
 for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)
   {
  a[ii][jj]=a[i][j];
  fillellipse(120+ii*40,120+jj*40,15,15);
   }
  }
}
 doscore()/*处理分数*/
{int i,j;
 scorewhite[0]=scorewhite[1]=scoreblack[0]=scoreblack[1]=0;/*重新开始计分数*/
 for(i=0;i<8;i++)
  for(j=0;j<8;j++)
   if(a[i][j]==1)/*分别统计两个人的分数*/
    {
    scorewhite[1]++;
    if(scorewhite[1]==10)
     {scorewhite[1]=0;scorewhite[0]++;}
    }
   else if(a[i][j]==2)
    {
    scoreblack[1]++;
    if(scoreblack[1]==10)
     {scoreblack[1]=0;scoreblack[0]++;}
    }
}

 printscore(playnum)/*输出成绩*/
{int i,j,k;
 int s[2];
 if(playnum==1)/*把分数给这个临时变量*/
 for(i=0;i<2;i++)
 s[i]=scorewhite[i];
 else
 for(i=0;i<2;i++)
 s[i]=scoreblack[i];
 if(playnum==1)/*清楚以前的成绩*/
 {
 setfillstyle(SOLID_FILL,BLUE);
 bar(550,100,640,400);
 }
 if(playnum==1)/*判定输出的行数*/
 k=200;
 else
 k=300;
 setcolor(RED);
 settextstyle(0,0,4);
 for(i=0,j=550;i<2;i++,j+=40)
 {
  switch(s[i])/*判定要输出的分数*/
  {
  case 0: outtextxy(j,k,"0");break;
  case 1: outtextxy(j,k,"1");break;
  case 2: outtextxy(j,k,"2");break;
  case 3: outtextxy(j,k,"3");break;
  case 4: outtextxy(j,k,"4");break;
  case 5: outtextxy(j,k,"5");break;
  case 6: outtextxy(j,k,"6");break;
  case 7: outtextxy(j,k,"7");break;
  case 8: outtextxy(j,k,"8");break;
  case 9: outtextxy(j,k,"9");break;
  }
 }
 setcolor(0);
}
playwin()/*输出最后的胜利者结果*/
{settextstyle(0,0,4);
 setcolor(12);
 if(scoreblack[0]>scorewhite[0])
 outtextxy(100,50,"black win!");
 else if(scoreblack[0]<scorewhite[0])
 outtextxy(100,50,"white win!");
 else if(scoreblack[0]==scorewhite[0])
  {
   if(scoreblack[1]==scorewhite[1])
   outtextxy(60,50,"you all win!");
   else if(scoreblack[1]>scorewhite[1])
   outtextxy(100,50,"black win!");
   else if(scoreblack[1]<scorewhite[1])
   outtextxy(100,50,"white win!");
  }
}
 playtoplay()/*人人对战*/
{int xx,yy,t=0,sum,i,j;
  while(1)
 {
  xx=120,yy=80;/*每次棋子一开始出来的坐标*/
  while(1)
  {
  printscore(1);/*输出玩家1的成绩*/
  printscore(2);/*输出玩家2的成绩*/
  playcolor(t);
  fillellipse(xx,yy,15,15);
  key=bioskey(0);
  sound(100);
  nosound();
  if(key==ESC)
  break;
  else if(key==ENTER)/*假如按键确定就可以跳出循环*/
   {
    if(yy!=80&&a[(xx-120)/40][(yy-120)/40]!=1&&a[(xx-120)/40][(yy-120)/40]!=2)/*是否已经有子*/
      {
      if(t%2==0)
      a[(xx-120)/40][(yy-120)/40]=1;
      else
      a[(xx-120)/40][(yy-120)/40]=2;
      qipanchange(xx,yy,t);/*走好一步棋子后屏幕的变化*/
      doscore();/*分数的改变*/
      break;/*判定成功就下一个棋子走*/
      }
    else
    continue;/*不成功就等于白按回车*/
   }
  else if(key==LEFT&&xx>120)/*四个方向按键盘的判定*/
    {
    playcolortwo(xx,yy);/*判定原来位置因为画什么,这里只画蓝色是不完整的*/
    fillellipse(xx,yy,15,15);
    playcolor(t);
    xx-=40;
    fillellipse(xx,yy,15,15);
    }
  else if(key==RIGHT&&xx<400&&yy>80)
   {
   playcolortwo(xx,yy);
   fillellipse(xx,yy,15,15);
   playcolor(t);
   xx+=40;
   fillellipse(xx,yy,15,15);
   }
  else if(key==UP&&yy>120)
   {
   playcolortwo(xx,yy);
   fillellipse(xx,yy,15,15);
   playcolor(t);
   yy-=40;
   fillellipse(xx,yy,15,15);
   }
 else if(key==DOWN&&yy<400)
   {
   playcolortwo(xx,yy);
   fillellipse(xx,yy,15,15);
   playcolor(t);
   yy+=40;
   fillellipse(xx,yy,15,15);
   }
 }
 if(key==ESC)
  break;
 sum=0;
 for(i=0;i<8;i++)/*判定是否棋子填满*/
   for(j=0;j<8;j++)
    if(a[i][j]!=0)
     sum++;
 if(sum==64)
 {
  playwin();/*判定胜败*/
  break;
 }
 t++;
 if(t==11)/*假如t到了11就变成1*/
 t=1;
 }
}
 main()
{int gd=DETECT,gr;
 initgraph(&gd,&gr,"c:\\tc");
 qipan();/*画棋盘*/
 playtoplay();/*人人对战*/
 getch();
 closegraph();
}

上一篇:{实例}又一个贪吃蛇 人气:6213
下一篇:{实例}简单图形模拟吃豆游戏 人气:4763
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058