急求C语言编译的小游戏(如扫雷),附带源代码和注释。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急求C语言编译的小游戏(如扫雷),附带源代码和注释。相关的知识,希望对你有一定的参考价值。

急求C语言编译的小游戏.EXE(如扫雷),附带源代码和注释.TXT。TXT文件最好不超过10KB。
采纳最佳答案后追加200分,多谢了!

扫雷游戏(c语言版)
已经编译运行确认了:

#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
struct

int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/
int roundnum;/*统计格子周围有多少雷*/
int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/
Mine[10][10];
int gameAGAIN=0;/*是否重来的变量*/
int gamePLAY=0;/*是否是第一次玩游戏的标志*/
int mineNUM;/*统计处理过的格子数*/
char randmineNUM[3];/*显示数字的字符串*/
int Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
void Init(void);/*图形驱动*/
void MouseOn(void);/*鼠标光标显示*/
void MouseOff(void);/*鼠标光标隐藏*/
void MouseSetXY(int,int);/*设置当前位置*/
int LeftPress(void);/*左键按下*/
int RightPress(void);/*鼠标右键按下*/
void MouseGetXY(void);/*得到当前位置*/
void Control(void);/*游戏开始,重新,关闭*/
void GameBegain(void);/*游戏开始画面*/
void DrawSmile(void);/*画笑脸*/
void DrawRedflag(int,int);/*显示红旗*/
void DrawEmpty(int,int,int,int);/*两种空格子的显示*/
void GameOver(void);/*游戏结束*/
void GameWin(void);/*显示胜利*/
int MineStatistics(int,int);/*统计每个格子周围的雷数*/
int ShowWhite(int,int);/*显示无雷区的空白部分*/
void GamePlay(void);/*游戏过程*/
void Close(void);/*图形关闭*/
void main(void)

Init();
Control();
Close();

void Init(void)/*图形开始*/

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

void Close(void)/*图形关闭*/

closegraph();

void MouseOn(void)/*鼠标光标显示*/

_AX=0x01;
geninterrupt(0x33);

void MouseOff(void)/*鼠标光标隐藏*/

_AX=0x02;
geninterrupt(0x33);

void MouseSetXY(int x,int y)/*设置当前位置*/

_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);

int LeftPress(void)/*鼠标左键按下*/

_AX=0x03;
geninterrupt(0x33);
return(_BX&1);

int RightPress(void)/*鼠标右键按下*/

_AX=0x03;
geninterrupt(0x33);
return(_BX&2);

void MouseGetXY(void)/*得到当前位置*/

_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;

void Control(void)/*游戏开始,重新,关闭*/

int gameFLAG=1;/*游戏失败后判断是否重新开始的标志*/
while(1)

if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/

GameBegain(); /*游戏初始画面*/
GamePlay();/*具体游戏*/
if(gameAGAIN==1)/*游戏中重新开始*/

gameAGAIN=0;
continue;


MouseOn();
gameFLAG=0;
if(LeftPress())/*判断是否重新开始*/

MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)

gameFLAG=1;
continue;


if(kbhit())/*判断是否按键退出*/
break;

MouseOff();

void DrawSmile(void)/*画笑脸*/

setfillstyle(SOLID_FILL,YELLOW);
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,BLACK);/*眼睛*/
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(BLACK);/*嘴巴*/
bar(287,80,293,81);

void DrawRedflag(int i,int j)/*显示红旗*/

setcolor(7);
setfillstyle(SOLID_FILL,RED);
bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);
setcolor(BLACK);
line(198+j*20,95+i*20,198+j*20,95+i*20+10);

void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/

setcolor(color);
setfillstyle(SOLID_FILL,color);
if(mode==0)/*没有单击过的大格子*/
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
else
if(mode==1)/*单击过后显示空白的小格子*/
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);

void GameBegain(void)/*游戏开始画面*/

int i,j;
cleardevice();
if(gamePLAY!=1)

MouseSetXY(290,70); /*鼠标一开始的位置,并作为它的初始坐标*/
MouseX=290;
MouseY=70;

gamePLAY=1;/*下次按重新开始的话鼠标不重新初始化*/
mineNUM=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
for(i=0;i<10;i++)/*画格子*/
for(j=0;j<10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();/*画脸*/
randomize();__page_break__
for(i=0;i<10;i++)/*100个格子随机赋值有没有地雷*/
for(j=0;j<10;j++)

Mine[i][j].num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/
if(Mine[i][j].num==1)
mineNUM++;/*现有雷数加1*/
else
Mine[i][j].num=2;
Mine[i][j].flag=0;/*表示没红旗标志*/

sprintf(randmineNUM,"%d",mineNUM); /*显示这次总共有多少雷数*/
setcolor(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM=100-mineNUM;/*变量取空白格数量*/
MouseOn();

void GameOver(void)/*游戏结束画面*/

int i,j;
setcolor(0);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(Mine[i][j].num==1)/*显示所有的地雷*/

DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(200+j*20,100+i*20,7,7);


void GameWin(void)/*显示胜利*/

setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOU WIN!");

int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/

int nNUM=0;
if(i==0&&j==0)/*左上角格子的统计*/

if(Mine[0][1].num==1)
nNUM++;
if(Mine[1][0].num==1)
nNUM++;
if(Mine[1][1].num==1)
nNUM++;

else
if(i==0&&j==9)/*右上角格子的统计*/

if(Mine[0][8].num==1)
nNUM++;
if(Mine[1][9].num==1)
nNUM++;
if(Mine[1][8].num==1)
nNUM++;

else
if(i==9&&j==0)/*左下角格子的统计*/

if(Mine[8][0].num==1)
nNUM++;
if(Mine[9][1].num==1)
nNUM++;
if(Mine[8][1].num==1)
nNUM++;

else
if(i==9&&j==9)/*右下角格子的统计*/

if(Mine[9][8].num==1)
nNUM++;
if(Mine[8][9].num==1)
nNUM++;
if(Mine[8][8].num==1)
nNUM++;

else if(j==0)/*左边第一列格子的统计*/

if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;

else if(j==9)/*右边第一列格子的统计*/

if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;

else if(i==0)/*第一行格子的统计*/

if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;

else if(i==9)/*最后一行格子的统计*/

if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;

else/*普通格子的统计*/

if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
__page_break__
return(nNUM);/*把格子周围一共有多少雷数的统计结果返回*/

int ShowWhite(int i,int j)/*显示无雷区的空白部分*/

if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/
return;
mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/
if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/

DrawEmpty(i,j,1,7);
Mine[i][j].num=0;

else
if(Mine[i][j].roundnum!=0)/*输出雷数*/

DrawEmpty(i,j,0,8);
sprintf(randmineNUM,"%d",Mine[i][j].roundnum);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/
return ;

/*8个方向递归显示所有的空白格子*/
if(i!=0&&Mine[i-1][j].num!=1)
ShowWhite(i-1,j);
if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)
ShowWhite(i-1,j+1);
if(j!=9&&Mine[i][j+1].num!=1)
ShowWhite(i,j+1);
if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)
ShowWhite(i+1,j+1);
if(i!=9&&Mine[i+1][j].num!=1)
ShowWhite(i+1,j);
if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)
ShowWhite(i+1,j-1);
if(j!=0&&Mine[i][j-1].num!=1)
ShowWhite(i,j-1);
if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)
ShowWhite(i-1,j-1);

void GamePlay(void)/*游戏过程*/

int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/
while(!kbhit())

if(LeftPress())/*鼠标左键盘按下*/

MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/

MouseOff();
gameAGAIN=1;
break;

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

j=(MouseX-190)/20;/*x坐标*/
i=(MouseY-90)/20;/*y坐标*/
if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/
continue;
if(Mine[i][j].num!=0)/*如果格子没有处理过*/

if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/

MouseOff();
GameOver();/*游戏失败*/
break;

else/*鼠标按下的格子不是地雷*/

MouseOff();
Num=MineStatistics(i,j);
if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/
ShowWhite(i,j);
else/*按下格子周围有地雷*/

sprintf(randmineNUM,"%d",Num);/*输出当前格子周围的雷数*/
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM--;

MouseOn();
Mine[i][j].num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/
if(mineNUM<1)/*胜利了*/

GameWin();
break;





if(RightPress())/*鼠标右键键盘按下*/

MouseGetXY();
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

j=(MouseX-190)/20;/*x坐标*/
i=(MouseY-90)/20;/*y坐标*/
MouseOff();
if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/

DrawRedflag(i,j);
Mine[i][j].flag=1;

else
if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/

DrawEmpty(i,j,0,8);
Mine[i][j].flag=0;


MouseOn();
sleep(1);


参考技术A 在不同机子上编译时需修改init()函数中TC路径

#include "graphics.h"
#include "stdlib.h"
#include "math.h"
#include "bios.h"
#define pi 3.14
#define r 10
#define right 8292
#define left 7777
#define esc 283
#define pause 14624
struct ball

int x,y;
int oldx,oldy;
int derection;/*球的方向采用角度制,范围是0-360度*/
ball;
struct platform

int x,y;
unsigned key;
int oldx,oldy;
platform;
int score=0;/*得分*/
int speed=1;/*速度*/
unsigned key;
void init();
void base();
void scoreview();
void play();
double change(int x);
void gameover();
void close();
void main()

init();
base();
scoreview();
play();
getch();
close();


void init()/*初始化图形模式*/

int gm=DETECT,gd;
initgraph(&gm,&gd,"G:\\tc\\bgi");/*根据不同的TC进行路径修改*/


void close()/*关闭图形模式*/

closegraph();


void base()/*画边框,球以及板并且对球和板的各参数初始化*/

int i;
setbkcolor(GREEN);
setcolor(8);
setfillstyle(4,LIGHTGRAY);
rectangle(149,149,501,351);
rectangle(140,140,510,360);
floodfill(141,141,8);
setfillstyle(9,BLUE);
platform.x=300;
platform.y=343;
bar(platform.x,platform.y,platform.x+40,platform.y+5);
randomize();
ball.x=random(330)+160;
ball.y=160;
ball.derection=random(30)+280;

setfillstyle(1,YELLOW);
setcolor(YELLOW);
fillellipse(ball.x,ball.y,r,r);

void scoreview()/*显示当前的得分数*/

char sco[20];
setcolor(WHITE);
setfillstyle(1,YELLOW);
bar(300,50,440,80);
sprintf(sco,"score:%d",score);
setcolor(RED);
settextstyle(0,0,2);
outtextxy(310,60,sco);


void play()

int i=5;
settextstyle(0,0,2);
setcolor(11);
outtextxy(50,400,"'A'for left 'D'for right");/*提示各个控制键*/
outtextxy(50,450,"'space'for pause 'ESC' for quit");
setcolor(RED);
setfillstyle(1,GREEN);
while(!kbhit())/*开始之前提示按任意键进入游戏,且提示不停闪烁*/

outtextxy(100,100,"press any key to begin!");
delay(400);
bar(100,100,500,120);
delay(400);


while(1)

while(!kbhit())


ball.oldx=ball.x;
ball.oldy=ball.y;/*记录下当前球的位置*/
/*根据球的方向来利用角度的正切值来改变球的坐标*/
if(ball.derection>0&&ball.derection<90) ball.x+=10;ball.y+= (-10*tan(change(ball.derection)));
if(ball.derection>90&&ball.derection<180) ball.x+=-10;ball.y+=(10*tan(change(ball.derection)));
if(ball.derection>180&&ball.derection<270) ball.x+=-10;ball.y+=(10*tan(change(ball.derection)));
if(ball.derection>270&&ball.derection<360) ball.x+=10;ball.y+=(-10*tan(change(ball.derection)));
if(ball.y+r>=platform.y)/*如果球到底有两种情况*/
if(ball.x+r-platform.x<0||ball.x-r-platform.x>40) /*球不在板上*/


ball.y=platform.y-r+7;
setfillstyle(1,GREEN);
setcolor(GREEN);
fillellipse(ball.oldx,ball.oldy,r,r);
/*球在游戏结束处闪烁五次*/
while(i)

setfillstyle(1,YELLOW);
setcolor(YELLOW);
fillellipse(ball.x,ball.y,r,r);
delay(300);
setfillstyle(1,GREEN);
setcolor(GREEN);
fillellipse(ball.x,ball.y,r,r);
delay(300);
i--;

gameover();/*游戏结束*/

else ball.y=platform.y-r;
ball.derection=360-ball.derection;/*球在板上的话得一分,且速度加一但不能超过5*/
score++;
speed++;
if(speed>5) speed=5;
scoreview();/*刷新得分*/


/*如果球撞墙或板后修正坐标并改变方向*/
if(ball.y-r<150)

ball.y=150+r;
ball.derection=360-ball.derection;

if(ball.x-r<150)

ball.x=150+r;
if(ball.derection>180&&ball.derection<270) ball.derection=540-ball.derection;
if(ball.derection>90&&ball.derection<180) ball.derection=180-ball.derection;


if(ball.x+r>500)

ball.x=500-r;
if(ball.derection>270&&ball.derection<360) ball.derection=540-ball.derection;
if(ball.derection>0&&ball.derection<90) ball.derection=180-ball.derection;

setfillstyle(1,GREEN);
setcolor(GREEN);
fillellipse(ball.oldx,ball.oldy,r,r);/*在先前位置用底色抹掉球*/
setfillstyle(1,YELLOW);
setcolor(YELLOW);
fillellipse(ball.x,ball.y,r,r);/*在新位置显示球*/
delay(150+(5-speed)*50);

/*对底板的控制*/
key=bioskey(0);
platform.oldx=platform.x;
platform.oldy=platform.y;/*记录下底板先前位置*/
/*通过方向键改变底板的坐标*/
if(key==right) platform.x+=15;
if(key==left) platform.x-=15;
if(key==esc) gameover();
/*如果暂停则闪烁提示按任意键(除暂停键)继续*/
if(key==pause)
while(!kbhit())

setcolor(RED);
outtextxy(10,20,"paused! press any key to continue.");
delay(400);
setfillstyle(1,GREEN);
bar(10,20,600,40);
delay(400);
;
if(platform.x<150) platform.x=150;
if(platform.x>460) platform.x=460;/*对底板坐标修正*/
setfillstyle(1,GREEN);
bar(platform.oldx,platform.y,platform.oldx+40,platform.y+5);/*在先前位置抹掉底板*/
setfillstyle(9,BLUE);
bar(platform.x,platform.y,platform.x+40,platform.y+5);/*在新位置显示底板*/



void gameover()/*游戏结束,显示最终得分*/

char buffer[50];
cleardevice();
sprintf(buffer,"your final score is:%d",score);
setcolor(BLUE);
settextstyle(0,0,3);
outtextxy(100,300,buffer);
setcolor(RED);
settextstyle(0,0,5);
outtextxy(0,150,"thanks for play!");
getch();
exit(0);


double change(int x)/*将角度转化为弧度*/

double radians;
return(x*pi/180);
参考技术B

小游戏2048:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<time.h>

#include<windows.h>

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 setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

 SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);

  //用于控制字符颜色的函数

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 cursor_info=1,0;  //以下两行是隐藏光标的设置

 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);

 setColor(14, 0);   //设置字体淡黄色,背景为黑色

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

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(7*j+9,2*i+4);   //gtxy(7*j+9, 2*i+4)是光标到指定位置输出数字

       if(a[i][j]==0)printf("      "); setColor(7, 0); printf("│");

       else if(a[i][j]<10) if (a[i][j] == 2) setColor(14, 0);

                                  else if (a[i][j] == 4) setColor(13, 0);

                                  else if (a[i][j] == 8) setColor(12, 0);

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

                               

      else if (a[i][j] < 100)if (a[i][j] == 16) setColor(12, 0);

                                     else if (a[i][j] == 32) setColor(10, 0);

                                     else if (a[i][j] == 64) setColor(2, 0);

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

                                  

     else if (a[i][j] < 1000) if (a[i][j] == 128) setColor(9, 0);

                                         else if (a[i][j] == 256) setColor(1, 0);

                                         else if (a[i][j] == 512) setColor(13, 0);

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

                                      

      else if (a[i][j] < 10000) if (a[i][j] == 1024) setColor(5, 0);

                                           else setColor(15, 0);

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

                                        

  

 if (jsk( ) == 0)

      yes( );  if (over) gtxy(9,12); setColor(10, 0);

                                  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 coord;

  coord.X = x;

  coord.Y = y;

  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

c语言(小游戏)移动的任意物体的实现 附带原码和注释 可以直接实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>//
#include<conio.h>//监听键盘的输入

int direct = '0';
void gotoxy(int x, int y)//辅助函数系统自带 可以改变光标位置
{
    COORD pos = { x,y };
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);//这个一定要定义到全局里面 这一串函数可以直接引用 不用管怎么来的
}
struct circle//定义一个球
{
    int x;
    int y;

}circle;

void move()
{
    while (1)
    {

        if (_kbhit)
        {
            fflush(stdin);
            direct = _getch();
            gotoxy(circle.x, circle.y);
            printf(" ");
            switch (direct)
            {
            case 'w':
                circle.y--;//这个是选择语句之后执行的内容
                break;
            case 'a':
                circle.x -= 2;
                break;
            case 's':
                circle.y++;
                break;
            case 'd':
                circle.x += 2;
                break;

            }
            gotoxy(circle.x, circle.y);
            printf("o");//这里是定义你想要移动物体的形状可以随意修改
            gotoxy(80, 0);

        }





   }



}





int main()
{
    printf("欢迎进入游戏的世界 w为向上运动 a为左 d为右 s为下运动");
    move();


    return 0;
}

以上是关于急求C语言编译的小游戏(如扫雷),附带源代码和注释。的主要内容,如果未能解决你的问题,请参考以下文章

[C语言]扫雷小游戏实现 注释 代码

[C语言]扫雷小游戏实现 注释 代码

C语言—实现扫雷游戏(注释详解)

C语言项目实战:《扫雷游戏》零基础项目,230 行源码注释示例

c语言期中项目实战二—简易扫雷,思路分析加代码详细注释

如何用C语言快速实现初级版扫雷(步骤详细)