自己写“扫雷”(二).业务逻辑实现

这个时候我们需要处理一下我们的业务逻辑了!

在这里先简略滴说说业务逻辑的思路:

主要是用一个二维数组来表示这些格子,status表示是否点击,或者标记为雷,hasLandmine记录这个格子是否有雷

每次绘图的时候根据这几个数组来判断应该载入哪种位图就可以了!蛮简单的!

我这里是主要在我们的MineView类中动工,在这个类中控制业务逻辑

初始化自动生成的类是:

class CMy17MyMineView : public CView
{
protected: // 仅从序列化创建
	CMy17MyMineView();
	DECLARE_DYNCREATE(CMy17MyMineView)

// 特性
public:
	CMy17MyMineDoc* GetDocument() const;

// 操作
public:

// 重写
public:
	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

// 实现
public:
	virtual ~CMy17MyMineView();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
	afx_msg void OnFilePrintPreview();
	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
	DECLARE_MESSAGE_MAP()
};

接下来加入我个人的业务逻辑:

加入几个成员,先不理会消息映射函数!

class CMy17MyMineView : public CView
{
protected: // 仅从序列化创建
	CMy17MyMineView();
	DECLARE_DYNCREATE(CMy17MyMineView)

// 特性
public:
	CMy17MyMineDoc* GetDocument() const;

// 操作
public:

// 重写
public:
	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
	vi
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,实现扫雷游戏需要先了解一下游戏规则和基本原理。 游戏规则: 扫雷游戏是一种单人益智游戏。游戏区域被分为许多单元格,有些单元格下面有地雷。游戏的目标是揭示出所有没有地雷的单元格,同时不揭开任何地雷。当揭开一个地雷时游戏就结束了。如果成功地揭示出所有没有地雷的单元格,游戏就胜利了。 基本原理: 游戏区域被分为许多单元格,每个单元格有三种状态:覆盖状态、揭示状态和标记状态。覆盖状态表示该单元格还没有被揭示,揭示状态表示该单元格已经被揭示,标记状态表示该单元格被标记为地雷。在游戏开始时,随机生成若干个地雷,将它们分布在游戏区域中。当玩家点击一个单元格时,如果该单元格下面有地雷,游戏失败,否则将该单元格变为揭示状态,如果该单元格周围没有地雷,就会自动揭示周围的单元格,直到揭示到有地雷的单元格或者揭示到边缘为止。玩家可以用鼠标右键将一个单元格标记为地雷,标记状态的单元格不会被揭示。 以下是一个简单实现扫雷游戏的示例代码,使用Node.js和控制台输出实现: ```javascript const readline = require('readline'); // 游戏参数,可以根据需要进行修改 const ROWS = 10; // 行数 const COLS = 10; // 列数 const MINES = 10; // 地雷数 // 游戏状态 const STATE_COVERED = 0; // 覆盖状态 const STATE_MARKED = 1; // 标记状态 const STATE_REVEALED = 2; // 揭示状态 // 单元格对象 class Cell { constructor() { this.mine = false; // 是否为地雷 this.state = STATE_COVERED; // 单元格状态 this.adjacentMines = 0; // 周围地雷数 } } // 游戏对象 class Minesweeper { constructor() { this.board = []; // 游戏区域 this.gameOver = false; // 游戏是否结束 this.uncoveredCount = 0; // 已经揭示的单元格数量 this.initBoard(); // 初始化游戏区域 } // 初始化游戏区域 initBoard() { // 生成空白的游戏区域 for (let i = 0; i < ROWS; i++) { this.board.push([]); for (let j = 0; j < COLS; j++) { this.board[i].push(new Cell()); } } // 随机生成地雷 let count = 0; while (count < MINES) { let row = Math.floor(Math.random() * ROWS); let col = Math.floor(Math.random() * COLS); if (!this.board[row][col].mine) { this.board[row][col].mine = true; count++; } } // 计算每个单元格周围的地雷数 for (let i = 0; i < ROWS; i++) { for (let j = 0; j < COLS; j++) { if (!this.board[i][j].mine) { let count = 0; for (let r = i - 1; r <= i + 1; r++) { for (let c = j - 1; c <= j + 1; c++) { if (r >= 0 && r < ROWS && c >= 0 && c < COLS && this.board[r][c].mine) { count++; } } } this.board[i][j].adjacentMines = count; } } } } // 揭示单元格 reveal(row, col) { let cell = this.board[row][col]; if (cell.state !== STATE_COVERED || this.gameOver) { return; } cell.state = STATE_REVEALED; this.uncoveredCount++; // 如果揭示到了地雷,游戏结束 if (cell.mine) { this.gameOver = true; this.showBoard(); console.log('Game over!'); return; } // 如果所有没有地雷的单元格都被揭示了,游戏胜利 if (this.uncoveredCount === ROWS * COLS - MINES) { this.gameOver = true; this.showBoard(); console.log('Congratulations, you win!'); return; } // 如果揭示到的单元格周围没有地雷,继续揭示周围的单元格 if (cell.adjacentMines === 0) { this.revealNeighbors(row, col); } this.showBoard(); } // 揭示周围的单元格 revealNeighbors(row, col) { for (let r = row - 1; r <= row + 1; r++) { for (let c = col - 1; c <= col + 1; c++) { if (r >= 0 && r < ROWS && c >= 0 && c < COLS && !(r === row && c === col)) { this.reveal(r, c); } } } } // 标记单元格 mark(row, col) { let cell = this.board[row][col]; if (cell.state === STATE_COVERED) { cell.state = STATE_MARKED; } else if (cell.state === STATE_MARKED) { cell.state = STATE_COVERED; } this.showBoard(); } // 显示游戏区域 showBoard() { console.clear(); console.log(' ' + Array.from({ length: COLS }, (_, i) => i + 1).join(' ')); for (let i = 0; i < ROWS; i++) { let row = []; for (let j = 0; j < COLS; j++) { let cell = this.board[i][j]; if (cell.state === STATE_COVERED) { row.push('.'); } else if (cell.state === STATE_MARKED) { row.push('F'); } else { row.push(cell.mine ? '*' : cell.adjacentMines === 0 ? ' ' : cell.adjacentMines); } } console.log((i + 1) + ' ' + row.join(' ')); } console.log(); } } // 读取用户输入 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // 创建游戏对象 const game = new Minesweeper(); // 开始游戏 console.log('Welcome to Minesweeper!'); game.showBoard(); rl.on('line', (input) => { let parts = input.split(' '); if (parts.length !== 3 || !/^[rm]$/i.test(parts[0]) || isNaN(parts[1]) || isNaN(parts[2])) { console.log('Invalid input, please try again.'); return; } let row = parseInt(parts[1]) - 1; let col = parseInt(parts[2]) - 1; if (row < 0 || row >= ROWS || col < 0 || col >= COLS) { console.log('Invalid row or column, please try again.'); return; } if (parts[0].toLowerCase() === 'r') { game.reveal(row, col); } else { game.mark(row, col); } }); ``` 运行以上代码,可以在控制台上玩扫雷游戏。例如,输入 `r 1 1` 可以揭示第一行第一列的单元格,输入 `m 2 3` 可以将第行第三列的单元格标记为地雷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值