扫雷c语言最简单代码新手(扫雷c语言代码9×9)

http://www.itjxue.com  2023-03-07 00:26  来源:未知  点击次数: 

如何用C语言编程 扫雷!~

俄罗斯方快

扫雷

#includestdio.h

#includegraphics.h

#includestdlib.h

struct list

{

int x;

int y;

int num;

int bomb;

int wa;

};

struct list di[10][10];

int currentx=210;

int currenty=130;

void initxy(void)

{

int i,j;

for(i=0;i=9;i++)

for(j=0;j=9;j++)

{

di[j].x=i*20+200;

di[j].y=j*20+120;

di[j].wa=0;

di[j].bomb=0;

}

}

void initmu(void)

{

int i,j;

setcolor(2);

rectangle(200,120,400,320);

rectangle(190,110,410,330);

setfillstyle(8,14);

floodfill(191,111,2);

for(i=0;i=9;i++)

for(j=0;j=9;j++)

rectangle(di[j].x,di[j].y,di[j].x+19,di[j].y+19);

outtextxy(450,200,"press 'enter' to kick");

outtextxy(450,250,"press '\' to mark");

}

void randbomb(void)

{

int k;

int i,j;

randomize();

for(i=0;i=9;i++)

for(j=0;j=9;j++)

{

k=random(5);

if(k==2)

di[j].bomb=1;

}

}

void jisuan(void)

{

int k=0;

int i,j;

for(i=0;i=9;i++)

for(j=0;j=9;j++)

{

if(ijdi[i-1][j-1].bomb)

k=k+1;

if(idi[i-1][j].bomb)

k=k+1;

if(jdi[j-1].bomb)

k=k+1;

if(i=8di[i+1][j].bomb)

k=k+1;

if(j=8di[j+1].bomb)

k=k+1;

if(i=8j=8di[i+1][j+1].bomb)

k=k+1;

if(ij=8di[i-1][j+1].bomb)

k=k+1;

if(i=8jdi[i+1][j-1].bomb)

k=k+1;

di[j].num=k;

k=0;

}

}

void xianbomb(void)

{

int i,j;

char biaoji[2];

char znum[2];

biaoji[0]=1;

biaoji[1]=NULL;

for(i=0;i=9;i++)

for(j=0;j=9;j++)

{

if(di[j].bomb==1)

outtextxy(di[j].x+2,di[j].y+2,biaoji);

else

{

itoa(di[j].num,znum,10);

setfillstyle(1,0);

bar(i*20+202,j*20+122,i*20+218,j*20+138);

outtextxy(i*20+202,j*20+122,znum);

}

}

}

void move(void)

{

int key;

key=bioskey(1);

if(key)

key=bioskey(0);

if(key==0x4800)

{

if(currenty130)

{

setcolor(0);

circle(currentx,currenty,5);

currenty-=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currenty=310;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x4b00)

{

if(currentx210)

{

setcolor(0);

circle(currentx,currenty,5);

currentx-=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currentx=390;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x4d00)

{

if(currentx390)

{

setcolor(0);

circle(currentx,currenty,5);

currentx+=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currentx=210;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x5000)

{

if(currenty310)

{

setcolor(0);

circle(currentx,currenty,5);

currenty+=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currenty=130;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x1c0d)

{

int i,j;

char snum[2];

snum[0]=NULL;

snum[1]=NULL;

i=(currentx-210)/20;

j=(currenty-130)/20;

if(di[j].bomb==1)

{

outtextxy(100,100,"game over");

xianbomb();

sleep(2);

exit(0);

}

if(di[j].bomb==0)

{

di[j].wa=1;

setfillstyle(1,0);

bar(currentx-8,currenty-8,currentx+8,currenty+8);

setcolor(15);

itoa(di[j].num,snum,10);

outtextxy(currentx-8,currenty-8,snum);

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x2b5c)

{

char biaoji[2];

biaoji[0]=1;

biaoji[1]=NULL;

setcolor(0);

bar(currentx-8,currenty-8,currentx+8,currenty+8);

setcolor(4);

outtextxy(currentx-8,currenty-8,biaoji);

circle(currentx,currenty,5);

}

}

void success(void)

{

int k=1;

int i,j;

for(i=0;i=9;i++)

for(j=0;j=9;j++)

if(di[j].bomb==0di[j].wa==0)

k=0;

if(k==1)

{

outtextxy(100,100,"success good");

xianbomb();

sleep(2);

exit(0);

}

}

void main(void)

{

int gd=DETECT,gm;

initgraph(gd,gm,"");

initxy();

initmu();

randbomb();

jisuan();

setcolor(4);

circle(210,130,5);

while(1)

{

move();

success();

}

}

能在dev-c++上运行通过的扫雷,贪吃蛇,等小游戏的c语言代码

#includebits/stdc++.h

#includestdlib.h

#includedos.h

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;

int gamespeed=32000;

struct Food /*食物的结构体*/

{

int x; /*食物的横坐标*/

int y; /*食物的纵坐标*/

int yes; /*食物是否出现的变量*/

}food;

struct Snack /*蛇的结构体*/

{

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 PrScore(void); /*分数输出函数*/

DELAY(char ch)/*调节游戏速度*/

{

if(ch=='3')

{

delay(gamespeed); /*delay是延迟函数*/

}

else if(ch=='2')

{

delay(gamespeed);

}

}

Menu()/*游戏开始菜单*/

{

char ch;

printf("Please choose the gamespeed:\n");

printf("1-Fast 2-Normal 3-Slow\n");

printf("\nPlease Press The numbers..\n");

do

{ch=getch();}

while(ch!='1'ch!='2'ch!='3');

clrscr();

return(ch);

}

/*主函数*/

void main(void)

{

int ch;

ch=Menu();

Init();

DrawK();

GamePlay(ch);

Close();

}

void Init(void)

{

int gd=DETECT,gm;

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

cleardevice();

}

void DrawK(void)

{

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(char ch)

{

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

food.yes=1; /*1代表要出现食物,0表示以存在食物*/

snake.life=0;

snake.direction=1;

snake.x[0]=100;snake.y[0]=100;

snake.x[1]=110;snake.y[1]=100;

snake.node=2;

PrScore();

while(1) /*可以重复游戏*/

{

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

{

if(food.yes==1) /*需要食物*/

{

food.x=rand()%400+60;

food.y=rand()%350+60; /*使用rand函数随机产生食物坐标*/

while(food.x%10!=0)

food.x++;

while(food.y%10!=0)

food.y++; /*判断食物是否出现在整格里*/

food.yes=0; /*现在有食物了*/

}

if(food.yes==0) /*有食物了就要显示出来*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);

}

for(i=snake.node-1;i0;i--) /*贪吃蛇的移动算法*/

{

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1]; /*贪吃蛇的身体移动算法*/

}

switch(snake.direction) /*贪吃蛇的头部移动算法,以此来控制移动*/

{

case 1:snake.x[0]+=10;break;

case 2:snake.x[0]-=10;break;

case 3:snake.y[0]-=10;break;

case 4:snake.y[0]+=10;break;

}

for(i=3;isnake.node;i++) /*判断是否头部与身体相撞*/

{

if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])

{

GameOver();

snake.life=1;

break;

}

}

/*下面是判断是否撞到墙壁*/

if(snake.x[0]55||snake.x[0]595||snake.y[0]55||snake.y[0]455)

{

GameOver();

snake.life=1;

}

if(snake.life==1) /*如果死亡就退出循环*/

break;

if(snake.x[0]==food.xsnake.y[0]==food.y) /*判断蛇是否吃到食物*/

{

setcolor(0);

rectangle(food.x,food.y,food.x+10,food.y-10); /*吃的食物后用黑色将食物擦去*/

snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*现把增加的一节放到看不到的地方去*/

snake.node++;

food.yes=1;

score+=10;

PrScore();

}

setcolor(4); /*每次移动后将后面的身体擦去*/

for(i=0;isnake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);

delay(gamespeed);

DELAY(ch);

setcolor(0);

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

}

if(snake.life==1)

break;

key=bioskey(0); /*接受按键*/

if(key==ESC)

break;

else

if(key==UPsnake.direction!=4)/*判断是否改变方向*/

snake.direction=3;

else

if(key==RIGHTsnake.direction!=2)

snake.direction=1;

else

if(key==LEFTsnake.direction!=1)

snake.direction=2;

else

if(key==DOWNsnake.direction!=3)

snake.direction=4;

}

}

void GameOver(void)

{

cleardevice();

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,"scord:%d",score);

outtextxy(55,20,str);

}

void Close(void)

{

getch();

closegraph();

}

求用C++编写一个小游戏程序代码,如:俄罗斯方块,扫雷,拼图,贪吃蛇之类的……谢了……

我给你2个贪吃蛇c++代码

(1):

#include stdio.h

#include windows.h

#include time.h

#include conio.h

#include stdlib.h

//方向键的ASCLL值:上72,左75,右77,下80

//背景颜色的代码: 0=黑色 ?1蓝色 2 绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色

//**改变当前光标方块的背景颜色和字体颜色**//

void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); ?//获取控制台的句柄

SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色

}

//**改变光标的位置**//

void gotoxy(int x, int y) {8

HANDLE handle;

COORD coord; ? //获取坐标轴结构体

coord.X = x;

coord.Y = y;

handle = GetStdHandle(STD_OUTPUT_HANDLE); ?//获取控制台句柄,值为-11

SetConsoleCursorPosition(handle, coord); ? //移动光标到x,y处

}

//**初始化地图数据**//

void restart(int bk[20][20], int look[4], int move[20][20]) {

//bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇

//look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数

//move记录蛇走过的路程,用来打印蛇时判断用

int pp, qq; ?//用来记录获取的随机坐标

//接下来要初始化整个地图//

for(int i=0;i=16;i++)

for (int j = 0; j = 16; j++) {

if (i == 0 || i == 16 || j == 0 || j == 16) ?bk[i][j] = 1;//1表示墙体

else bk[i][j] = 0; //0表示什么都没有

move[i][j] = 0; ? ?//该数组用来记录蛇移动的轨迹

}

//将蛇初始化在8,8坐标上

bk[8][8] = 3;

move[8][8] = 1;//则此时8,8,上的轨迹就应该记录为1

move[0][0] = 1;//用此来记录步数

pp = rand() % 15 + 1;//范围是1-15

qq = rand() % 15 + 1;

bk[pp][qq] = 2;//表示这个位置有果实了

look[0] = 1;//表示朝向,向上

look[1] = 1;//表示长度

look[2] = 0;//当为1是表示失败

look[3] = 0;//记录得分

//接下来要绘制地图//

for(int i=0;i=16;i++)

for (int j = 0; j = 16; j++) {

gotoxy(i * 2, j);//光标移动,每个光标都是矩形

switch (bk[i][j]) {

case 0:

BackGround(0, 0);

break;//如果没有东西打印黑色

case 1:

BackGround(0, 1);

break;//墙打印蓝色

case 2:

BackGround(0, 2);

break;//果实打印绿色

case 3:

BackGround(0, 3);

break;//蛇打印湖蓝色

default:

break;

}

printf(" ?");//地图中直接就是涂空格符

}

//接下来要显示积分//

gotoxy(35, 0);

BackGround(7, 0);//用白字黑底打印

printf("现在得分是:%d,请再接再厉!^_^", look[2]);

}

//**运动主体**//

void map(int bk[20][20], int look[4], int xy[2], int move[20][20]) {

//bk是地图信息,look作数据记录,xy记录坐标,move记录蛇的运动轨迹

int b[10], qq=0, pp=0;//b用来吸收输入,qq和pp用来随机初始化果实坐标

if (kbhit()) {//记录按下的是哪个方向键

b[0] = getch();//用b来记录

if (b[0] == 224) ?b[0] = getch();//如果为224表示为方向键,但是要再一次获取才行

if (b[0] == 72 look[0] != 2)

//如果输入的为上并且朝向不为下

look[0] = 1;

if (b[0] == 80 look[0] != 1)

look[0] = 2;

if (b[0] == 75 look[0] != 4)

look[0] = 3;

if (b[0] == 77 look[0] != 3)

look[0] = 4;

}

switch (look[0]) {

case 1:

//往上走

xy[1]--;

break;

case 2:

//往下走

xy[1]++;

break;

case 3:

//往左走

xy[0]--;

break;

case 4:

//往右走

xy[0]++;

break;

}

//接下来蛇就开始走动了//

move[0][0]++;//蛇的步数加一

move[xy[0]][xy[1]] = move[0][0];//记录当前格子中蛇的轨迹

gotoxy(35, 2);

BackGround(7, 0);

printf("横坐标:%d,纵坐标:%d", xy[0],xy[1]);

gotoxy(xy[0] * 2, xy[1]);//这里蛇头就往前移动了

BackGround(0, 3);//与蛇体一个颜色

printf(" ?");

//如果吃了果实//

if (bk[xy[0]][xy[1]] == 2) {

look[2]++;//分数加一

look[1]++;//长度加一

//更新分数

gotoxy(35, 0);

BackGround(7, 0);

printf("现在得分是:%d,请再接再厉!^_^", look[2]);

while (bk[pp][qq] != 0) {

pp = rand() % 15 + 1;

qq = rand() % 15 + 1;

}

bk[pp][qq] = 2;//将这个地方变为果实

gotoxy(pp * 2, qq);

BackGround(0, 2);

printf(" ?");

}

//如果撞了墙或者自己//

if (bk[xy[0]][xy[1]] == 1 || bk[xy[0]][xy[1]] == 3) {

look[3] = 1;//表示已经输了

gotoxy(6, 6);

BackGround(7, 0);

printf("你输了,最后得分:%d", look[2]);

}

bk[xy[0]][xy[1]] = 3;//使这个位置变成蛇

//接下来要检测蛇然后刷新蛇的位置//

for(int i=0;i=16;i++)

for (int j = 0; j = 16; j++) {

if (move[i][j] == move[xy[0]][xy[1]] - look[1]){

//如果符合这个条件,则表示蛇已经移动出这个位置了

//要删除这个位置的蛇尾巴

//一次只有一个方块会符合要求吧?

bk[i][j] = 0;

gotoxy(i * 2, j);

BackGround(0, 0);

printf(" ?");

break;//一次只找一个

}

}

end:;

}

int main() {

int bk[20][20], xy[2], move[20][20], look[4];

xy[1] = xy[0] = 8;

srand((unsigned) time(NULL));//初始化随机种子

system("pause");

restart(bk, look, move);

while (look[3] == 0) {

Sleep(200);//休眠400ms一次

map(bk, look, xy, move);

}

system("pause");

printf("游戏结束,谢谢游玩!^_^");

return 0;

}

(2):

#include stdio.h

#include windows.h

#includeconio.h

#include stdlib.h

#includetime.h

#define X 23//地图的x轴

#define Y 75//地图的y轴

#define UP 0

#define DOWN 1

#define LEFT 2

#define RIGHT 3

#define WAIT_TIME 200//等待蛇刷新的时间,可以说是速度 ?修改可变速

int map_0[X][Y];//地图

int Snake[X*Y][2]; // 蛇

int Slength; //蛇的长度

int direction;

int score=0;

bool pdEatFood=false;

void csh();

void huaMap();

void huaSnake();

void gotoxy(int x,int y);

void move();

void intokey();

int check(int x,int y);

void putfood();

bool gameover();

void dy_fs();

int main()

{

csh();

huaMap();

putfood();

while(1)

{

huaSnake(); ? ? ? ? ? ?

Sleep(WAIT_TIME);

intokey();

move();

dy_fs();

if(gameover())

{

system("cls"); ? ? ? ? ?//清除屏幕内容

printf("Game Over\n");

system("pause");

getchar();

break;

}

if(map_0[Snake[0][0]][Snake[0][1]]==-1)

{

map_0[Snake[0][0]][Snake[0][1]]=0;

pdEatFood=true;

putfood();

score+=10;

}

}

return 0;

}

void csh()//初始化

{

srand((unsigned)time(NULL)); //设置种子为现在的时间

Slength=4;

gotoxy(0,0);

CONSOLE_CURSOR_INFO cursor_info = {1, 0}; //清除光标

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), cursor_info);

int x,y;

Snake[0][0]=X/2;

Snake[0][1]=Y/2;

for(x=0;xX;x++){

map_0[x][0]=1;

map_0[x][Y-1]=1;

}

for(y=1;yY-1;y++){

map_0[0][y]=1;

map_0[X-1][y]=1;

}

for(x=1;x4;x++){ //初始化蛇的坐标

Snake[x][0]=Snake[0][0]+x;

Snake[x][1]=Snake[0][1];

}

direction=UP;

}

void huaMap()//画地图

{

int x,y;

for(x=0;xX*1.01;x++){

for(y=0;yY*1.01;y++){

if(map_0[x][y]==1){

printf("#");

}

if(map_0[x][y]==0){

printf(" ");

}

}

printf("\n");

}

}

void huaSnake()//画蛇

{

int x;

for(x=0;xSlength;x++)

{

gotoxy(Snake[x][0],Snake[x][1]);

printf("@");

}

}

void gotoxy(int i,int j)//移动光标

{

COORD position={j,i};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);

}

void move()

{

int i;

gotoxy(Snake[Slength-1][0],Snake[Slength-1][1]);//擦除尾巴

printf(" "); ? ? ? ? ? ? ? ? ? ? ? ? ?

for(i=Slength-1;i0;i--) ? ?//从尾巴开始,每一个点的位置等于它前面一个点的位置

{

Snake[i][0]=Snake[i-1][0];

Snake[i][1]=Snake[i-1][1];

}

switch(direction)

{

case UP:

Snake[0][0]--;

break;

case DOWN:

Snake[0][0]++;

break;

case LEFT:

Snake[0][1]--;

break;

case RIGHT:

Snake[0][1]++;

break;

}

if(pdEatFood){

Slength++;

pdEatFood=false;

}

}

void intokey()

{

if(kbhit()!=0) ? ? ? ? ?//kbhit()函数 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0

{

char in;

while(!kbhit()==0) ?//如果玩家输入了多个按键,以最后一个按键为准

in=getch();

switch(in)

{

case 'w':

case 'W':

if(direction!=DOWN) ? ? ? ? //防止缩头

direction=UP;

break;

case 's':

case 'S':

if(direction!=UP)

direction=DOWN;

break;

case 'a':

case 'A':

if(direction!=RIGHT)

direction=LEFT;

break;

case 'd':

case 'D':

if(direction!=LEFT)

direction=RIGHT;

break;

case 'p':

case 'P':

gotoxy(X,0); ? ? ?

system("pause");

gotoxy(X,0);

printf(" ? ? ? ? ? ? ? ? ? "); ?// 消去下面的按任意键继续

break;

}

}

}

int check(int ii,int jj){// 检查是否能投放食物

if(map_0[ii][jj]==1)

return 0;

if(ii==0 || jj==0 || ii==X-1 || jj==Y-1)

return 0;

int i;

for(i=0;iSlength;i++){

if(ii==Snake[i][0] jj==Snake[i][1])

return 0;

}

return 1;

}

void putfood()

{

int i,j;

do{

i=rand()%X;

j=rand()%Y;

}while(check(i,j)==0);

map_0[i][j]=-1;

gotoxy(i,j);

printf("$");

}

bool gameover()

{

bool isgameover=false;

int sX,sY;

sX=Snake[0][0],sY=Snake[0][1];

if(sX==0 || sX==X-1 || sY==0 || sY==Y-1)

isgameover=true;

int i;

for(i=1;iSlength;i++){

if(sX==Snake[i][0] sY==Snake[i][1])

isgameover=true;

}

return isgameover;

}

void dy_fs()

{

gotoxy(X,0);

printf("(c)Geek------2018.1.22");

gotoxy(X+1,0);

printf("最终得分: %d",score);

}

管庆帆c/c++大师??

C语言 扫雷

#includestdio.h

int?main(void)

{

????char?plat[100][100];??//雷的地图

????char?plat_new[100][100];??//数字映射图

????int?n,?m;??//存储行、列数

????int?in,?im;

????int?mark?=?0;??//记录该点附近8个坐标雷的总数

????int?j?=?1;

?

????scanf("%d?%d",?n,?m);

????getchar();??//消除回车符的影响

?

????do?{

????????if?(n?==?0??m?==?0)

????????????break;

?

????????for?(in?=?0;?in??n;?in++)

????????{

????????????for?(im?=?0;?im??m;?im++)

????????????{

????????????????scanf("%c",?plat[in][im]);

????????????}

????????????getchar();

????????}

?

????????for?(in?=?0;?in??n;?in++)

????????????for?(im?=?0;?im??m;?im++)

????????????{

????????????????if?(plat[in][im]?==?'*')??/*该点有雷,无需检测*/

????????????????{

????????????????????plat_new[in][im]=?plat[in][im];

????????????????????continue;

????????????????}

?

????????????????if?(in?-?1?=?0)??//检测上面3个点的雷数

????????????????{

????????????????????if?(plat[in?-?1][im]?==?'*')

????????????????????????mark++;

?

????????????????????if?(im?-?1?=?0??plat[in?-1][im?-?1]?==?'*')

????????????????????????mark++;

?

????????????????????if?(im?+?1??mplat[in?-1][im?+?1]?==?'*')

????????????????????????mark++;

????????????????}

?

????????????????if?(im?-?1?=?0??plat[in][im-?1]?==?'*')??//检测左右两个点的雷数

????????????????????mark++;

????????????????if?(im?+?1??m??plat[in][im+?1]?==?'*')

????????????????????mark++;

?

????????????????if?(in?+?1??n)??//检测下面3个点的雷数

????????????????{

????????????????????if?(plat[in?+?1][im]?==?'*')

????????????????????????mark++;

?

????????????????????if?(im?-?1?=?0??plat[in?+1][im?-?1]?==?'*')

????????????????????????mark++;

?

????????????????????if?(im?+?1??mplat[in?+1][im?+?1]?==?'*')

????????????????????????mark++;

????????????????}

?

????????????????switch?(mark)

????????????????{

????????????????case?0:plat_new[in][im]?=?'0';?break;

????????????????case?1:plat_new[in][im]?=?'1';?break;

????????????????case?2:plat_new[in][im]?=?'2';?break;

????????????????case?3:plat_new[in][im]?=?'3';?break;

????????????????case?4:plat_new[in][im]?=?'4';?break;

????????????????case?5:plat_new[in][im]?=?'5';?break;

????????????????case?6:plat_new[in][im]?=?'6';?break;

????????????????case?7:plat_new[in][im]?=?'7';?break;

????????????????case?8:plat_new[in][im]?=?'8';?break;

????????????????}

????????????????mark?=?0;??//重置雷数

????????????}

????????if?(j?!=?1)

????????????putchar('\n');

????????printf("Field#%d:\n",?j);

?

????????for?(in?=?0;?in??n;?in++)??//打印数字地图

????????{

????????????for?(im?=?0;?im??m;?im++)

????????????{

????????????????printf("%c",?plat_new[in][im]);

????????????}

????????????if(in!=n-1)

????????????putchar('\n');

????????}

????????scanf("%d?%d",?n,?m);

????????getchar();

????????j++;

????}?while?(1);

????return?0;

}

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

扫雷游戏(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(_BX1);

}

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

{

_AX=0x03;

geninterrupt(0x33);

return(_BX2);

}

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(MouseX280MouseX300MouseY65MouseY85)

{

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;i10;i++)/*画格子*/

for(j=0;j10;j++)

DrawEmpty(i,j,0,8);

setcolor(7);

DrawSmile();/*画脸*/

randomize();__page_break__

for(i=0;i10;i++)/*100个格子随机赋值有没有地雷*/

for(j=0;j10;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;i10;i++)

for(j=0;j10;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==0j==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==0j==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==9j==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==9j==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==0Mine[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!=0Mine[i-1][j].num!=1)

ShowWhite(i-1,j);

if(i!=0j!=9Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1);

if(j!=9Mine[i][j+1].num!=1)

ShowWhite(i,j+1);

if(j!=9i!=9Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1);

if(i!=9Mine[i+1][j].num!=1)

ShowWhite(i+1,j);

if(i!=9j!=0Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1);

if(j!=0Mine[i][j-1].num!=1)

ShowWhite(i,j-1);

if(i!=0j!=0Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1);

}

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

{

int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/

for(i=0;i10;i++)

for(j=0;j10;j++)

Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/

while(!kbhit())

{

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

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)/*重新来*/

{

MouseOff();

gameAGAIN=1;

break;

}

if(MouseX190MouseX390MouseY90MouseY290)/*当前鼠标位置在格子范围内*/

{

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(mineNUM1)/*胜利了*/

{

GameWin();

break;

}

}

}

}

}

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

{

MouseGetXY();

if(MouseX190MouseX390MouseY90MouseY290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20;/*x坐标*/

i=(MouseY-90)/20;/*y坐标*/

MouseOff();

if(Mine[i][j].flag==0Mine[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);

}

}

}

c语言扫雷需要接口吗

C语言扫累不需要接口,基本思路如下。

1、构建一个游戏菜单。

2、创建一个test函数,利用switch语句实现进入游戏和退出游戏的操作。

3、创建棋盘,打印棋盘。

4、初始化一个二维数组。

5、布置雷,排雷即可。

(责任编辑:IT教学网)

更多

推荐Illustrator教程文章