當前位置:編程學習大全網 - 編程語言 - C語言程序設計課程設計掃地雷遊戲,怎麽做?

C語言程序設計課程設計掃地雷遊戲,怎麽做?

#include <stdlib.h>

#include <time.h>

#include <conio.h>

/************************************************************************/

/* 地圖狀態約定 */

/* 0 : 周圍9個格子都沒有雷 */

/* 1~8: 周圍9個格子有1~8個雷 */

/* -1 : 有雷的格子 */

/* -2 : 被翻開的有雷的格子 */

/* -3 : 地圖邊界 */

/************************************************************************/

int Map[12][12]={0}; /* 當前在玩的雷圖 */

int MapShow[12][12]={0}; /* 當前用戶選擇過的地方,即“已翻開”的格子 */

int nSpaceLeft = 100; /* 剩余的空白數,如果為0,則任務成功! */

int lastX,lastY; /* 失敗時,記錄挖到雷的位置 */

int AllMaps[5][12][12]={0}; /* 供用戶選擇的五張雷圖 */

/* 顯示雷區(每次用戶操作之後都要重新顯示) */

void DrawMap();

/* 初始化雷區 */

void InitMap();

/* 遊戲開始時,加載用戶選擇的壹幅雷圖 */

void LoadMap(int index);

/* 玩掃雷遊戲 */

int Play();

/* 繪制主菜單 */

void DrawMainMenu();

/* 顯示結果 */

void ShowResult(int result);

/* 主函數 */

int main(int argc, char* argv[])

{

char ch;

int result;

srand(time(NULL)); /* 按當前時間初始化隨機數,這樣每次啟動的時候,雷的位置的不壹樣 */

InitMap(); /* 初始化5張雷圖,供用戶選擇 */

while(1) /* 用while循環,保證只有在用戶選擇退出時,才退出遊戲 */

{

DrawMainMenu(); /* 繪制主菜單 */

flushall(); /* 清空所有輸入輸出緩沖區,主要是清空輸入緩沖區,防止前面的輸入對getch()的幹擾 */

ch = getch(); /* 讀取輸入 */

switch(ch)

{

case '1': /* 用戶選擇1 */

printf("\n\t請輸入雷圖編號(1-5):");

while (1) /* 循環輸入,如果輸入錯誤就壹直要求輸入 */

{

flushall();

ch = getch(); /* 讀取用戶輸入的雷圖編號 */

if (ch >= '1' && ch <= '5') /* 只有在1-5之間有效 */

{

LoadMap(ch-'1'); /* ch -'1',將用戶輸入轉換為雷圖下標(下標從0開始,所以是-'1')*/

break; /* 如果輸入正確,就退出循環輸入 */

}

else

{

/* 輸入錯誤,則提示重新輸入 */

printf("\n\t輸入無效!請重新輸入雷圖編號(1-5):");

flushall();

}

}

result = Play(); /* 開始玩掃雷遊戲 */

ShowResult(result); /* 顯示遊戲結果 */

break;

case '2': /* 用戶選擇2 */

exit(0); /* 直接退出 */

break;

default: /* 無效輸入 */

/* 不做任何操作,重新顯示主菜單 */

break;

}

}

return 0;

}

void LoadMap(int index)

{

int i,j;

nSpaceLeft = 90;

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

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

{

Map[i][j] = AllMaps[index][i][j]; /* 將5張雷圖中的下標為index的那壹張載入到Map數組 */

MapShow[i][j] = 0; /* 重新開始遊戲,所以所有格子都是“未翻開”狀態 */

}

}

void InitMap()

{

int i,j,k;

int m,n;

/* 要初始化5張地圖 */

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

{

/* 初始化地圖的邊界 */

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

{

/* 下標為0和11的位置都是“邊界”,這些位置不屬於雷區,僅在程序內部使用 */

AllMaps[k][0][i] = -3;

AllMaps[k][11][i] = -3;

AllMaps[k][i][0] = -3;

AllMaps[k][i][11] = -3;

}

/* 先初始化10個雷的位置 */

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

{

m = rand()%10 + 1; /* 隨機選壹個X坐標 */

n = rand()%10 + 1; /* 隨機選壹個Y坐標 */

if(AllMaps[k][m][n] == 0) /* 如果隨機產生的位置之前沒有被安排放置雷 */

{

AllMaps[k][m][n] = -1; /* 放置壹個雷 */

}

else /* 隨機產生的位置在之前已經放置了雷了 */

{

i--; /* 這個位置無效,重新產生壹個 */

}

}

/* 計算每個格子周圍雷的個數 */

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

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

{

if(AllMaps[k][i][j] != -1)

{

AllMaps[k][i][j] = 0;

/* 周圍的8個位置,有壹個雷就加壹 */

/************************************************************************/

/* 坐標[i][j]周圍的8個坐標位置: */

/* [i-1][j-1] [i-1][j] [i-1][j+1] */

/* [i][j-1] [i][j] [i][j+1] */

/* [i+1][j-1] [i+1][j] [i+1][j+1] */

/************************************************************************/

if(AllMaps[k][i-1][j-1] == -1)

AllMaps[k][i][j]++;

if(AllMaps[k][i-1][j] == -1)

AllMaps[k][i][j]++;

if(AllMaps[k][i-1][j+1] == -1)

AllMaps[k][i][j]++;

if(AllMaps[k][i][j-1] == -1)

AllMaps[k][i][j]++;

if(AllMaps[k][i][j+1] == -1)

AllMaps[k][i][j]++;

if(AllMaps[k][i+1][j-1] == -1)

AllMaps[k][i][j]++;

if(AllMaps[k][i+1][j] == -1)

AllMaps[k][i][j]++;

if(AllMaps[k][i+1][j+1] == -1)

AllMaps[k][i][j]++;

}

}

}

}

void DrawMap()

{

int i,j;

system("cls"); /* 清屏 */

/* 繪制坐標和邊框 */

printf("\n\n\n");

printf("\t Y ");

for(i=1; i<11; i++) printf("%-02d",i-1);

printf("\n\tX |###################|\n");

/* 每壹行按規則繪制雷區 */

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

{

printf("\t%-02d|",i-1); /* 顯示X坐標 */

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

{

if(MapShow[i][j]) /* 如果該位置被用戶“挖開”了,就照實顯示 */

{

if (Map[i][j] >= 0) /* 非雷,顯示周圍雷的個數 */

{

printf("%d|",Map[i][j]);

}

/*else if(Map[i][j] == 0)

{

printf("0|");

}*/

else if (Map[i][j] == -1) /* 雷,顯示* */

{

printf("*|");

}

else if (Map[i][j] == -2) /* 用戶挖到的雷,顯示@ */

{

printf("@|");

}

else /* 其他情況(目前不會出現,方便以後擴展) */

{

printf(" |");

}

}

else /* 如果該位置沒有被用戶“挖開”,則顯示空格 */

{

printf(" |");

}

}

printf("\n");

}

printf("\t |###################|\n");

}

void DrawMainMenu()

{

system("cls");

printf("\n\n\n\n\n\n");

printf("\t|###################|\n");

printf("\t| 請選擇! |\n");

printf("\t| 1. 開始掃雷 |\n");

printf("\t| 2. 退出 |\n");

printf("\t|###################|\n");

}

int Play()

{

char chX,chY; /* 用戶輸入 */

int X,Y; /* 用戶輸入轉換為整數下標 */

int i,j;

while (1)

{

DrawMap(); /* 重新繪制雷區圖 */

/* 輸入X坐標 */

printf("\n\t請輸入X:");

flushall();

while(1)

{

chX = getch();

if (chX >= '0' && chX <= '9')

{

X = chX - '0' + 1;

break;

}

else

{

printf("\n\t輸入無效!請重新輸入X:");

flushall();

}

}

/* 輸入Y坐標 */

printf("\n\t請輸入Y:");

flushall();

while(1)

{

chY = getch();

if (chY >= '0' && chY <= '9')

{

Y = chY - '0' + 1;

break;

}

else

{

printf("\n\t輸入無效!請重新輸入Y:");

flushall();

}

}

if(MapShow[X][Y] == 0) /* 輸入的是未翻開的位置 */

{

MapShow[X][Y] = 1; /* 將該位置標記為“已翻開” */

if(Map[X][Y] == -1) /* 如果挖到的是雷 */

{

Map[X][Y] = -2; /* 標記為-2,表示這是被用戶挖到的雷 */

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

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

MapShow[i][j]=1; /* 遊戲結束,自動將所有位置“翻開” */

/* 記錄用戶挖到雷的位置坐標 */

lastX = X-1;

lastY = Y-1;

return 0; /* 遊戲失敗! */

}

else /* 如果挖到的不是雷 */

{

nSpaceLeft--; /* 剩余空白數減壹 */

if(nSpaceLeft==0) /* 剩余空白數為0,則表示遊戲成功 */

{

return 1; /* 遊戲勝利! */

}

}

}

else /* 輸入的是已翻開的位置 */

{

printf("\n\t妳輸入的位置是[%d,%d]\n\t這個位置已經翻開!請重新輸入!\n\t按任意鍵繼續...\n",X-1,Y-1);

flushall();

getch();

}

}

}

void ShowResult( int result )

{

DrawMap();

if(result == 1) /* 遊戲成功 */

{

printf("\n\t恭喜!您完成的掃雷任務!\n\t按任意鍵繼續...");

flushall();

getch();

}

else /* 遊戲失敗 */

{

printf("\n\t哈哈!您在位置[%d,%d]挖到雷了,任務失敗!\n\t按任意鍵繼續...",lastX, lastY);

flushall();

getch();

}

}

  • 上一篇:四川專科學校排名
  • 下一篇:遊戲運行時出現錯誤怎麽解決
  • copyright 2024編程學習大全網