C语言实现经典游戏——扫雷!
2020-04-17 16:02:10来源:博客园 阅读 ()
C语言实现经典游戏——扫雷!
前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:不帅但很坏
扫雷游戏是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷。我们可以通过C语言编程来实现游戏。我们可以把文件代码分别分在三个不同的文件下,game.h:头文件,game.c:用来具体完成函数代码,test.c:主要写逻辑函数。
写扫雷程序刚开始很多人可能没有思绪,我们可以先思考输入一个坐标而屏幕显示是否有雷,或者显示这个点的附近有几个雷,当然如果你还没学到这里。建议可以先去小编的C++交流.裙 :九起久伞吧起伞留伞(数字的谐音)转换下可以找到了,里面有最新C++教程项目,多跟里面的人交流,进步更快哦
仔细思考我们可以想到可以用两个数组完成,一个数组存放当,一个数组用来显示。当玩家输入坐标后,需判断这个坐标是有有雷然后把它信息存放在另一个数组显示出来。
- int get_num(int x,int y)//雷的坐标
- {
- return rand() % (y - x + 1) + x;//x-y的随机数
- }
- void set_mine(char mine[ROWS][COLS])//初始化雷
- {
- int x = 0;
- int y = 0;
- int i = LEI;
- srand((unsigned)time(NULL));
- while (i)
- {
- x = get_num(1, 9);
- y = get_num(1, 9);
- if (mine[x][y] == '0')
- {
- mine[x][y] = '1';
- i--;
- }
- }
- }
- void menu()
- {
- printf("**********************************\n");
- printf("******** 1.PLAY *************\n");
- printf("******** 0.EXIT *************\n");
- printf("**********************************\n");
- }
- void init_game(char mine[ROWS][COLS], char show[ROWS][COLS])//数组初始化
- {
- memset(mine, '0', ROWS*COLS*sizeof(char));
- set_mine(mine);//初始化雷的位置
- memset(show, '*', ROWS*COLS*sizeof(char));
- }
- void display(char show[ROWS][COLS])//打印数组
- {
- int i = 0;
- int j = 0;
- // for (i = 0; i < ROWS; i++)
- // {
- //
- // for (j = 0; j < COLS; j++)
- // {
- // printf(" %c ", mine[i][j]);
- //
- // }
- // printf("\n");
- // }
- printf(" ");
- for (i = 1; i < COLS - 1; i++)
- {
- printf(" %d ", i);
- }
- printf("\n");
- for (i = 1; i < ROWS-1; i++)
- {
- printf("%d ", i);
- for (j = 1; j < COLS - 1; j++)
- {
- printf(" %c ", show[i][j]);
- }
- printf("\n");
- }
- }
- void sweep(char mine[ROWS][COLS], char show[ROWS][COLS])//开始扫雷
- {
- int x = 0;
- int y = 0;
- int i = (ROWS-2)*(COLS-2)-LEI;
- while (i)
- {
- printf("请输入坐标:");
- scanf("%d%d", &x, &y);
- int ret = get_lei_nums(mine, x, y);
- if ((x > 0 && x<ROWS - 1) && (y > 0 && y<COLS-1))
- {
- if (mine[x][y] == '1')
- {
- printf("您炸了,游戏结束\n");
- return;
- }
- else
- {
- show[x][y]=ret+'0';
- display(show);
- i--;
- }
- }
- else
- {
- printf("您输入的坐标不合法");
- }
- }
- printf("Win!!!!!!!!!!!\n");
- }
- int get_lei_nums(char mine[ROWS][COLS],int x,int y)//判断附近雷的个数
- {
- int count = 0;
- if (mine[x - 1][y - 1] == '1')
- count++;
- if (mine[x][y - 1] == '1')
- count++;
- if (mine[x + 1][y - 1] == '1')
- count++;
- if (mine[x - 1][y] == '1')
- count++;
- if (mine[x + 1][y] == '1')
- count++;
- if (mine[x - 1][y + 1] == '1')
- count++;
- if (mine[x][y + 1] == '1')
- count++;
- if (mine[x + 1][y + 1] == '1')
- count++;
- return count;
- }
game.h
- #define _CRT_SECURE_NO_WARNINGS 1
- #ifndef __GAME__H__
- #define __GAME__H__
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<time.h>
- enum CH
- {
- EXIT,
- PLAY
- };
- #define ROWS 11
- #define COLS 11
- #define LEI 10
- void set_mine(char mine[ROWS][COLS]);
- void init_game(char mine[ROWS][COLS], char show[ROWS][COLS]);
- void display(char show[ROWS][COLS]);
- void play_game(char mine[ROWS][COLS], char show[ROWS][COLS]);
- void sweep(char mine[ROWS][COLS], char show[ROWS][COLS]);
- int get_lei_nums(char mine[ROWS][COLS], int x,int y);
- #endif
game.c
- #define _CRT_SECURE_NO_WARNINGS 1
- #include "game.h"
- int get_num(int x,int y)//雷的坐标
- {
- return rand() % (y - x + 1) + x;//x-y的随机数
- }
- void set_mine(char mine[ROWS][COLS])//初始化雷
- {
- int x = 0;
- int y = 0;
- int i = LEI;
- srand((unsigned)time(NULL));
- while (i)
- {
- x = get_num(1, 9);
- y = get_num(1, 9);
- if (mine[x][y] == '0')
- {
- mine[x][y] = '1';
- i--;
- }
- }
- }
- void init_game(char mine[ROWS][COLS], char show[ROWS][COLS])//数组初始化
- {
- memset(mine, '0', ROWS*COLS*sizeof(char));
- set_mine(mine);//初始化雷的位置
- memset(show, '*', ROWS*COLS*sizeof(char));
- }
- void display(char show[ROWS][COLS])
- {
- int i = 0;
- int j = 0;
- // for (i = 0; i < ROWS; i++)
- // {
- //
- // for (j = 0; j < COLS; j++)
- // {
- // printf(" %c ", mine[i][j]);
- //
- // }
- // printf("\n");
- // }
- printf(" ");
- for (i = 1; i < COLS - 1; i++)
- {
- printf(" %d ", i);
- }
- printf("\n");
- for (i = 1; i < ROWS-1; i++)
- {
- printf("%d ", i);
- for (j = 1; j < COLS - 1; j++)
- {
- printf(" %c ", show[i][j]);
- }
- printf("\n");
- }
- }
- void sweep(char mine[ROWS][COLS], char show[ROWS][COLS])//开始扫雷
- {
- int x = 0;
- int y = 0;
- int i = (ROWS-2)*(COLS-2)-LEI;
- while (i)
- {
- printf("请输入坐标:");
- scanf("%d%d", &x, &y);
- int ret = get_lei_nums(mine, x, y);
- if ((x > 0 && x<ROWS - 1) && (y > 0 && y<COLS-1))
- {
- if (mine[x][y] == '1')
- {
- printf("您炸了,游戏结束\n");
- return;
- }
- else
- {
- show[x][y]=ret+'0';
- display(show);
- i--;
- }
- }
- else
- {
- printf("您输入的坐标不合法");
- }
- }
- printf("Win!!!!!!!!!!!\n");
- }
- int get_lei_nums(char mine[ROWS][COLS],int x,int y)//判断附近雷的个数
- {
- int count = 0;
- if (mine[x - 1][y - 1] == '1')
- count++;
- if (mine[x][y - 1] == '1')
- count++;
- if (mine[x + 1][y - 1] == '1')
- count++;
- if (mine[x - 1][y] == '1')
- count++;
- if (mine[x + 1][y] == '1')
- count++;
- if (mine[x - 1][y + 1] == '1')
- count++;
- if (mine[x][y + 1] == '1')
- count++;
- if (mine[x + 1][y + 1] == '1')
- count++;
- return count;
- }
test.c
- #define _CRT_SECURE_NO_WARNINGS 1
- #include"game.h"
- void play_game()
- {
- char mine[ROWS][COLS] = { 0 };
- char show[ROWS][COLS] = { 0 };
- init_game(mine, show);
- display(show);
- sweep(mine, show);
- }
- void menu()
- {
- printf("**********************************\n");
- printf("******** 1.PLAY *************\n");
- printf("******** 0.EXIT *************\n");
- printf("**********************************\n");
- }
- void game()
- {
- int input = 0;
- menu();
- printf("请选择:");
- scanf("%d", &input);
- while (input)
- {
- switch (input)
- {
- case PLAY:
- play_game();
- break;
- case EXIT:
- break;
- }
- menu();
- printf("请选择:");
- scanf("%d", &input);
- }
- }
- int main()
- {
- game();
- system("pause");
- return 0;
- }
1.在选择是否游戏时引用了枚举类型,方便以后对程序扩展
- enum CH
- {
- EXIT,
- PLAY
- };
srand((unsigned)time(NULL));
rand() % (y - x + 1) + x;//生成x-y的随机数。
3.再把数组初始化时用到了memset()函数:头文件是<string.h>
memset(mine, '0', ROWS*COLS*sizeof(char));
数组 要赋值的值 数组的大小
原文链接:https://www.cnblogs.com/chengxuyuanaa/p/12016646.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:函数延迟绑定的C++实现
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- C语言程序结构 2020-05-31
- C++冒泡排序 (基于函数模板实现) 2020-05-31
- opencv-12-高斯滤波-双边滤波(附C++代码实现) 2020-05-10
- 二叉排序树 2020-05-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash