C language 模拟 win的经典游戏——扫雷
让我们在terminal下愉快的...扫雷
昨天跟奇葩霖聊起“雷区”这个敏感词汇,然后非常荣幸的。。。
应该轰炸不到我。。
。
后来百无聊赖的去玩了把扫雷。然后发现我之前都是乱扫的,没有不论什么技巧。百科之后才发现,扫雷是有技巧的,接着玩了一把。咦挺有意思的。。。大概感受了一下,今天又要考数电,昨晚写了个框架。就到两点半了。。。睡。
。。
今天中午回来。第一件事就是接着写。。。简直是爽。。。
这家伙。原来昨天之前。。。我一直不会玩。。
。假设还是跟我一样不会玩的。。
我也懒得介绍规则了。。。自行google吧。。
。
this blog的目的不是推广扫雷。
。。
/******************************************************************
Code writer : EOF
code file : mine_sweep.c
code date : 2014.06.23
e-mail: jasonleaster@gmail.com Code purpose :
This code is just a simulation of mine sweeping...
If there are some where wrong with my code, just touch me by e-mail.
Thank you. Have fun! ********************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MATRIX_SIZE 4 //demention of square matrix
#define BUFFSIZE 1024 //buffer size #define NUM_MINE 4 //number of mine #define IS_BOMB 1 //MACRO for determining current location has a bomb
#define NOT_BOMB 0 #define GAMEOVER 0
#define GAMING 1 struct battle
{
/*
char current_battlefiled is used for descripting current state of battlefield
*/
char current_battlefiled[MATRIX_SIZE][MATRIX_SIZE]; /*
char answer is used for determining that location has a bomb or not.
*/
int answer[MATRIX_SIZE][MATRIX_SIZE]; /*
char num_bomb is used for determing that how many bombs around the current location.
*/
int num_bomb[MATRIX_SIZE][MATRIX_SIZE];
}; void print_current_battle(struct battle *p_battlefiled); struct battle initialize_battle(void); void do_open(struct battle *p_battlefiled,int row,int rank);
void do_mine(struct battle *p_battlefiled,int row,int rank);
void do_unknow(struct battle *p_battlefiled,int row,int rank); void do_operation(struct battle *p_battlefiled,int row, int rank); void count_bomb_around(struct battle *p_battlefiled); int Game = GAMING;
//In fact, I try my best to avoid to use global varible in my code....
//but I think it is ok here.You know I can't accept that long long parameter list.
int Open_safely_times = 0; int main()
{ int row = 0;
int rank = 0; struct battle new_york; new_york = initialize_battle(); print_current_battle(&new_york);//Firstly, show player the initial battlefiled. printf("Hey guys, please input two numbers that represent \nthe number of row and rank of the location in the battlefiled\n"); while(!scanf("%d",&row) ||row >= MATRIX_SIZE)
{
printf("input row error\nplease input again\n");
while(getchar() != '\n')
{ }
} while(!scanf("%d",&rank) || rank >= MATRIX_SIZE)
{
printf("input rank error\nplease input again\n");
while(getchar() != '\n')
{ }
} printf("Remember that there are only three operation could be done.\n");
printf("If you want to open the current location, just input command \"open\"\n");
printf("If you want to sign the current location as mine, just input command \"mine\"\n");
printf("If you want to sign the current location as question mark, just input command \"unknow\"\n"); printf("Never forget that!\n"); while(Game == GAMING && Open_safely_times < MATRIX_SIZE*MATRIX_SIZE-NUM_MINE)
{ do_operation(&new_york,row,rank); if(Game == GAMEOVER)
{
break;
} printf("Again! Input two numbers that represent \nthe number of row and rank of the location in the battle\n"); while(!scanf("%d",&row) ||row >= MATRIX_SIZE)
{
printf("input row error\nplease input again\n");
while(getchar() != '\n')
{ }
} while(!scanf("%d",&rank) || rank >= MATRIX_SIZE )
{
printf("input rank error\nplease input again\n");
while(getchar() != '\n')
{ }
}
} return 0;
} void count_bomb_around(struct battle *p_battlefiled)
{
//This function used in "struct battle initialize_battle(void)" for counting how many bombs around.
int row = 0;
int rank = 0; for(row = 0; row < MATRIX_SIZE; row++)
{
for(rank = 0;rank < MATRIX_SIZE;rank++)
{
if(row-1>=0 && rank -1 >= 0 && p_battlefiled->answer[row-1][rank-1] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
} if(row-1>=0 && rank >= 0 && p_battlefiled->answer[row-1][rank] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
} if(row >=0 && rank -1 >= 0 && p_battlefiled->answer[row][rank-1] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
} if(row+1 <= MATRIX_SIZE-1 && rank +1 <= MATRIX_SIZE-1 && p_battlefiled->answer[row+1][rank+1] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
} if(row+1 <= MATRIX_SIZE-1 && rank <= MATRIX_SIZE-1 && p_battlefiled->answer[row+1][rank] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
} if(row <= MATRIX_SIZE-1 && rank +1 <= MATRIX_SIZE-1 && p_battlefiled->answer[row][rank+1] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
} if(row+1 <= MATRIX_SIZE-1 && rank -1 >= 0 && p_battlefiled->answer[row+1][rank-1] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
} if(row-1 >= 0 && rank+1 <= MATRIX_SIZE && p_battlefiled->answer[row-1][rank+1] == IS_BOMB)
{
(p_battlefiled->num_bomb[row][rank])++;
}
}
}
} void do_open(struct battle *p_battlefiled,int row,int rank)
{ if(p_battlefiled == NULL)
{
printf("parameter error in do_open\n");
return ;
} if(p_battlefiled->answer[row][rank] == IS_BOMB)
{
printf("BOMB~~!!!\n");
for(row = 0; row < MATRIX_SIZE; row++)
{
for(rank = 0;rank < MATRIX_SIZE;rank++)
{
if(p_battlefiled->answer[row][rank] == IS_BOMB)
{
p_battlefiled->current_battlefiled[row][rank] = '@';
}
}
} //game over...
Game = GAMEOVER;
}
else if(p_battlefiled->answer[row][rank] == NOT_BOMB)
{
p_battlefiled->current_battlefiled[row][rank] = ((char)p_battlefiled->num_bomb[row][rank]) + '0'; //Lucky, not bomb
Open_safely_times++;
}
} void do_mine(struct battle *p_battlefiled,int row,int rank)
{
if(p_battlefiled == NULL)
{
printf("parameter error in do_open\n");
return ;
} p_battlefiled->current_battlefiled[row][rank] = '!';
} void do_unknow(struct battle *p_battlefiled,int row,int rank)
{ if(p_battlefiled == NULL)
{
printf("parameter error in do_open\n");
return ;
} p_battlefiled->current_battlefiled[row][rank] = '?';
} void do_operation(struct battle *p_battlefiled,int row, int rank)
{
char operation[BUFFSIZE] = {0}; printf("Which operation would you want to do?\n"); read_operation:
scanf("%s",operation);//Obevious,It's unsafe that there may be a overflow,Just a game never mind it... if(strcmp(operation,"open") == 0)
{
do_open(p_battlefiled,row,rank); print_current_battle(p_battlefiled);
}
else if(strcmp(operation,"mine") == 0)
{
do_mine(p_battlefiled,row,rank); print_current_battle(p_battlefiled);
}
else if(strcmp(operation,"unknow") == 0)
{
do_unknow(p_battlefiled,row,rank); print_current_battle(p_battlefiled);
}
else
{
printf("operation error\nAttention!...Just input one of \"open\" \"mine\" or \"unknow\"\n"); goto read_operation;
} } struct battle initialize_battle(void)
{
struct battle s_battle; int row = 0;
int rank = 0;
int temp = 0; for(rank = 0; rank < MATRIX_SIZE; rank++)
{
for(row = 0;row < MATRIX_SIZE;row++)
{
s_battle.current_battlefiled[row][rank] = '*';
s_battle.answer[row][rank] = NOT_BOMB;
s_battle.num_bomb[row][rank] = 0;
}
} //Maybe, it is time consuming...But it do work correctly.
for(temp = 0; temp < NUM_MINE; temp++)
{
row = (rand() % MATRIX_SIZE);
rank = (rand() % MATRIX_SIZE); if(s_battle.answer[row][rank] == NOT_BOMB)
{
s_battle.answer[row][rank] = IS_BOMB;
}
else
{
temp--;
}
} count_bomb_around(&s_battle); return s_battle;
} void print_current_battle(struct battle *p_battlefiled)
{
int row = 0;
int rank = 0;
for(row = 0; row < MATRIX_SIZE; row++)
{
for(rank = 0;rank < MATRIX_SIZE;rank++)
{
printf("%c ",p_battlefiled->current_battlefiled[row][rank]);
}
printf("\n");
}
}
C language 模拟 win的经典游戏——扫雷的更多相关文章
- C++复现经典游戏——扫雷
国庆小长假,当大家都去看人山人海的时候,我独自一人狂码代码.这两天想要实现的内容是Windows上的一个经典游戏——扫雷.相信90后和一些上班族对此并不陌生.然而,从win8开始,扫雷就不再是Wind ...
- JY游戏之毁经典《扫雷》
JY游戏之毁经典<扫雷> 这是一个经典的pc端游戏,一定的运气加一点数学常识,讲的是一个速度,这次,我利用js JY库重做了这款游戏,加了三次生命,过关难度,也兼容了移动端的触摸事件. 它 ...
- Python之模拟职场人生游戏
题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 1.解题思路 创建一个类,赋予角色不同的方法,使用面向对象思想 ...
- 常用Java API之Ramdom--用代码模拟猜数小游戏
常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...
- Javascript版经典游戏之《扫雷》
翻出年初写的游戏贴上来,扫雷相信大家都玩过,先上图: 源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...
- 用Javascript模拟微信飞机大战游戏
最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...
- FC经典游戏还原之:松鼠大作战2
版权声明:本文原创发布于博客园"优梦创客"的博客空间(id:raymondking123) 原帖地址:http://www.cnblogs.com/raymondking123/p ...
- Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5 第1章 熟悉Unity软件的操作 第2章 打地鼠 (已看) ...
- cocos2d-x《农场模拟经营养成》游戏完整源代码
cocos2d-x农场模拟经营养成游戏完整源代码,cocos2d-x引擎开发,使用JSON交互,支持IOS与 Android,解压后1016MB. 非常强大的游戏源代码 完整游戏源代码 ...
随机推荐
- Icon font font face
font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6: ...
- 史上最完整的PS快捷键(绝对经典)
快速恢复默认值 有些不擅长Photoshop的朋友为了调整出满意的效果真是几经周折,结果发现还是原来的默认效果最好,这下傻了眼,后悔不该当初呀!怎么恢复到默认值呀?试着轻轻点按选项栏上的工具图标,然后 ...
- Node.js初探之GET方式传输
Node.js初探之GET方式传输 例子:form用GET方法向后台传东西 html文件: <form action="http://localhost:8080/aaa" ...
- Python之re正则模块二
13.编译的标志 可以用re.I.re.M等参数,也可以直接在表达式中添加"?(iLmsux)"标志 *s:单行,“.”匹配包括换行符在内的所有字符 *i:忽略大小写 *L:让&q ...
- 电商SEO
大家都知道网站有SEO,电商也有SEO,今天陈晨就带大家来讲讲电商SEO的思路以及电商最重要的选品规划! 1. 选品是核心 2. 挖掘卖点是你走向成功必经之路 3. 产品定价策略---人群画像 4. ...
- SSE图像算法优化系列十二:多尺度的图像细节提升。
无意中浏览一篇文章,中间提到了基于多尺度的图像的细节提升算法,尝试了一下,还是有一定的效果的,结合最近一直研究的SSE优化,把算法的步骤和优化过程分享给大家. 论文的全名是DARK IMAGE ENH ...
- 一篇不错的Gibbs Sampling解释文章,通俗易懂
http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/ 直接原文的链接了.原文写的不错,是中文博客中说的比较明白的了. 但为了保留文章,随 ...
- lua API函数大全
Lua5.1中的API函数 lua_State* luaL_newstate()Lua脚本的编译执行是相互独立的,在不同的线程上执行.通过luaL_newstate()函数可以申请一个虚拟机,返回指针 ...
- System.UnauthorizedAccessException 错误
给目录添加 "Authenticated Users" 这个用户的 读写权限
- 《Linux命令行与shell脚本编程大全》第十七章 创建函数
可以将shell脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了. 17.1 基本的脚本函数 函数:是一个脚本代码块,可以为其命名并在代码中任何位置重用. 17.1.1 创建函数 有 ...