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. 非常强大的游戏源代码 完整游戏源代码 ...
随机推荐
- js和jquery实现监听键盘事件
一.使用javascript实现 <!DOCTYPE html> <html> <head> <meta charset="utf-8"& ...
- AngularJS学习篇(二)
AngularJS 指令 AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 通过内置的指令来为应用添加功能. AngularJS 允许你自定义指令. Angular ...
- 双11Java程序员书单推荐
Java <Java核心技术卷I> <Java核心技术卷II> <Java编程思想> <Java并发编程实战> <Effective Java&g ...
- shiro实现无状态的会话,带源码分析
转载请在页首明显处注明作者与出处 朱小杰 http://www.cnblogs.com/zhuxiaojie/p/7809767.html 一:说明 在网上都找不到相关的信息,还是翻了大半天 ...
- eclipse中导入jsp等工程使用过程中常遇问题
1.导入的工程JSP文件出现报错的情况 这个一般不怎么影响文件的执行,这些文件飘红主要是因为eclipse的校验问题. 具体错误信息:Multiple annotations found at thi ...
- API设计相关
来自HeroKu的HTTP API 设计指南 http://get.jobdeer.com/343.get https://github.com/interagent/http-api-design ...
- python开发 getpass获取操作系统登陆名
需用使用python getpass模块 import getpass def get_system_user_name(): return getpass.getuser() def main(): ...
- 基于Vue.js的大型报告页项目实现过程及问题总结(二)
距离上一篇文章过去了二十多天了,期间一直想把第二部分写完,结果在测试过程中遇到了各种坑爹的问题,到今天才算基本完成,也许还有后续,但趁着今天有时间就写出来吧,也算对这个项目的一个总结了 遇到最大问题: ...
- spring各个版本开发包下载
spring各个开发包版本下载地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/o ...
- TFboy养成记 MNIST Classification (主要是如何计算accuracy)
参考:莫烦. 主要是运用的MLP.另外这里用到的是批训练: 这个代码很简单,跟上次的基本没有什么区别. 这里的lossfunction用到的是是交叉熵cross_entropy.可能网上很多形式跟这里 ...