📄 cpp3.cpp
字号:
#include<bios.h>
#define ENTER 0xlc0d
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ESC 0x011b
#define SPACE 0x3920
#define LOWERF 0x2166
#define UPPERF 0x2146
#define LOWERA 0x1e61
#define UPPERA 0X1e41
#define LOWERQ 0X1071
#define UPPERQ 0X1051
int getKey(void){
while(1){
int key=bioskey(0);
switch(key){
case ENTER:
case UP:
case DOWN:
case LEFT:
case RIGHT:
case ESC:
case SPACE:
case LOWERF:
case UPPERF:
case LOWERA:
case UPPERA:
case LOWERQ:
case UPPERQ:return key;
}
}
}
#include<graphics.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#define ROW 16
#define COL 16
#define STARTS 50
#define STARTY 50
#define SIZEX 20
#define SIZEY 20
#define UNFLAG 0
#define FLAGED 1
#define QUESTION 20
#define EXPLOD 30
#define OPEN 40
int table[ROW][COL];
int num[ROW][COL];
int flag[ROW][COL];
int pi,pj;
int di[8]={-1,-1,0,1,1,1,0,-1};
int dj[8]={0,1,1,1,0,-1,-1,-1}
void initGraph(){
int gdriver=DETECT,gmode,errorcode;
initgraph(&gdriver,&gmode,"f:\TC\");
errorcode=graphresult();
if(errorcode!=grOk)
{
printf("Graphics error:%s\n",grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
}
void generateMine(){
int totalMine;
int i,k;
int ri,rj;
int ni,nj;
static int seed=0;
totalMine=ROW * COL/6;
memset(table,0,sizeof(table));
memset(num,0,sizeof(num));
srand(seed++);
for(i=0;i<totalMine;i++){
do{
ri=rand()%ROW;
rj=rand()%COL;
}while(table[ri][rj]);
for(k=0;k<8;k++){
ni=ri+di[k];
nj=rj+dj[k];
if(ni>=0&&ni<ROW&&nj>=0&&nj<COL) num[ni][nj]++;
}
table[ri][rj]=1;
}
memset(flag,UNFLAG,sizeof(flag));
}
void drawBlock(int i,int j){
intx,y,xx,yy;
int color;
int mx,my;
x=STARTX+J*SIZEX;
y=STARTY+I*SIZEY;
xx=x+SIZEX-1;
yy=y+SIZEY-1;
color=(flag[i][j]==UNFLAG)?LIGHTGRAY:DARKGRAY;
setcolor(WHITE);
rectangle(x,y,xx,yy);
setfillstyle(SOLID_FILL,color);
floodfill(x+1,y+1,WHITE);
setcolor(WHITE);line(x,y,xx,y);line(x,y,x,yy);
setcolor(BLACK);line(xx,y,xx,yy);line(x,yy,xx,yy);
if(pi==i&&pj==j){
setcolor(RED);
rectangle(x+1,y+1,xx-1,yy-1);
}
mx=x+5;
my=y+5;
setcolor(LIGHTGRAY);
switch(flag[i][j]){
case UNFLAG:
outtextxy(mx,my,"");
break;
case FLAGED:
outtextxy(mx,my,"F";)
break;
case QUESTION:
outtextxy(mx,my,"?";)
break;
case EXPLOD:
outtextxy(mx,my,"*";)
break;
case OPEN:
if(num[i][j]>=1 && num[i][j]<=8){
char buf[3];
itoa(num[i][j],buf,10);
outtextey(mx,my,buf);
}
break;
}
}
void drawTable(){
int i,j;
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++) drawBlock(i,j);
}
void newGame(){
cleardevice();
generateMine();
pi=pj=0;
drawTable();
}
int checkWin();{
int i,j;
for(i=0;i<ROW;i++){
for(j=0;j<COL;j++){
if(table[i][j]==0 && flag[i][j]!=OPEN) return 0;
}
}
return 1;
}
int confirm(int res){
char buffer[100];
int kk;
if(res==1){
strcpy(buffer,"You win the game,play again(Y/N)?");
}
else if(res==-1){
strcpy(buffer,"Exit game,play again(Y/N)?");
}
setcolor(WHITE);
outtextxy(0,0,buffer);
kk=bioskey(0);
kk=(kk&0xff);
if(kk=='Y'||kk=='y') return 0;
return 1;
}
void moveUp(){
if(pi>0){
pi--;
drawBlock(pi,pj);
drawBlock(pi+1,pj);
}
}
void moveDown(){
if(pi<ROW-1){
pi++;
drawBlock(pi,pj);
drawBlock(pi,pj+1);
}
}
void moveRight(){
if(pj<COL-1){
pj++;
drawBlock(pi,pj);
drawBlock(pi,pj-1);
}
}
void flagBlock(int i,int j){
if(flag[i][j]==FLAGED){
flag[i][j]=UNFLAG;
}
else if(flag[i][j]==UNFLAG){
flag[i][j]=FLAGED;
}
drawBlock(i,j);
}
void questBlock(int i,int j){
if(flag[i][j]==QUESTION){
flag[i][j]=UNFLAG;
}
else {
if(flag[i][j]==UNFLAG)
flag[i][j]=QUESTION;
}
drawBlock(i,j);
}
int openMine(int i,int j)[
int ii,jj,k;
if(flag[i][j]==OPEN) return 0;
if(table[i][j]){
for(ii=0;ii<ROW;ii++){
for(jj=0;jj<COL;jj++){
if(flag[ii][jj] && flag[ii][jj]==UNFLAG){
flag[ii][jj]=EXPLOD;
drawBlock(ii,jj);
}
}
}
return -1;
}
else{
flag[i][j]=OPEN;
drawBlock(i,j);
if(num[i][j]==0){
for(k=0;k<8;k++){
int ni=i+di[k];
int nj=j+dj[k];
if(ni>=0 && ni<ROW && nj>=0 && nj<COL)
openMine(ni,nj);
}
}
return 0;
}
}
int autoopen(int i,int j){
int k,c=0;
int ni,nj;
int ret=0;
if(!(flag[i][j]==OPEN)) return 0;
for(k=0;k<8;k++){
ni=i+di[k];
nj=j+dj[k];
if(ni>=0 && ni<ROW &&nj>=0 &&nj<COL)
if(flag[ni][nj]==FLAGED) c++;
}
if(c==num[i][j]){
for(k=0;k<8;k++){
int ni=i+di[k];
int nj=j+dj[k];
if(ni>=0 && ni<ROW && nj>=0 && nj<COL)
if(flag[ni][ji]==UNFLAG){
if(openMine(ni,nj)==-1) ret=-1;
}
}
}
return ret;
}
int mail(){
int gameRes;
initGraph();
begin:
newGame();
gameRes=0;
do{
int key=getKey();
if(key==ESC)break;
switch(key){
case ENTER:case SPACE:gameRes=openMine(pi,pj);break;
case UP:moveUp();break;
case DOWN:moveDown();break;
case LEFT:moveLeft();break;
case RIGHT:moveRight();break;
case LOWERF:case UPPERF:flagblock(pi,pj);break;
case LOWERA:case UPPERA:gameRes=autoOpen(pi,pj);break;
case LOWERQ:case UPPERQ:quesBlock(pi,pj);break;
}
if(checkWin())gameRes=1;
}while(!gameRes);
if(!confirm(gameRes))goto begin;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -