VC++实现扫雷展开算法

VC++实现扫雷展开算法,第1张

void appear(char **s,char **p,int i,int j,int l)

{

if(0<=i&&i<=(l-1)&&0<=j&&j<=(l-1)&&s[i][j]!='0')

{

s[i][j]=p[i][j]

if(p[i][j]=='0')

{

appear(s,p,i-1,j-1,l)

appear(s,p,i-1,j,l)

appear(s,p,i-1,j+1,l)

appear(s,p,i,j+1,l)

appear(s,p,i+1,j+1,l)

appear(s,p,i+1,j,l)

appear(s,p,i+1,j-1,l)

appear(s,p,i,j-1,l)

}

}

}

这岩掘是我写的裤差关于展开空白的程序段。

也是用递归做的,思路是这样的:碰到数字就结束,碰到打开此空白格的母格,也停止。这样就能实现展开空白。剩粗纯核下的就是一些细枝末节的处理

#include<bits/stdc++.h>

#include<stdlib.h>

#include<dos.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=50i<=600i+=10)

{

rectangle(i,40,i+10,49)/*画出上边框*/

rectangle(i,451,i+10,460)/*画出下边框*/

}

for(i=40i<=450i+=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]=100snake.y[0]=100

snake.x[1]=110snake.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-1i>0i--) /*贪吃蛇的移动算法*/

{

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

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

}

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

{

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

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

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

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

}

for(i=3i<snake.nodei++) /*判断是否头部与身体相撞*/

{

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.x&&snake.y[0]==food.y) /*判断蛇是否吃到食物*/

{

setcolor(0)

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

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

snake.node++

food.yes=1

score+=10

PrScore()

}

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

for(i=0i<snake.nodei++)

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==UP&&snake.direction!=4)/*判断是否改变方向*/

snake.direction=3

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2

else

if(key==DOWN&&snake.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()

}

我给你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=0i<=16i++)

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

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=0i<=16i++)

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

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=0i<=16i++)

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

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>

#include<conio.h>

#include <stdlib.h>

#include<time.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=0x<Xx++){

map_0[x][0]=1

map_0[x][Y-1]=1

}

for(y=1y<Y-1y++){

map_0[0][y]=1

map_0[X-1][y]=1

}

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

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

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

}

direction=UP

}

void huaMap()//画地图

{

int x,y

for(x=0x<X*1.01x++){

for(y=0y<Y*1.01y++){

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

printf("#")

}

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

printf(" ")

}

}

printf("\n")

}

}

void huaSnake()//画蛇

{

int x

for(x=0x<Slengthx++)

{

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-1i>0i--)    //从尾巴开始,每一个点的位置等于它前面一个点的位置

{

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=0i<Slengthi++){

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=1i<Slengthi++){

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++大师

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

原文地址: https://outofmemory.cn/yw/12494574.html

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

发表评论

登录后才能评论

评论列表(0条)

保存