扫雷游戏2.0

扫雷游戏

游戏规则
棋盘大小为10*10,在棋盘中利用随机值设置20个雷,但并不显示在棋盘中。用户每次以坐标的形式输入位置,若此处有雷,则用户失败,否则,此处显示的值为其周围一圈的八个位置中雷的数目。直至将20个雷完全排除,用户获胜。
用户如果是第一次扫就扫到了雷,那么将这个雷转移到其他位置,使得用户可以继续玩下去。
思路:在埋雷时标记一个没有雷的位置,如果用户在第一次扫时扫到了雷,就将两个位置的内容进行交换,用户就能够继续游戏。
以下是具体代码:
game.h:

#pragma once
#ifndef _GAME_H_
#define _GAME_H_

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <windows.h>
#pragma warning(disable:4996)

#define ROW 12
#define COL 12
#define THUNDER '1'

void Play();
void Menu();
void ShowBoard(char board[][COL], int row, int col);
void SetMine(char board[][COL], int row, int col,int *x_p,int *y_p);
int GetCount(char board[][COL], int x, int y);

#endif // !1

main.c:

#include "game.h"

int main()
{
 int quit = 0;
 while (!quit)
 {
  Menu();
  int select = 0;
  scanf("%d", &select);
  switch (select)
  {
  case 1:
   Play();
   break;
  case 2:
   quit = 1;
   break;
  default:
   printf("您的输入有误,请重新输入!\n");
   break;
  }
 }
 printf("ByeBye!");
 system("pause");
 return 0;
}

游戏菜单:

void Menu() {
 printf("###################################\n");
 printf("#### 欢 迎 来 到 扫 雷 游 戏   ####\n");
 printf("###################################\n");
 printf("####  1:Play        2:Exit  #####\n");
 printf("###################################\n");
 printf("####  Select->>             #######\n");
}

实现埋雷的函数:
在将20个雷埋完后,在棋盘中遍历找到一个非雷的位置,并将其标记。

void SetMine(char mine_board[][COL], int row, int col,int *x_p,int *y_p)
{
 int count = (row-2) * (col-2) / 5;
 while (count)
 {
  int x = rand() % 10 + 1;
  int y = rand() % 10 + 1;
  if (mine_board[x][y] != '0')
  {
   continue;
  }
  mine_board[x][y] = THUNDER;
  count--;
 }
 for (int i = 1; i <= 10; i++)
 {
  for (int j = 1; j <= 10; j++)
  {
   if (mine_board[i][j] == '0')
   {
    *x_p = i;
    *y_p = j;
    break;
   }
  }
 }
}

展示棋盘:

void ShowBoard(char board[][COL], int row, int col)
{
 printf("       1    2    3    4    5    6    7    8    9    10 \n");
 printf("     ---------------------------------------------------\n");
 for (int i = 1; i < row-1; i++)
 {
  printf(" %2d  |", i );
  for (int j = 1; j < col-1; j++)
  {
   printf(" %2c |", board[i][j]);
  }
  printf("\n");
  printf("     ---------------------------------------------------\n");
 }
}

计算当前位置周围雷数:

int GetCount(char board[][COL], int x, int y)
{
 return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + \
  board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1]-8*'0';
}

实现游戏的函数:

void Play()
{
 srand((unsigned int) time(NULL));
 char mine_board[ROW][COL];
 char show_board[ROW][COL];
 memset(mine_board, '0', sizeof(mine_board));
 memset(show_board, '*', sizeof(show_board));
 int no_x=0;
 int no_y=0;
 SetMine(mine_board, ROW, COL,&no_x,&no_y);
 int times= (ROW - 2) * (COL - 2)*4 / 5;
 int x = 0;
 int y = 0;
 do {
  system("cls");
  ShowBoard(show_board, ROW, COL);
  printf("Please Enter<x,y>:");
  scanf("%d %d", &x, &y);
  if (x <= 0 || x > 10 || y <= 0 || y > 10)
  {
   printf("您的输入有误,请重新输入!\n");
   continue;
  }
  if (mine_board[x][y]!='0'&&mine_board[x][y]!=THUNDER)
  {
   printf("此位置已扫过,请重新输入!\n");
   continue;
  }
  if (mine_board[x][y] == THUNDER)
  {
   if (times == (ROW - 2) * (COL - 2) * 4 / 5)
   {
    mine_board[x][y] = '0';
    mine_board[no_x][no_y] = '1';
   }
   else {
    system("cls");
    printf("很遗憾,你输了!\n");
    ShowBoard(mine_board, ROW, COL);
    break;
   }
  }
  int count = GetCount(mine_board, x,y);
  show_board[x][y] =count+'0';
  times--;
 } while (times>0); 
 printf("你玩的还不错,要不要再来一局?\n");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值