C语言简易文字冒险游戏源代码

C语言简易文字冒险游戏源代码,第1张

记忆游戏

#include<stdioh>

#include<timeh>

#include<stdlibh>

#include<windowsh>

#define N 10

int main(  )

{int i,k,n,a[N],b[N],f=0;

srand(time(NULL));

printf("  按1开始\n  按0退出:_");

scanf("%d",&n);

system("cls");

while(n!=0)

{for(k=0;k<N;k++)a[k] = rand( )%N;

printf("\n\t\t[请您牢记看到颜色的顺序]\n\n");

for(k=0;k<N;k++)

{switch(a[k])

{case 0:system("color 90");printf("  0:淡蓝色\n");break;  //淡蓝色

case 1:system("color f0");printf("  1:白色\n");break;  //白色

case 2:system("color c0");printf("  2:淡红色\n");break;  //淡红色

case 3: system("color d0");printf("  3:淡紫色\n");break;  //淡紫色

case 4: system("color 80");printf("  4:灰色\n"); break;  //灰色

case 5: system("color e0");printf("  5:**\n");break;  //**

case 6: system("color 10");printf("  6:蓝色\n"); break;  //蓝色

case 7: system("color 20");printf("  7:绿色\n");break;  //绿色

case 8: system("color 30");printf("  8:浅绿色\n");break;  //浅绿色

case 9: system("color 40");printf("  9:红色\n");break;  //红色

}

Sleep(1500);

system("color f");  //单个控制 文字颜色

Sleep(100);

}

system("cls");

printf(" 0:淡蓝色,1:白色,2:淡红色,3:淡紫色,4:灰色,5:**,6:蓝色7:绿色,8:浅绿色,9:红色\n");

printf("\n\t请输入颜色的顺序:");

for(k=0;k<N;k++)scanf("%d",&b[k]);

for(k=0;k<N;k++)if(a[k] == b[k]) f++;

if(f==0) printf("  你的记忆弱爆了0\n");

else if(f==1) printf("  你的记忆有点弱1\n");

else if(f<5) printf("  你的记忆一般<5\n");

else printf("  你的记忆力很强!\n");

Sleep(2000);

system("cls");

printf("\t\t按0退出\n\t\t按任意键继续游戏:\n");

scanf("%d",&n);

system("cls");

}

return 0;

}

注:DEVc++运行通过,每输入一个数字要加入一个空格。

我的楼主可以自己玩一下

试试吧

#define N 200

#include <graphicsh>

#include <stdlibh>

#include <dosh>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/得分/

int gamespeed=50000;/游戏速度自己调整/

struct Food

{

int x;/食物的横坐标/

int y;/食物的纵坐标/

int yes;/判断是否要出现食物的变量/

}food;/食物的结构体/

struct Snake

{

int x[N];

int y[N];

int node;/蛇的节数/

int direction;/蛇移动方向/

int life;/ 蛇的生命,0活着,1死亡/

}snake;

void Init(void);/图形驱动/

void Close(void);/图形结束/

void DrawK(void);/开始画面/

void GameOver(void);/结束游戏/

void GamePlay(void);/玩游戏具体过程/

void PrScore(void);/输出成绩/

/主函数/

void main(void)

{

Init();/图形驱动/

DrawK();/开始画面/

GamePlay();/玩游戏具体过程/

Close();/图形结束/

}

/图形驱动/

void Init(void)

{

int gd=DETECT,gm;

initgraph(&gd,&gm,"c:\\tc");

cleardevice();

}

/开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙/

void DrawK(void)

{

/setbkcolor(LIGHTGREEN);/

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/设置线型/

for(i=50;i<=600;i+=10)/画围墙/

{

rectangle(i,40,i+10,49); /上边/

rectangle(i,451,i+10,460);/下边/

}

for(i=40;i<=450;i+=10)

{

rectangle(50,i,59,i+10); /左边/

rectangle(601,i,610,i+10);/右边/

}

}

/玩游戏具体过程/

void GamePlay(void)

{

randomize();/随机数发生器/

foodyes=1;/1表示需要出现新食物,0表示已经存在食物/

snakelife=0;/活着/

snakedirection=1;/方向往右/

snakex[0]=100;snakey[0]=100;/蛇头/

snakex[1]=110;snakey[1]=100;

snakenode=2;/节数/

PrScore();/输出得分/

while(1)/可以重复玩游戏,压ESC键结束/

{

while(!kbhit())/在没有按键的情况下,蛇自己移动身体/

{

if(foodyes==1)/需要出现新食物/

{

foodx=rand()%400+60;

foody=rand()%350+60;

while(foodx%10!=0)/食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到/

foodx++;

while(foody%10!=0)

foody++;

foodyes=0;/画面上有食物了/

}

if(foodyes==0)/画面上有食物了就要显示/

{

setcolor(GREEN);

rectangle(foodx,foody,foodx+10,foody-10);

}

for(i=snakenode-1;i>0;i--)/蛇的每个环节往前移动,也就是贪吃蛇的关键算法/

{

snakex[i]=snakex[i-1];

snakey[i]=snakey[i-1];

}

/1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头/

switch(snakedirection)

{

case 1:snakex[0]+=10;break;

case 2: snakex[0]-=10;break;

case 3: snakey[0]-=10;break;

case 4: snakey[0]+=10;break;

}

for(i=3;i<snakenode;i++)/从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来/

{

if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])

{

GameOver();/显示失败/

snakelife=1;

break;

}

}

if(snakex[0]<55||snakex[0]>595||snakey[0]<55||

snakey[0]>455)/蛇是否撞到墙壁/

{

GameOver();/本次游戏结束/

snakelife=1; /蛇死/

}

if(snakelife==1)/以上两种判断以后,如果蛇死就跳出内循环,重新开始/

break;

if(snakex[0]==foodx&&snakey[0]==foody)/吃到食物以后/

{

setcolor(0);/把画面上的食物东西去掉/

rectangle(foodx,foody,foodx+10,foody-10);

snakex[snakenode]=-20;snakey[snakenode]=-20;

/新的一节先放在看不见的位置,下次循环就取前一节的位置/

snakenode++;/蛇的身体长一节/

foodyes=1;/画面上需要出现新的食物/

score+=10;

PrScore();/输出新得分/

}

setcolor(4);/画出蛇/

for(i=0;i<snakenode;i++)

rectangle(snakex[i],snakey[i],snakex[i]+10,

snakey[i]-10);

delay(gamespeed);

setcolor(0);/用黑色去除蛇的的最后一节/

rectangle(snakex[snakenode-1],snakey[snakenode-1],

snakex[snakenode-1]+10,snakey[snakenode-1]-10);

} /endwhile(!kbhit)/

if(snakelife==1)/如果蛇死就跳出循环/

break;

key=bioskey(0);/接收按键/

if(key==ESC)/按ESC键退出/

break;

else

if(key==UP&&snakedirection!=4)

/判断是否往相反的方向移动/

snakedirection=3;

else

if(key==RIGHT&&snakedirection!=2)

snakedirection=1;

else

if(key==LEFT&&snakedirection!=1)

snakedirection=2;

else

if(key==DOWN&&snakedirection!=3)

snakedirection=4;

}/endwhile(1)/

}

/游戏结束/

void GameOver(void)

{

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();

}

/输出成绩/

void PrScore(void)

{

char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);

}

/图形结束/

void Close(void)

{

getch();

closegraph();

}

小游戏2048:

#include<stdioh>

#include<stdlibh>

#include<conioh>

#include<timeh>

#include<windowsh>

int  jsk( );   //计算空格数

void rsgm( );  //重置游戏

void inkey( );  //按键输入

void left( );   //向左移动

void right( );  //向右移动

void up( );  //向上移动

void down( );  //向下移动

void show( );   //输出界面

void adnum( ); //添加随机数

void yes( );   //游戏是否结束(1是0否)

void gtxy(int x, int y); //控制光标位置的函数

int a[4][4];   //存储16个格子中的数字

int score = 0;  //每局得分

int best = 0;  //最高得分

int ifnum;  //是否需要添加数字(1是0否)

int over;   //游戏结束标志(1是0否)

int i,j,k;

int main( )

{ rsgm( );  //重置游戏

  inkey( );  //按键输入

  return 0;

}

void Color(int a)   //设定字符颜色的函数(a应为1-15)

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);  }

void rsgm( )   //重置游戏

{ score = 0; ifnum = 1; over = 0; srand((unsigned)time(0));  //启动随机数发生器

int n = rand( ) % 16;   //随机函数产生0-15的数字

for (i = 0; i < 4; i++)

{for (j = 0; j < 4; j++)

   { if (n == 0) { int k = rand( ) % 3; if (k == 0 || k == 1) { a[i][j] = 2; }

                        else { a[i][j] = 4; } n--; }

     else { a[i][j] = 0; n--; }

   }

}

adnum( );

system("cls");

CONSOLE_CURSOR_INFO gb={1,0};  //以下两行是隐藏光标的设置,gb代指光标

SetConsoleCursorInfo( GetStdHandle(STD_OUTPUT_HANDLE), &gb );

Color(14);   //设置字体淡**

printf("\n\n\t\t  2048小游戏"); Color(7);   //恢复白字黑底

printf("\n\t┌──────┬──────┬──────┬──────┐");

printf("\n\t│      │      │      │      │");

printf("\n\t├──────┼──────┼──────┼──────┤");

printf("\n\t│      │      │      │      │");

printf("\n\t├──────┼──────┼──────┼──────┤");

printf("\n\t│      │      │      │      │");

printf("\n\t├──────┼──────┼──────┼──────┤");

printf("\n\t│      │      │      │      │");

printf("\n\t└──────┴──────┴──────┴──────┘");

show( );

}

void show( )   //输出界面

{ for(i=0;i<4;i++)

for(j=0;j<4;j++)

   { gtxy(7j+9,2i+4);   //gtxy(7j+9, 2i+4)是光标到指定位置输出数字

     if(a[i][j]==0){printf("      "); Color(7); printf("│");}

     else if(a[i][j]<10){ if (a[i][j] == 2) { Color(14); }

                                else if (a[i][j] == 4) { Color(13); }

                                else if (a[i][j] == 8) { Color(12); }

                                printf("   %d  ", a[i][j]); Color(7 ); printf("│");

                              }

    else if (a[i][j] < 100){if (a[i][j] == 16) { Color(12); }

                                   else if (a[i][j] == 32) { Color(10); }

                                   else if (a[i][j] == 64) { Color(2 ); }

                                   printf("  %d  ", a[i][j]); Color(7); printf("│");

                                 }

   else if (a[i][j] < 1000) {if (a[i][j] == 128) { Color(9); }

                                       else if (a[i][j] == 256) { Color(1); }

                                       else if (a[i][j] == 512) { Color(13); }

                                       printf("  %d ", a[i][j]); Color(7); printf("│");

                                     }

    else if (a[i][j] < 10000) {if (a[i][j] == 1024) { Color(5); }

                                         else { Color(15); }

                                         printf(" %d ", a[i][j]); Color(7); printf("│");

                                       }

}

if (jsk( ) == 0)

  {  yes( );  if (over) { gtxy(9,12); Color(10);

                                printf("\n\n  游戏结束!是否继续 [ Y/N ]:"); }

  }

}

void inkey( )   //按键输入

{ int key;

while (1)

    { key = getch( );

      if (over) { if (key == 89|| key == 121) { rsgm( ); continue; }

                      else  if (key == 78|| key == 110) { return; }

                      else  continue; }

      ifnum = 0;

     if(key==224)key=getch( );

        switch (key)

            { case 75: left( ); break;

              case 77: right( ); break;

              case 72: up( ); break;

              case 80: down( );break;

}

  if (score > best) { best = score; }

  if (ifnum) { adnum( ); show( ); }

}

}

int jsk( )   //计算空格数

{ int n = 0;

for (i = 0; i < 4; i++)

   { for (j = 0; j < 4; j++) { if ( a[i][j] == 0) {n++;}  }   }

return n;

}

void left( )   //向左移动

{ for (i = 0; i < 4; i++)

{for (j = 1, k = 0; j < 4; j++)

    { if (a[i][j] > 0)

       { if ( a[i][k] == a[i][j])

             { a[i][k] = 2;  k++;

                score = score + 2 a[i][j];

                a[i][j] = 0;  ifnum = 1; }

          else if ( a[i][k] == 0) { a[i][k] = a[i][j]; a[i][j] = 0; ifnum = 1; }

          else { a[i][k + 1] = a[i][j]; if ((k + 1) != j) { a[i][j] = 0; ifnum = 1; }

          k++; }

       }

     }

}

}

void right( )   //向右移动

{for (i = 0; i < 4; i++)

  {for (j = 2, k = 3; j >= 0; j--)

     {if (a[i][j] > 0)

        { if (a[i][k] == a[i][j])

               {a[i][k] = 2; k--; score = score + 2 a[i][j]; a[i][j] = 0; ifnum = 1; }

    else if ( a[i][k] == 0) {a[i][k] = a[i][j]; a[i][j] = 0; ifnum = 1; }

    else { a[i][k - 1] = a[i][j]; if ((k - 1) != j) { a[i][j] = 0; ifnum = 1; } k--; }

   }

     }

}

}

void up( )   //向上移动

{for (i = 0; i < 4; i++)

{for (j = 1, k = 0; j < 4; j++)

     {if (a[j][i] > 0)

         {if ( a[k][i] == a[j][i]) { a[k][i] = 2; k++;score = score + 2 a[j][i];

                                           a[j][i] = 0; ifnum = 1; }

          else if ( a[k][i] == 0) { a[k][i] = a[j][i]; a[j][i] = 0; ifnum = 1; }

          else { a[k + 1][i] = a[j][i]; if ((k + 1) != j) { a[j][i] = 0; ifnum = 1; }

          k++; }

   }

    }

}

}

void down( )   //向下移动

{ for (i = 0; i < 4; i++)

{for (j = 2, k = 3; j >= 0; j--)

  {if (a[j][i] > 0)

     {if (a[k][i] == a[j][i])

          {a[k][i] = 2; k--;score = score + 2 a[j][i]; a[j][i] = 0; ifnum = 1; }

       else if (a[k][i] == 0) {a[k][i] = a[j][i]; a[j][i] = 0; ifnum = 1; }

       else {a[k - 1][i] = a[j][i];

                if ((k - 1) != j) {a[j][i] = 0; ifnum = 1; } k--; }

      }

   }

}

}

void adnum( )   //添加随机数

{ srand(time(0)); int n = rand( ) % jsk( );

for (int i = 0; i < 4; i++)

   {for (int j = 0; j < 4; j++)

      { if (a[i][j] == 0) {if (n != 0) { n--; }

        else {int k = rand( ) % 3;

                if (k == 0 || k == 1) {a[i][j] = 2; return; }

                else {a[i][j] = 4; return; } }

      }

   }

}

}

void yes( )   //游戏是否结束

{ for (int i = 0; i < 4; i++)

{for (int j = 0; j < 3; j++)

     {if (a[i][j] == a[i][j + 1] || a[j][i] == a[j + 1][i]) {over = 0; return; }}

}

over = 1;

}

void gtxy(int x, int y)   //控制光标位置的函数

{ COORD zb;   //zb代指坐标

zbX = x;

zbY = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), zb);

}

我这儿有c语言的自写俄罗斯方块,请指教:#include

#include

#include

#include

#include

#include

#include

#define ESC 0x011b

#define UP 0x4800

#define DOWN 0x5000

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define SPACE 0x3920

#define Y 0x1579

#define N 0x316e

#define clearkbd(); while(bioskey(1)) bioskey(0); /清空键盘缓冲队列/

void update();

void messagebox();

void process();

void initremove();

void initinfo();

void initbox();

void initposition();

void next_shape();

typedef struct shape /形状单一状态的记录/

{ int attr;

int co[8];

}shape;

typedef struct RE_AB /相对,绝对坐标记录/

{ int Rx,Ry;

int x1,x2,y1,y2;

}RE_AB;

RE_AB RA;

shape p[19]={ { RED,0,1,1,0,1,1,2,1 }, /数组中保证y最大的在最后,以便initposition使用/

{ RED,0,1,1,0,1,1,1,2 },

{ RED,0,0,1,0,2,0,1,1 },

{ RED,0,0,0,1,1,1,0,2 },

{ GREEN,0,0,1,0,2,0,3,0 },

{ GREEN,0,0,0,1,0,2,0,3 },

{ CYAN,0,0,0,1,1,0,1,1 },

{ BROWN,0,0,1,0,1,1,2,1 },

{ BROWN,1,0,0,1,1,1,0,2 },

{ BLUE,1,0,2,0,1,1,0,1 },

{ BLUE,0,0,0,1,1,1,1,2 },

{ MAGENTA,0,0,0,1,0,2,1,2 },

{ MAGENTA,2,0,0,1,1,1,2,1},

{ MAGENTA,0,0,1,0,1,1,1,2 },

{ MAGENTA,0,0,0,1,1,0,2,0 },

{ YELLOW,0,2,1,0,1,1,1,2 },

{ YELLOW,0,0,1,0,2,0,2,1 },

{ YELLOW,1,0,0,0,0,1,0,2},

{ YELLOW,0,0,0,1,1,1,2,1 },

};

int nback,nleft,nright,r_f[12][22],rs1,rs2,xcors,xcorb,ycors,ycorb;

/检查方快有没有左,右,下接触,游戏区内所有格子有无颜色记录数组,rs1形状记录,rs2为提示框用,记录小格子在游戏区中的位置,按键存储/

void interrupt (oldint)(); /系统定时中断/

int count_down=0,count_other=0; /中断记时/

void interrupt newint() /设置新的中断程序/

{ count_down++;

count_other++;

oldint();

}

void intenable() /设置中断向量表,启动新的中断程序/

{ oldint=getvect(0x1c);

disable();

setvect(0x1c,newint);

enable();

}

void intrestore() /恢复中断向量/

{ disable();

setvect(0x1c,oldint);

enable();

}

void HZ12(int x0,int y0,int w,int color,char s) /根据字模,在dos下显示汉字/

/横坐标,纵坐标,字间隔,汉字颜色,汉字字符串/

{ FILE fp;

register char buffer[24];

register char str[2];

unsigned long fpos;/fpos为最终偏移动量/

register int i,j,k;

fp=fopen(hzk12,r);/打开1212汉字苦/

while(s)/一直到字符串结束为止/

{

if(s<0)/汉字输出/

{ str[0]=(s)-0xa0;

str[1]=(s+1)-0xa0;

fpos=((str[0]-1)94+(str[1]-1))24L;/计算汉字在hzk12的偏移量/

fseek(fp,fpos,SEEK_SET);/指针移动到当前位置/

fread(buffer,24,1,fp);/读取一个汉字到数组中/

for(i=0;i<12;i++)/12行/

for(j=0;j<2;j++)/两个字节/

for(k=0;k<8;k++)/8位/

if (((buffer[i2+j]>>(7-k))&0x1)!=NULL)/是一就画点/

putpixel(x0+8j+k,y0+i,color);

s+=2;/一个汉字占两个字节,现在将指针移动两个字节/

x0+=w;/显示坐标也按照间隔移动/

}

else/显示非汉字字符/

{ settextstyle(0,0,1);

setcolor(color);

str[0]=s;str[1]=0;

outtextxy(x0,y0+3,str);/显示单个字符/

x0+=w-7;/显示单个字符后的x坐标变化/

s++;/指针移动到下一个字节/

}

}

fclose(fp);

}

void translation() /把相对坐标解释为绝对坐标/

{ if(RARx==1)

{ RAx1=1; RAx2=16; }

else

{ RAx1=16(RARx-1); RAx2=16RARx; }

if(RARy==1)

{ RAy1=1; RAy2=16; }

else

{ RAy1=16(RARy-1); RAy2=16RARy; }

}

int check_b() /检查是否到达低部/

{ int x,y,i,zf=0; /zf为是否有颜色填充记录/

for(i=0;i<7;i++,i++)

{ x=RARx+p[rs1]co[i];

y=RARy+p[rs1]co[i+1];

if(y>=6)

zf+=r_f[x-15][y-6+1];

}

if(zf==0)

return 1;

else

return 0;

}

int finish()

{ int tfull=0,i; /判断顶层空间是否有填充/

for(i=1;i<11;i++)

tfull+=r_f[i][1];

if(tfull!=0)

return 1; /告诉judge()可以结束了/

}

int check_l() /检查形状是否与左接触/

{ int x,y,i,zf=0;

for(i=0;i<7;i++,i++)

{ x=RARx+p[rs1]co[i];

y=RARy+p[rs1]co[i+1];

if(y>6)

zf+=r_f[x-15-1][y-6];

if(y<=6&&x==16)

zf+=1;

}

if(zf==0)

return 1;

else

return 0;

}

int check_r() /检查形状是否与右接触/

{ /zf为是否有颜色填充记录/

int x,y,i,zf=0; /zf为是否有颜色填充记录/

for(i=0;i<7;i++,i++)

{

x=RARx+p[rs1]co[i];

y=RARy+p[rs1]co[i+1];

if(y>6)

zf+=r_f[x-15+1][y-6];

if(y<=6&&x==25)

zf+=1;

}

if(zf==0)

return 1;

else

return 0;

}

void check_touch()

{ nback=check_b();

nleft=check_l();

nright=check_r();

}

void draw(int cb) /画形状,cb=1以填充色画形状,cb=2以背景色画形状,cb=3以白色画形状/

{ int i,recordx=RARx,recordy=RARy;

for(i=0;i<7;i++,i++)

{ RARx+=p[rs1]co[i];

RARy+=p[rs1]co[i+1];

if(RARy<=6)

{ RARx=recordx;

RARy=recordy;

continue;

}

translation();

if(cb==1)

setfillstyle(1,p[rs1]attr);

else

if(cb==2)

setfillstyle(1,BLACK);

else

if(cb==3)

{ setfillstyle(1,WHITE);

r_f[RARx-15][RARy-6]=1; /置对应数组标记元素/

}

bar(RAx1+1,RAy1+1,RAx2-1,RAy2-1);

RARx=recordx;

RARy=recordy;

}

}

void mov(int key) /向下,左,右移动方块/

{ draw(2);

if(key==LEFT&&nleft)

RARx--;

else

if(key==RIGHT&&nright)

RARx++;

else

RARy++;

nback=check_b();

if(nback) /判断形状有没有到达底部,有就将其颜色变为白色/

draw(1);

else

draw(3);

}

void change() /变换形状/

{ int status=rs1,buffer,i,x,y,zf=0;

if(p[rs1]attr==p[rs1+1]attr)

rs1++;

else

while(p[rs1]attr==p[rs1-1]attr)

rs1--;

for(i=0;i<7;i++,i++) /检查变化形状后是否与已存形状发生冲突/

{ x=RARx+p[rs1]co[i];

y=RARy+p[rs1]co[i+1];

if(y>6)

zf+=r_f[x-15][y-6];

}

if(zf!=0)

rs1=status;

buffer=rs1;

rs1=status;

status=buffer;

draw(2);

buffer=rs1;

rs1=status;

status=buffer;

nback=check_b(); /判断变化后的形状是不是到达了低部,这个检查是十分必要的/

if(nback)

draw(1);

else

draw(3);

}

void accelerate()

{ if(count_down>=1)

{ check_touch(); /消除上一步动作对方块状态的影响/

count_down=0;

if(nback) /0表示到达底部,1表示没有到达/

mov(DOWN);

}

}

void drawbox() /画方块所在方框/

{ int xcor,ycor;

for(xcor=xcors;xcor<=xcorb;xcor++)

for(ycor=ycors;ycor<=ycorb;ycor++)

{ if(xcor==xcors||xcor==xcorb||ycor==ycors||ycor==ycorb)

{ RARx=xcor;

RARy=ycor;

translation();

setfillstyle(1,DARKGRAY);

bar(RAx1+1,RAy1+1,RAx2-1,RAy2-1);

}

}

}

void erasure(int k)

{ int i,j,recordx=RARx,recordy=RARy;

{ j=k-1;

for(;j>0;j--)

{ for(i=1;i<11;i++)

{ r_f[i][j+1]=r_f[i][j];

RARx=i+15;

RARy=j+1+6;

translation();

if(r_f[i][j+1]==1)

setfillstyle(1,WHITE);

else

setfillstyle(1,BLACK);

bar(RAx1+1,RAy1+1,RAx2-1,RAy2-1);

RARx=recordx;

RARy=recordy;

}

}

}

}

void pause()

{ HZ12(450,400,15,BLACK,正常);

HZ12(450,400,15,GREEN,暂停);

for(;;)

if(bioskey(1)&&bioskey(0)==SPACE)

{ clearkbd();

HZ12(450,400,15,BLACK,暂停);

HZ12(450,400,15,RED,正常);

return;

}

}

void judge()

{ int i,j,full=0; /full等于10说明某一行满,该消除了/

if(finish()) /判断游戏是否该结束了/

messagebox(); /win编程里有这个函数/

for(j=1;j<21;j++) /判断某一行是否满了/

{ for(i=1;i<11;i++)

full+=r_f[i][j];

if(full==10)

erasure(j); /消除这行/

full=0;

}

}

void update() /使程序可以重新运行/

{ cleardevice();

setbkcolor(BLACK);

initinfo(); /提示信息初始化/

initbox(); /游戏框架初始化/

srand((unsigned)time(NULL)); /随机器函数的初始化/

rs1=random(19);

rs2=random(19);

next_shape();

initposition(); /方块最开始的出现位置/

initremove(); /记录每个方格有无颜色填充数组初始化/

HZ12(450,400,15,RED,正常);

process();

}

void EXIT()

{ closegraph();

intrestore(); /恢复中断向量/

exit(0);

}

void initremove()

{ int i,j;

for(i=0;i<12;i++)

for(j=0;j<22;j++)

if(i==0||i==11||j==0||j==21)

r_f[i][j]=1;

else

r_f[i][j]=0;

}

void initinfo()

{ char aStr[2];

setcolor(RED);

outtextxy(450,100,This game's writer is:);

HZ12(450,140,15,RED,该程序作者:NULL);

outtextxy(525,110,NULL);

outtextxy(450,180,FUNCTION FOR KEYS:);

outtextxy(450,200,UP:change the shape);

outtextxy(450,210,DOWN:accelerate);

outtextxy(450,220,LEFT:move left);

outtextxy(450,230,RIGHT:move right);

outtextxy(450,240,ESC:exit this game);

outtextxy(450,250,SPACE:pause);

HZ12(450,260,20,RED,上:);

HZ12(450,280,20,RED,下:);

HZ12(450,300,20,RED,左:);

HZ12(450,320,20,RED,右:);

HZ12(450,340,20,RED,ESC:退出);

HZ12(450,360,15,RED,空格: 暂停/开始);

HZ12(450,380,15,RED,目前状态:);

HZ12(20,200,15,RED,下一个形状);

aStr[0]=24;

aStr[1]=0;

aStr[6]=0;

HZ12(480,260,12,GREEN,aStr);

HZ12(500,260,12,GREEN,( 变形 ));

aStr[0]=25;

aStr[1]=0;

HZ12(480,280,12,GREEN,aStr);

HZ12(500,280,12,GREEN,( 加速 ));

aStr[0]=27;

aStr[1]=0;

HZ12(480,300,12,GREEN,aStr);

HZ12(500,300,12,GREEN,向左);

aStr[0]=26;

aStr[1]=0;

HZ12(480,320,12,GREEN,aStr);

HZ12(500,320,12,GREEN,向右);

}

void messagebox()

{ int key;

setcolor(GREEN);

setfillstyle(1,DARKGRAY);

rectangle(220,200,420,300);

bar(221,201,419,299);

HZ12(280,210,15,GREEN,GAME OVER);

HZ12(275,230,15,GREEN,重新游戏: Y);

HZ12(275,270,15,GREEN,退出游戏: N);

HZ12(450,400,15,BLACK,正常);

HZ12(450,400,15,GREEN,GAME OVER);

for(;;)

if(bioskey(1))

{ key=bioskey(0);

if(key==Y)

{ clearkbd();

update();

}

else

if(key==N)

{ clearkbd();

EXIT();

}

else

clearkbd();

}

}

void initbox()

{ xcors=15; /画游戏框/

xcorb=26;

ycors=6;

ycorb=27;

drawbox();

xcors=2; /画提示框/

xcorb=7;

ycors=6;

ycorb=11;

drawbox();

}

void initposition()

{ RARx=18;

RARy=6-p[rs1]co[7];;

RAx1=0;

RAx2=0;

RAy1=0;

RAy2=0;

}

void next_shape() /画下一形状提示框/

{ int recordx=RARx,recordy=RARy,buffer;

RARx=3;

RARy=7;

draw(2);

buffer=rs1;

rs1=rs2;

rs2=buffer;

draw(1);

RARx=recordx;

RARy=recordy;

buffer=rs1;

rs1=rs2;

rs2=buffer;

}

void process() /游戏过程/

{ for(;;)

{ check_touch();

if(!nback)

{ rs1=rs2;

rs2=random(19); /产生另一种方块的码数/

initposition();

judge(); /判断某一行是否满了和这个游戏是否可以结束了/

draw(1);

next_shape();

}

if(count_other>=1)

{ count_other=0;

if(bioskey(1)) /对按键的处理/

{ int key=bioskey(0);

clearkbd(); /清除键盘缓冲队列/

if(key==ESC)

EXIT();

if(key==LEFT&&nleft&&nback)

mov(LEFT);

if(key==RIGHT&&nright&&nback)

mov(RIGHT);

if(key==UP&&nback)

change();

if(key==SPACE)

pause();

if(key==DOWN)

accelerate();

}

}

if(count_down>=4)

{ check_touch(); /消除上一步动作对方块状态的影响/

count_down=0;

if(nback) /0表示到达底部,1表示没有到达/

mov(DOWN);

}

}/for/

}

main()

{ int gdriver=DETECT,gmode=0;

initgraph(&gdriver,&gmode,d:turboc); /启动图形与中断部分/

intenable();

update();

}

"扫雷"小游戏C代码

#include<stdioh>

#include<mathh>

#include<timeh>

#include<stdlibh>

main( )

{char a[102][102],b[102][102],c[102][102],w;

int i,j;  /循环变量/

int x,y,z[999];  /雷的位置/

int t,s;  /标记/

int m,n,lei;  /计数/

int u,v;  /输入/

int hang,lie,ge,mo;  /自定义变量/

srand((int)time(NULL));  /启动随机数发生器/

leb1:  /选择模式/

printf("\n   请选择模式:\n   1标准  2自定义\n");

scanf("%d",&mo);

if(mo==2)  /若选择自定义模式,要输入三个参数/

{do

{t=0; printf("请输入\n行数 列数 雷的个数\n");

scanf("%d%d%d",&hang,&lie,&ge);

if(hang<2){printf("行数太少\n"); t=1;}

if(hang>100){printf("行数太多\n");t=1;}

if(lie<2){printf("列数太少\n");t=1;}

if(lie>100){printf("列数太多\n");t=1;}

if(ge<1){printf("至少要有一个雷\n");t=1;}

if(ge>=(hanglie)){printf("雷太多了\n");t=1;}

}while(t==1);

}

else{hang=10,lie=10,ge=10;}  /否则就是选择了标准模式(默认参数)/

for(i=1;i<=ge;i=i+1)  /确定雷的位置/

{do

{t=0; z[i]=rand( )%(hanglie);

for(j=1;j<i;j=j+1){if(z[i]==z[j]) t=1;}

}while(t==1);

}

for(i=0;i<=hang+1;i=i+1)  /初始化a,b,c/

{for(j=0;j<=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }

for(i=1;i<=hang;i=i+1)

{for(j=1;j<=lie;j=j+1) {a[i][j]='+';} }

for(i=1;i<=ge;i=i+1)  /把雷放入c/

{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}

for(i=1;i<=hang;i=i+1)  /计算b中数字/

{for(j=1;j<=lie;j=j+1)

{m=48;

if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;

if(c[i-1][j]=='#')m=m+1;  if(c[i+1][j+1]=='#')m=m+1;

if(c[i][j+1]=='#')m=m+1;  if(c[i+1][j]=='#')m=m+1;

if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;

b[i][j]=m;

}

}

for(i=1;i<=ge;i=i+1)  /把雷放入b中/

{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}

lei=ge;  /以下是游戏设计/

do

{leb2:  /输出/

system("cls");printf("\n\n\n\n");

printf("    ");

for(i=1;i<=lie;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c  ",w);

}

printf("\n   |");

for(i=1;i<=lie;i=i+1){printf("---|");}

printf("\n");

for(i=1;i<=hang;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c |",w);

for(j=1;j<=lie;j=j+1)

{if(a[i][j]=='0')printf("   |");

else printf(" %c |",a[i][j]);

}

if(i==2)printf(" 剩余雷个数");

if(i==3)printf(" %d",lei);

printf("\n   |");

for(j=1;j<=lie;j=j+1){printf("---|");}

printf("\n");

}

scanf("%d%c%d",&u,&w,&v);  /输入/

u=u+1,v=v+1;

if(w!='#'&&a[u][v]=='@')

goto leb2;

if(w=='#')

{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}

else if(a[u][v]=='@'){a[u][v]=''; lei=lei+1;}

else if(a[u][v]==''){a[u][v]='+';}

goto leb2;

}

a[u][v]=b[u][v];

leb3:  /打开0区/

t=0;

if(a[u][v]=='0')

{for(i=1;i<=hang;i=i+1)

{for(j=1;j<=lie;j=j+1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;  if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=1;i<=hang;i=i+1)

{for(j=lie;j>=1;j=j-1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;   if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=hang;i>=1;i=i-1)

{for(j=1;j<=lie;j=j+1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;  if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=hang;i>=1;i=i-1)

{for(j=lie;j>=1;j=j-1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;  if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=1;i<=hang;i=i+1)  /检测0区/

{for(j=1;j<=lie;j=j+1)

{if(a[i][j]=='0')

{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='')t=1;

if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='')t=1;

if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='')t=1;

if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='')t=1;

if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='')t=1;

if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='')t=1;

if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='')t=1;

if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='')t=1;

}

}

}

if(t==1)goto leb3;

}

n=0;  /检查结束/

for(i=1;i<=hang;i=i+1)

{for(j=1;j<=lie;j=j+1)

{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='')n=n+1;}

}

}

while(a[u][v]!='#'&&n!=(hanglie-ge));

for(i=1;i<=ge;i=i+1)  /游戏结束/

{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }

printf("    ");

for(i=1;i<=lie;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c  ",w);

}

printf("\n   |");

for(i=1;i<=lie;i=i+1){printf("---|");}

printf("\n");

for(i=1;i<=hang;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c |",w);

for(j=1;j<=lie;j=j+1)

{if(a[i][j]=='0')printf(" |");

else  printf(" %c |",a[i][j]);

}

if(i==2)printf(" 剩余雷个数");

if(i==3)printf(" %d",lei); printf("\n   |");

for(j=1;j<=lie;j=j+1) {printf("---|");}

printf("\n");

}

if(n==(hanglie-ge)) printf("你成功了!\n");

else printf("    游戏结束!\n");

printf("    重玩请输入1\n");

t=0;

scanf("%d",&t);

if(t==1)goto leb1;

}

/注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入0a9三个字符再按回车键。3行7列不是雷,则输入3a7回车;第8行第5列是雷,就输入8#5回车,9行0列是雷则输入9#0并回车/

/一个火柴人游戏,亲自验证,可运行/

/在编译时添加如下命令:-std=c++11,否则会编译错误/

#include <cstdio>

#include <cstdlib>

#include <Windowsh>

#include <thread>

#include <conioh>

using namespace std;

const unsigned char CTRL_KEY = 0XE0;

const unsigned char LEFT = 0X4B;

const unsigned char RIGHT = 0X4D;

const unsigned char DOWN = 0X50;

const unsigned char UP = 0X48;

int men2[2] = {0,0};

int women2[2]={10,10};

int Game();

void gotoxy( int x, int y ) //光标移动到(x,y)位置

{

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

COORD pos;

posX = x;

posY = y;

SetConsoleCursorPosition(handle,pos);

}

int clean( int mm, int nn )

{

gotoxy ( mm, nn );

printf ( " " );

gotoxy ( mm,nn+1);

printf ( " " );

gotoxy ( mm,nn+2);

printf (" ");

}

int men( int x, int y )

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);

gotoxy( x, y );

printf(" O");

gotoxy( x, y+1 );

printf("<H>");

gotoxy( x, y+2 );

printf("I I");

}

int women( int i, int j )

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);

gotoxy( i+1,j );

printf(" O");

gotoxy( i+1,j+1 );

printf("<H>");

gotoxy( i,j+2 );

printf("/I I\\");

}

int m=10, n=10;

int x=0;int y=0;

int TorF()

{

if ( x == m && y == n ) return 1;

else return 0;

}

int womenmove()

{

int turn;

int YNbreak=0;

while( YNbreak == 0 )

{

YNbreaak = TorF();

turn=rand()%3;

clean( m, n );

if( m < x ) m++;

else m--;

if( m == x )

{

if( n < y ) n++;

else n--;

}

if ( m < 0 ) m = 0;

if ( m >= 75 ) m = 75;

if ( n < 0 ) n = 0;

if ( n >= 22 ) n = 22;

women( m,n );

women2[0]=m;

women2[1]=n;

Sleep(100);

}

system ( "cls" );

gotoxy ( 28, 10 );

printf ( "You died!!!\n" );

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE);

system ( "pause" );

exit(0);

return 0;

}

int menmove()

{

system( "cls" );

while (1)

{

switch( getch())

{

case UP:y--;break;

case DOWN:y++;break;

case LEFT:x--;break;

case RIGHT:x++;break;

}

system( "cls" );

if ( x < 0 ) x = 0;

if ( x > 77 ) x = 77;

if ( y < 0 ) y = 0;

if ( y > 22 ) y = 22;

men( x, y );

men2[0] = x;

men2[1] = y;

}

}

int Game()

{

women( 10, 10 );

men( 0, 0 );

int t = 0;

thread qq( womenmove );

menmove();

qqjoin();

return 0;

}

int main()

{

system( "mode con cols=80 lines=25" );

printf ( "游戏开始后,随机按下一个键,唤醒你的蓝色小人如果你被红色的老女人碰到了,那么你就死了\n" );

printf ( "方向键 *** 控小人\n" );

system ( "pause" );

system ( "cls" );

Game();

return 0;

}

/留下您的赞再拿走,谢谢!/

以上就是关于C语言简易文字冒险游戏源代码全部的内容,包括:C语言简易文字冒险游戏源代码、求C语言小游戏源程序、c语言猜数字游戏源代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9308747.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存