⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgame.txt

📁 C的一个推箱子游戏!源创适合学习!可改成RPG带汉字库输出!
💻 TXT
字号:
/* WIN-TC BGI 图形编程模板 */ 用的是win-tc 1.9或更高



#i nclude "stdio.h"
#i nclude "dos.h                           "
#i nclude "stdlib.h"
#i nclude "Conio.h"
#i nclude "graphics.h"
#define closegr closegraph
 void *buffer;
 FILE *fp;
           void hz(int x,int y,int a,int COL,int b,char *s)       {
                               int ROW;
                               char buffer[32];
                               register m,n,i,j,k;
                               unsigned char qh,wh;
                               unsigned long offset;
                               ROW=COL;
                               while(*s)
                                {
                                 qh=*(s)-0xa0;
                                 wh=*(s+1)-0xa0;
                                 offset=(94*(qh-1)+(wh-1))*32L;
                                 fseek(fp,offset,SEEK_SET);
                                 fread(buffer,32,1,fp);
                                 for (i=0;i<16;i++)
                                 for(n=0;n<ROW;n++)
                                 for(j=0;j<2;j++)
                                 for(k=0;k<8;k++)
                                 for(m=0;m<COL;m++)
                                 if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
                                   putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,b);
                                 s+=2;
                                 x+=a;
                                 }
                              }

’以上是用于从hz16文件读写汉字不用管
 initgr(void) /* BGI初始化 */
{
  int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
  registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
  initgraph(&gd, &gm, "");
}

‘以上是用开建立图形模式

int main(void)
{


  int i; 
          int m;
          FILE  *fpp;

          int apath[20][20];
  int mi=0;
  int c;
  int fx,fy;
  int x=5;
  int y=9;
  int path[20][20]={
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,1,0,0,8,0,1,0,0,0,0,0,0,0,0,1,
 1,0,0,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,0,1,
 1,0,0,0,1,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1,
 1,0,0,0,1,0,1,0,0,8,0,1,0,0,0,0,0,0,0,1,
 1,0,0,0,1,0,8,0,0,0,0,1,0,0,0,0,0,0,0,1,
 1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,

 };

’以上定地图数组
 initgr(); /* BGI初始化 */
  rmap:

‘读hz16字库
((fp=fopen("C:\\Win-TC\\ccdos\\Hzk16","rb"))==NULL)
                                   { printf("Can't open haz16,Please add it");
                                  getch(); closegraph(); exit(0);
                                   }
    

‘用两个for从数组读地图数,是8有箱子,否则1为墙,0为空地,9是搬运工

 /* for (fx=0;fx<20;fx++)  //双循环画地图
  {
  for (fy=0;fy<20;fy++)
  {
   if (path[fx][fy]==1) {circle(fy*10+100, fx*10+100,5);}    //数组的地址[x][y]与地图circle(y,x,5) 中的x,y相反?
 if (path[fx][fy]==8) {circle(fy*10+100, fx*10+100,1);}
    if (path[fx][fy]==9) {circle(fy*10+100, fx*10+100,2);}



  }
  }
  */

sw:
 c=getch();

'读键值看上下右左,wsda键
h(c)
{
case 'w':{

‘先看x-1,y是不是没有箱子8或墙0,没有就可以x-1,即上移,注意其中数组和屏幕对应关系是反的。x-1是向上移
if (path[x-1][y]==0)
{path[x][y]=0;
x=x-1;
path[x][y]=5;
}
if (path[x-1][y]==8)
{
//printf("hi ,how do you do");
 hz(10,245,25,1,4,"你是谁呀");
getche();

if (path[x-1][y]==8&&path[x-2][y]!=1&&path[x-2][y]!=8)
{path[x][y]=0;
 x=x-1;
 path[x][y]=5;
 path[x-1][y]=8;
 }

}

‘这面看是不是碰到箱了,碰到了打出“不要打我呀”,以后改为rpg游戏用做对话用

if (path[x-1][y]==9)
{
//printf("no good");
hz(10,245,25,1,4,"不要打我呀!");
getche();
}
}
break;
case 's':{


if (path[x+1][y]==0)
{path[x][y]=0;
x=x+1;
path[x][y]=5;
}
if (path[x+1][y]==8&&path[x+2][y]!=1&&path[x+2][y]!=8)
{path[x][y]=0;
 x=x+1;
 path[x][y]=5;
 path[x+1][y]=8;
 }


}
break;
case 'a':{

if (path[x][y-1]==0)
 {path[x][y]=0;
 y=y-1;
 path[x][y]=5;
 }
 if (path[x][y-1]==8&&path[x][y-2]!=1&&path[x][y-2]!=8)
{path[x][y]=0;
 y=y-1;
 path[x][y]=5;
 path[x][y-1]=8;
 }
 }
break;
case 'd':
{

if (path[x][y+1]==0)
 {path[x][y]=0;
 y=y+1;
 path[x][y]=5;
 }
 if (path[x][y+1]==8&&path[x][y+2]!=1&&path[x][y+2]!=8)
{path[x][y]=0;
 y=y+1;
 path[x][y]=5;
 path[x][y+1]=8;
 }



 }
break;
case 'q':{
goto en;
}
}
//if (path[x][y+1]==8)exit();
//if (path[x][y-1]==8)exit();
//if (path[x+1][y]==8)exit();
//if (path[x-1][y]==8)exit();
//if(path[18][18]==0&&path[4][1]==1) goto dn;

 cleardevice();

 for (fx=0;fx<20;fx++)  //双循环画地图
  {
  for (fy=0;fy<20;fy++)
  {
   if (path[fx][fy]==1) {circle(fy*10+100, fx*10+100,5);}    //数组的地址[x][y]与地图circle(y,x,5) 中的x,y相反?
  if (path[fx][fy]==8) {circle(fy*10+100, fx*10+100,1);}
 if (path[fx][fy]==5) {circle(fy*10+100, fx*10+100,3);}
  if (path[fx][fy]==9) {circle(fy*10+100, fx*10+100,8);}
  }
  }
  if (path[8][10]!=8&&path[8][10]!=5) {circle(10*10+100, 8*10+100,2);}  //判断是否推抵?
  if (path[9][10]!=8&&path[9][10]!=5) {circle(10*10+100, 9*10+100,2);}
  if (path[10][10]!=8&&path[10][10]!=5) {circle(10*10+100, 10*10+100,2);}
  if (path[8][10]==8&&path[9][10]==8&&path[10][10]==8){

  mi=20;
   goto dn;
  }
goto sw;
  dn: /* 暂停一下,看看前面绘图代码的运行结果 */

  /* 恢复TEXT屏幕模式 */
  //outtextxy(200,200,"sadfasfasfsafsaf");
// cleardevice();
 hz(10,245,25,1,4,"关键在于参与!这我是这里持游戏 是中中是我游戏");
 hz(10,145,25,1,4,"你看过我的游戏吗,这就是其中的一个。");

 getch();

'下面是建立读地图文件,也就是从test.dat读出数组值,并将现在地图数组附 值
 cleardevice();
               fpp=fopen("test.dat", "r");    /*打开文字文件只读*/
          //fgets(s, 24, fp);             /*从文件中读取23个字符*/
          //printf("%s", s);              /*输出所读的字符串*/
         // fscanf(fp, "%d", &i);         /*读取整型数*/            //putchar(fgetc(fp));           /*读取一个字符同时输出*/
         // fscanf(fp, "%d", &m);
          for (i=0;i<20;i++)
          {for (m=0;m<20;m++)
          fscanf(fpp,"%d",&apath[i][m+mi]);
          }
          //printf("%d", i);             /*输出所读整型数*/
         //printf("%d", m);
           for (i=0;i<20;i++)
          {for (m=0;m<20;m++)
           path[i][m]= apath[i][m+mi];
          //fgets(m, 17, fp);             /*读取16个字符*/
          //puts(m);                      /*输出所读字符串*/

         }
          fclose(fp);       
 goto rmap;
en:
  getch();
 closegr();
 return 0;
}


'地图写入,下面是建立test.dat文件,注意将其放入同一目录中
#i nclude<stdio.h> 
     main() 
     { 
          //char *s="That's good news";  /*定义字符串指针并初始化*/
          int i;
          int m;
          int apath[20][40]={
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,
 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,8,0,9,0,0,0,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,
 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,9,0,0,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 


 };               /*定义整型变量并初始化*/

          FILE *fp;                     /*定义文件指针*/ 
          fp=fopen("test.dat", "w");    /*建立一个文字文件只写*/
          //fputs("Your score of TOEFLis", fp);/*向所建文件写入一串字符*/
          //fputc(':', fp);

          for (i=0;i<20;i++)
          { for (m=0;m<40;m++)             /*向所建文件写冒号:*/
          fprintf(fp, "%d\n", apath[i][m]);      /*向所建文件写一整型数*/
         // fprintf(fp, "%d\n", m);

         }
         // fprintf(fp, "%s", s);         /*向所建文件写一字符串*/
          fclose(fp);                   /*关闭文件*/ 
     } 

'注:汉字,,需要hz16字库支持!!!hz16文件要放在同主文件一相目录中  hz16文件即字库文件,http://www.liaobei.com/有!




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -