回味童年,經典掃雷再升級
阿新 • • 發佈:2018-11-10
這裡完成一個c語言的掃雷遊戲:
遊戲要求:
- 雷盤可以展開
- 遊戲結束顯示所用時間
- 第一次無論走哪都不會被炸死
這個建立一個掃雷專案,包含一個game.h標頭檔案和兩個分別為text.c和game.c的原始檔。
text.c原始檔:包含主函式main()、選單函式menu()、遊戲函式game();
#include"game.h" void menu() { printf("********************\n"); printf("***** 1.play *****\n"); printf("***** 0.exit *****\n"); printf("********************\n"); } void game() { int x = 0; int y = 0; int count = MINE_NUM; char mineboard[ROWS][COLS] = { 0 };//放雷的雷盤 char findboard[ROWS][COLS] = { 0 };//排雷的雷盤 char textboard[ROWS][COLS] = { 0 };//測試是否展開的雷盤 InitBoard(textboard, ROWS, COLS, '0'); InitBoard(mineboard, ROWS, COLS, '0'); InitBoard(findboard, ROWS, COLS, '*'); SetMine(mineboard, ROWS, COLS, count); FindMine(mineboard, findboard,textboard, x, y); } int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出遊戲!\n"); break; default: printf("輸入錯誤,請重新選擇!\n"); break; } } while (input); system("pause"); return 0; }
game.c原始檔:包含遊戲函式game()中的所有功能函式,如:
初始化雷盤函式InitBoard ()
展示雷盤函式ShowBoard()
埋雷函式SetMine()
計算雷數函式Compute()
展開雷陣函式Open()
排雷函式FindMine();
#include"game.h" void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch) { memset(&board[0][0], ch, rows*cols * sizeof(board[0][0])); } void ShowBoard(char findboard[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf(" "); for (i = 1; i <= row; i++) { printf("%d ", i); } printf("\n\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", findboard[i][j]); } printf("\n"); } } void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count) { int i = 0; int j = 0; while (count != 0) { i = rand() % 9 + 1; j = rand() % 9 + 1; if (mineboard[i][j] == '0') { mineboard[i][j] = '1'; count--; } } } void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y) { findboard[x][y] = mineboard[x - 1][y] + mineboard[x - 1][y - 1] + mineboard[x][y - 1] + mineboard[x + 1][y - 1] + mineboard[x + 1][y] + mineboard[x + 1][y + 1] + mineboard[x][y + 1] + mineboard[x - 1][y + 1] - 7 * '0'; } void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y) { textboard[x][y] = '1'; if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1) { Compute(findboard, mineboard, x, y); if (findboard[x][y] == '0') { Compute(findboard, mineboard, x - 1, y); Compute(findboard, mineboard, x - 1, y - 1); Compute(findboard, mineboard, x, y - 1); Compute(findboard, mineboard, x + 1, y - 1); Compute(findboard, mineboard, x + 1, y); Compute(findboard, mineboard, x + 1, y + 1); Compute(findboard, mineboard, x, y + 1); Compute(findboard, mineboard, x - 1, y + 1); if (findboard[x - 1][y] == '0') { if (textboard[x - 1][y] == '0') { Open(findboard, mineboard, textboard, x - 1, y); } } if (findboard[x][y - 1] == '0') { if (textboard[x][y - 1] == '0') { Open(findboard, mineboard, textboard, x, y - 1); } } if (findboard[x + 1][y] == '0') { if (textboard[x + 1][y] == '0') { Open(findboard, mineboard, textboard, x + 1, y); } } if (findboard[x][y + 1] == '0') { if (textboard[x][y + 1] == '0') { Open(findboard, mineboard, textboard, x, y + 1); } } } } } void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y) { ShowBoard(mineboard, ROW, COL); int ret = ROW * COL - MINE_NUM; int count = 0; while (1) { int time0 = 0; int time1 = 0; int time2 = 0; ShowBoard(findboard, ROW, COL); time1 =(unsigned int) time(NULL); printf("請輸入你要排雷的座標:>"); scanf("%d%d", &x, &y); if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1) { count++; if (mineboard[x][y] == '1') { if (count == 1) { SetMine(mineboard, ROWS, COLS, count); mineboard[x][y] = '0'; Open(findboard, mineboard,textboard, x, y); } else { time2 = (unsigned int)time(NULL); time0 = time2 - time1; printf("很遺憾,你被炸死了! 所用時間:%ds\n", time0); ShowBoard(mineboard, ROW, COL); break; } } else { ret--; Open(findboard, mineboard, textboard, x, y); } } else { printf("輸入座標有誤,請重新輸入!\n"); } if (ret == 0) { time2 = (unsigned int)time(NULL); time0 = time2 - time1; printf("恭喜你,遊戲通關! 所用時間:%ds\n",time0); ShowBoard(mineboard, ROW, COL); break; } } }
game.h標頭檔案:包含各種功能函式的宣告;
#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_NUM 10//遊戲難度對應的雷數
//初始化雷盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch);
//展示雷盤
void ShowBoard(char findboard[ROWS][COLS], int row, int col);
//埋雷
void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count);
//計算雷數
void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y);
//展開雷陣
void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y);
//排雷
void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS],char textboard[ROWS][COLS], int x, int y);
#endif //__GAME_H__