C语言实现扫雷。可以标记。
2018-04-01 21:36
866 查看
做这个游戏的思路是,因为要显示未扫出的坐标*,又要显示扫出的坐标,还要保存雷的坐标,显然一个数组实现起来有困难。不妨设置两个数组,一个存雷的坐标,另一个用来用户进行操作。
此代码实现了扫雷时候进行扩展,近似WIN系统里的扫雷。还可以进行标记雷的位置,防止扫错。
代码如下:
<game.h>
<tset.c>
<game.c>
此代码实现了扫雷时候进行扩展,近似WIN系统里的扫雷。还可以进行标记雷的位置,防止扫错。
代码如下:
<game.h>
#include <stdio.h> #include <time.h> #include <stdlib.h> #define ROW 11 #define COL 11 #define ROWS 9 #define COLS 9 #define MINE_NO 10 void init(char mine[ROW][COL],char show[ROW][COL],int row,int col); void print(char arr[ROW][COL],int rows,int cols); void arrmine(char mine[ROW][COL],int rows,int cols); void selecoor(char mine[ROW][COL],char show[ROW][COL],int rows,int cols); int countmine(char mine[ROW][COL],int x,int y); void launchTL(char mine[ROW][COL],char show[ROW][COL],int rows,int cols); void launchDR(char mine[ROW][COL],char show[ROW][COL],int rows,int cols);
<tset.c>
#include "game.h" void game() { char mine[ROW][COL] = {0}; char show[ROW][COL] = {0}; init(mine,show,ROW,COL); //初始化雷阵行列 arrmine(mine,ROWS,COLS); //布置雷阵 print(mine,ROWS,COLS); //打印雷阵 printf("***********************************\n"); print(show,ROWS,COLS); selecoor(mine,show,ROWS,COLS); //玩家选择雷坐标 } void menu() { while(1) { int n = 0; printf("*************************\n"); printf("***** 1.play *****\n"); printf("***** 0.exit *****\n"); printf("*************************\n"); printf("请选择:"); scanf("%d",&n); if(n == 1) { printf("游戏开始!\n"); game(); } else if(n == 0) { printf("退出游戏!\n"); break; } else { printf("输入错误,请重新输入。\n"); } } } int main() { srand((unsigned int)time(NULL)); menu(); return 0; }
<game.c>
#include "game.h" void init(char mine[ROW][COL],char show[ROW][COL],int row,int col) { int i = 0,j = 0; for(i=0 ;i<row ;i++) { for(j=0 ;j<col ;j++) { mine[i][j] = '0'; show[i][j] = '*'; } } } void print(char arr[ROW][COL],int rows,int cols) { int i = 0,j = 0; for(i=0 ;i<=rows+1 ;i++) { if(i<2) { printf(" "); } else { printf("%d ",i-1); } } printf("\n"); for(i=0 ;i<=rows+1 ;i++) { printf("- "); } printf("\n"); for(i=1 ;i<=rows ;i++) { printf("%d ",i); printf("| "); for(j=1 ;j<=cols ;j++) { printf("%c ",arr[i][j]); } printf(" |"); printf("\n"); } for(i=0 ;i<=rows+1 ;i++) { printf("- "); } printf("\n"); } void arrmine(char mine[ROW][COL],int rows,int cols) { int x = 0,y = 0; int i = MINE_NO; while(i) { x = rand()%rows+1; y = rand()%cols+1; if(mine[x][y] != '1') { mine[x][y] = '1'; i--; } } } int countmine(char mine[ROW][COL],int a,int b) { return mine[a-1][b]+mine[a-1][b-1]+mine[a][b-1]+mine[a+1][b-1]+mine[a+1][b] +mine[a+1][b+1]+mine[a][b+1]+mine[a-1][b+1]-8*'0'; } void launchTL(char mine[ROW][COL],char show[ROW][COL],int rows,int cols,int x,int y) { if(show[x][y] == '0' && x>0 && x<=ROWS && y>0 && y<=COLS) { show[x-1][y] = countmine(mine,x-1,y)+'0'; launchTL(mine,show,ROWS,COLS,x-1,y); show[x-1][y-1] = countmine(mine,x-1,y-1)+'0'; launchTL(mine,show,ROWS,COLS,x-1,y-1); show[x][y-1] = countmine(mine,x,y-1)+'0'; launchTL(mine,show,ROWS,COLS,x,y-1); } } void launchDR(char mine[ROW][COL],char show[ROW][COL],int rows,int cols,int x,int y) { if(show[x][y] == '0' && x>0 && x<=ROWS && y>0 && y<=COLS) { show[x+1][y] = countmine(mine,x+1,y)+'0'; launchDR(mine,show,ROWS,COLS,x+1,y); show[x][y+1] = countmine(mine,x,y+1)+'0'; launchDR(mine,show,ROWS,COLS,x,y+1); show[x-1][y+1] = countmine(mine,x-1,y+1)+'0'; launchDR(mine,show,ROWS,COLS,x-1,y+1); } } void selecoor(char mine[ROW][COL],char show[ROW][COL],int rows,int cols) { int x = 0,y = 0,count1 = 0,i = 0,j = 0; int o = 0,p = 0; int s; while(1) { int count2 = 0; printf("请选择要排查的坐标:\n"); scanf("%d %d",&x,&y); if(count1 == 0 && mine[x][y] == '1') { int n =1,tmp1 = 0,tmp2 = 0; while(n) { tmp1 = rand()%rows+1; tmp2 = rand()%cols+1; if(mine[tmp1][tmp2] == '0') { mine[tmp1][tmp2] = '1'; mine[x][y] = '0'; n = 0; } } } count1 = 1; if(show[x][y] == 'X') { printf("该坐标已被标记,请重新输入:\n"); continue; } printf("是否需要标记地雷?(1是/2否)\n"); scanf("%d",&s); if(s == 1) { printf("请输入标记的坐标:\n"); scanf("%d %d",&o,&p); show[o][p] = 'X'; } if(show[x][y] != '*') { printf("该坐标已被排查或输入错误,请重新输入:\n"); continue; } if(mine[x][y] == '1') { printf("你被炸死了!\n"); print(mine,ROWS,COLS); break; } show[x][y] = countmine(mine,x,y)+'0'; //计算周围雷数 launchTL(mine,show,ROWS,COLS,x,y); launchDR(mine,show,ROWS,COLS,x,y);//展开无雷区 print(show,ROWS,COLS); for(i=1 ;i<=rows ;i++) { for(j=1 ;j<=cols ;j++) { if(show[i][j] == '*') { count2++; } } } if(count2 == MINE_NO) { printf("你赢了。\n"); break; } } }
相关文章推荐
- 扫雷程序(C语言并优化): 1>第一次下子,不炸死。 2>坐标周围没雷,可以实现展开。
- !--扫雷之C语言实现--!
- 简易小游戏扫雷——C语言编程实现
- c语言实现扫雷(简易版,控制台)
- c语言实现扫雷(非图形化界面)
- 一步一步实现扫雷游戏(C语言实现)(二)
- 【剑指offer】C语言:实现函数可以将一个字符串转换为对应的整数,如+1234输出1234
- C语言实现一个Window控制台带彩色,且可以用方向键选择并确认的菜单式列表(二) ---学生信息管理系统
- 用c语言实现一个通讯录; 通讯录可以存储1000个人的信息,信息包括姓名、性别、年龄、电话、住址 提供方法: 1.添加联系人信息 2.删除指定联系人信息 3.查找指定联系人信息 4.修改指定联系&
- C语言也可以“面向对象”—— C语言实现封装、继承和多态
- C语言实现扫雷
- 一步一步实现扫雷游戏(C语言实现)(一)
- 小项目 : C语言实现扫雷小游戏
- C语言“黑框框”下简易扫雷实现
- 扫雷程序完美版!!!!!!可以通过点击鼠标来翻开格子或者做上标记 !!!!!!!
- C语言实现扫雷程序
- 【C语言】【面试题】使用main函数的参数,实现一个整数计算机,程序可以接受三个参数
- Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本
- c语言实现轮廓标记
- C语言+二维数组+非递归实现扫雷游戏(代码贴过来后无缩进,尽请谅解,工程完成度:85%)