#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define N 3
struct mine_box {
char type; // '*'代表地雷,n代表周围有地雷的地雷数(n=0-8)
char bMarked; // 是否被标记
char bOpened; // 是否被打开
} mine_array[N][N];
int CurrentRow, CurrentCol; // 记录当前光标的位置
int openedBlank = 0; // 记录被掀开的格子数
/*将光标定位到屏幕上的某个指定位置的坐标上*/
void gotoxy(int x,int y)
{ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE hConsoleOut;
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);
csbiInfo.dwCursorPosition.X = x;
csbiInfo.dwCursorPosition.Y = y;
SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);
}
// 显示一个格子的内容
void printBox(struct mine_box mb)
{
// 格子没被掀开也没做标记
if(mb.bOpened == 0 && mb.bMarked == 0)
printf("□");
// 格子被标记一次
else if(mb.bMarked == 1)
printf("√");
// 格子被标记两次
else if(mb.bMarked == 2)
printf("?");
// 格子被掀开,显示格子中的内容
else
switch(mb.type) {
// 格子中有地雷
case '*':
printf("⊕");
break;
// 格子没有地雷并且四周也没有地雷
case 0:
printf(" ");
break;
case 1:
printf("1");
break;
case 2:
printf("2");
break;
case 3:
printf("3");
break;
case 4:
printf("4");
break;
case 5:
printf("5");
break;
case 6:
printf("6");
break;
case 7:
printf("7");
break;
case 8:
printf("8");
break;
}
}
// 将光标移动到第row行第col列的格子上
void MoveTo(int row, int col)
{
CurrentRow = row;
CurrentCol = col;
gotoxy(CurrentCol*4+2,CurrentRow*2+1);
}
// 刷新屏幕
void refreshScreen(int state)
{
int i, j;
gotoxy(0, 0);
printf("┏━");
for(i = 1; i < N; i++)
printf("┳━");
printf("┓\n");
for(i = 0; i < N; i++) {
printf("┃");
for(j = 0; j < N; j++) {
if(state == -1 && mine_array[i][j].bMarked == 1 && mine_array[i][j].type != '*') {
printf("¤"); // 标记错了地雷
continue;
}
if(state != 0) { // 游戏结束,将所有的盒子掀开显示其中内容
mine_array[i][j].bOpened = 1;
mine_array[i][j].bMarked = 0;
}
printBox(mine_array[i][j]);
printf("┃");
}
if(i < N-1) {
printf("\n┣");
for(j = 1; j < N; j++) {
printf("━╋");
}
printf("━┫\n");
}
else {
printf("\n┗");
for(j = 1; j < N; j++) {
printf("━┻");
}
printf("━┛\n");
}
}
printf("按键指南:A左移,D右移,W上移,S下移,X翻开,C标记,Q退出\n");
}
void MoveUp()
{
if(CurrentRow > 0) {
CurrentRow --;
MoveTo(CurrentRow, CurrentCol);
}
}
void MoveDown()
{
if(CurrentRow < N-1) {
CurrentRow ++;
MoveTo(CurrentRow, CurrentCol);;
}
}
void MoveLeft()
{
if(CurrentCol > 0) {
CurrentCol --;
MoveTo(CurrentRow, CurrentCol);
}
}
void MoveRight()
{
if(CurrentCol < N-1) {
CurrentCol ++;
MoveTo(CurrentRow, CurrentCol);
}
}
int openMine()
{
int saveRow = CurrentRow, saveCol = CurrentCol;
if(mine_array[CurrentRow][CurrentCol].bOpened)
return 0;
mine_array[CurrentRow][CurrentCol].bOpened = 1;
mine_array[CurrentRow][CurrentCol].bMarked = 0;
if(mine_array[CurrentRow][CurrentCol].type == '*') {
refreshScreen(-1);
MoveTo(N+1, 0);
printf("失败!游戏结束)\n");
exit(2);
}
printBox(mine_array[CurrentRow][CurrentCol]);
MoveTo(CurrentRow, CurrentCol);
// 进一步要做的是当掀开一个type=0的空格子时,将其周围没有地雷的空格子自动掀开
return 1;
}
void markMine()
{
if(mine_array[CurrentRow][CurrentCol].bOpened == 1)
return;
if(mine_array[CurrentRow][CurrentCol].bMarked == 0)
mine_array[CurrentRow][CurrentCol].bMarked = 1;
else if(mine_array[CurrentRow][CurrentCol].bMarked == 1)
mine_array[CurrentRow][CurrentCol].bMarked = 2;
else if(mine_array[CurrentRow][CurrentCol].bMarked ==2)
mine_array[CurrentRow][CurrentCol].bMarked = 0;
printBox(mine_array[CurrentRow][CurrentCol]);
MoveTo(CurrentRow, CurrentCol);
}
main()
{
int num, i, j, row, col, count;
printf("输入地雷数: ");
scanf("%u", &num);
if(num > N*N) {
printf("地雷数超限\n");
return -1;
}
memset((void*)mine_array, 0, N*N*sizeof(struct mine_box));
//随机设置num个地雷的位置
srand((unsigned)time(NULL));
for(i=0; i<num; i++) {
row = rand()%N;
col = rand()%N;
if(mine_array[row][col].type == 0)
mine_array[row][col].type = '*';
else // 已经有雷了,重新取下一个格子
i--;
}
// 计算每个非雷格子周围的地雷数
for(row=0; row<N; row++)
{
for(col = 0; col < N; col++) {
if(mine_array[row][col].type == '*') {
for(i = row-1; i <= row+1; i++) {
for(j = col-1; j <= col+1; j++) {
if(i >= 0 && j >= 0 && i < N && j < N && mine_array[i][j].type != '*')
mine_array[i][j].type ++;
}
}
}
}
}
refreshScreen(0);
MoveTo(N/2, N/2); // 将光标移到中央的位置
do {
switch(getch()) {
case 'a':
case 'A':
MoveLeft();
break;
case 's':
case 'S':
MoveDown();
break;
case 'd':
case 'D':
MoveRight();
break;
case 'w':
case 'W':
MoveUp();
break;
case 'x':
case 'X':
if(openMine() == 1) {
if(++openedBlank == N*N-num) { //所有的空格都被掀开
refreshScreen(1);
MoveTo(N+1, 0);
printf("成功!游戏结束。\n");
exit(0);
}
}
break;
case 'c':
case 'C':
markMine();
break;
case 'q':
case 'Q':
MoveTo(N+1, 0);
printf("是否退出?(y/n)");
if(getch() == 'y')
return 0;
}
} while(1);
}
温馨提示:内容为网友见解,仅供参考
C语言扫雷游戏源代码
"扫雷"小游戏C代码 include<stdio.h>#include<math.h>#include#include<stdlib.h>main( ){char a[102][102],b[102][102],c[102][102],w;int i,j; \/*循环变量*\/int x,y,z[999]; \/*雷的位置*\/int t,s; \/*标记*\/int m,n,lei; \/*计数*\/int u,v; \/*输入*\/int ...
急求用c语言编写扫雷详细代码
if(LeftPress())\/*鼠标左键盘按下*\/ { MouseGetXY(); if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)\/*重新来*\/ { MouseOff(); gameAGAIN=1; break; } if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)\/*当前鼠标位置在格子范围内*\/ { j=(MouseX-190)\/20;\/*x坐标*\/ i=(MouseY-90...
C语言 游戏 代码
void Init(void);\/*图形驱动*\/ void MouseOn(void);\/*鼠标光标显示*\/ void MouseOff(void);\/*鼠标光标隐藏*\/ void MouseSetXY(int,int);\/*设置当前位置*\/ int LeftPress(void);\/*左键按下*\/ int RightPress(void);\/*鼠标右键按下*\/ void MouseGetXY(void);\/*得到当前位置*\/ void ...
C语言如何编程实现扫雷?使用WIN-TC或Microsoft Visual C++
定义一个2维的数组,然后用rand() 随机布雷,然后计算没有雷的上面的数字。 有雷的定义为-1,没有雷的上面可能是0~8。算法很简单,剩下的就是绘制界面了。总体不难,为何不自己试试?
谁会用C语言编译扫雷游戏啊,会帮帮我,我在此谢谢各位了
学过c语言会写游戏的基本没人,都在皮毛而已,一般向贪吃蛇,俄罗斯方块之类的直接用c语言在debug框中写就可以了,最多是调用api的图形显示,至于扫雷,肯定要设计鼠标的操作,而且要检测鼠标当前位置,要么用c++,要么就是用窗口相对于桌面的位置,窗口内部像素相对于窗口的位置加起来就可以确定鼠标位置了...
c语言游戏代码大全(收录100多款经典游戏源码)
操作步骤 Step1:下载源码 访问Github上的C语言游戏代码大全仓库,找到需要的游戏源码,点击“Download”按钮下载源码压缩包。Step2:解压源码 使用解压软件将下载的源码压缩包解压到本地硬盘上。Step3:编译源码 使用C语言编译器(如GCC)编译源码,生成可执行文件。Step4:运行游戏 运行生成的可执行文件,开始...
给我提供个小游戏的C 语言代码
这个程序可以作为初学者学习C语言绘图和游戏的实例。 该程序在Turbo C2.0 下编译通过 由于扫雷游戏是用鼠标操作的,而Turbo C中提供的鼠标驱动程序在Windows xp下不可用,所以我随源程序提供了一个鼠标驱动的头文件,须将将该头文件复制到Turbo C2.0 的安装目录下的“include”文件夹中方可编译或运行...
求一个用C语言编写的小游戏代码
OnSink(); \/\/ 不可下移时,执行“沉底方块”操作}\/\/ 沉底方块void OnSink(){ int i, x, y; \/\/ 连续下移方块 DrawBlock(g_CurBlock, HIDE); BLOCKINFO tmp = g_CurBlock; tmp.y--; while (CheckBlock(tmp)) { g_CurBlock.y--; tmp.y--; } DrawBlock(g_CurBlock, FIX); \/\/ 固定方块...
操作系统是如何编写的?用什么语言编写的?
操作系统使用C语言和汇编编写的,Windows,UNIX,Linux都是这样的。绝大部分是C,极少情况使用汇编。操作系统的编写需要与硬件厂商紧密配合,两者相辅相成。操作系统的实现要对硬件作出假设,硬件的设计要对操作系统的使用做出假设。所以开发操作系统很大的难度就是要和众多硬件设备供应商保持紧密的合作。编写...
如何学好C语言?
在Unix下,你可以找到无数优秀的源代码供你尽情阅读,你可以方便地查看某个库函数的联机手册,还可以看到最优秀的代码风格(说到代码风格,我会专门写一篇文章详细叙述)。 归结起来就是一句话:初学C语言,建议使用Windows系统和集成开发环境,在准备向“高手”方向努力时,请先转向Unix平台。 三、万事俱备,你就是东风 书...