以下是一个Java实现,使用了守护线程来实现线程1的停止。
import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建一个随机数生成器
Random random = new Random();
// 创建一个线程,用于随机打印数字
Thread thread1 = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 生成一个随机数字并打印
int num = random.nextInt(100);
System.out.println(num);
// 等待一段时间再继续打印
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 如果线程被中断,则退出循环
break;
}
}
});
// 将线程1设置为守护线程
thread1.setDaemon(true);
// 创建一个线程,用于接收控制台输入
Thread thread2 = new Thread(() -> {
Scanner scanner = new Scanner(System.in);
while (true) {
// 等待用户输入
String input = scanner.nextLine();
// 如果用户输入了“q”,则停止打印数字
if (input.equals("q")) {
// 中断线程1
thread1.interrupt();
break;
}
}
});
// 启动两个线程
thread1.start();
thread2.start();
}
}
在这个实现中,我们使用 Thread.currentThread().isInterrupted()
来检查线程1是否被中断,如果是,则退出循环。我们还将线程1设置为守护线程,这意味着当没有非守护线程在运行时,它会自动退出。这样,当用户输入“q”并停止线程2时,线程1也会自动退出。
【相关推荐】
int Show(char mine[ROW][COL], int x, int y)
{
return mine[x - 1][y - 1] +
mine[x - 1][y] +
mine[x - 1][y + 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y - 1] +
mine[x][y + 1];
}
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
int x, y;
int endcount = ROW * COL - Count; //非雷的个数,用于标记
int count = Count;//雷的个数
//程序结束有两种情况:
//1.被炸死
//2.非雷点全走过了,只剩下雷点,排雷成功
do
{
if (endcount == 0) //非雷点为0
{
printf("已无雷区\n");
break;
}
printf("请输入坐标:\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
{
if (mine[x][y] == '1')
{
printf("你被炸死了\n");
//展开整个图
PrintBoard(mine, ROW, COL);
break;
}
//否则提示该坐标周围有多少雷
else
{
int showcount = Show(mine, x, y);
show[x][y] = showcount + '0';//数字转字符
PrintBoard(show, ROW, COL);
}
}
}
else
{
printf("坐标错误,请重新输入");
continue;
}
} while (1);
}
解释一下Show函数:
在ASCII表中,我们可以观察到,
‘0’-‘0’=0 ( 字符0-字符0等于 数字0 )
而其他任意数字字符减去字符0可以得到该数,比如
‘5’-‘0’= 5
因此 Show函数将周围八个字符(不是0就是1)
全加起来,再减去8个‘0’。就能得到一个数字,
该数字就表明周围有几个1。
这也就解释了为什么说用1和0表示雷和非雷方便。
最后再解释一下这行代码:
show[x][y] = showcount + '0';//数字转字符
因为show数组保存的是字符,无法完全接收这个返回来的整型数字。
字符数 - ‘0’ = 数字 ——> 字符数 = 数字 + ‘0’
完整代码:
game.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//实际游戏范围
#define ROW 9
#define COL 9
//扩大的范围
#define ROWS 11
#define COLS 11
#define Count 10; //雷的个数
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int row, int col, char set);
//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);
game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col)
{
for (int i = 0; i <= row; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = Count;
while (count)
{
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int Show(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y - 1] +
mine[x - 1][y] +
mine[x - 1][y + 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y - 1] +
mine[x][y + 1] - 8 * '0';
}
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
int x, y;
int endcount = ROW * COL - Count; //非雷的个数,用于标记
int count = Count;//雷的个数
//程序结束有两种情况:
//1.被炸死
//2.非雷点全走过了,只剩下雷点,排雷成功
do
{
if (endcount == 0) //非雷点为0
{
printf("已无雷区\n");
break;
}
printf("请输入坐标:\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
{
if (mine[x][y] == '1')
{
printf("你被炸死了\n");
//展开整个图
PrintBoard(mine, ROW, COL);
break;
}
//否则提示该坐标周围有多少雷
else
{
endcount--; //没找到一个非雷点,非雷数减一,当非雷数为0 ,说明排雷成功,游戏结束
int showcount = Show(mine, x, y);
show[x][y] = showcount + '0';
PrintBoard(show, ROW, COL);
}
}
}
else
{
printf("坐标错误,请重新输入");
continue;
}
} while (1);
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
#include<time.h>
void game()
{
srand((unsigned int)time(NULL));
char mine[ROWS][COLS]; //雷盘
char show[ROWS][COLS];//反馈盘
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0'); //0非雷
InitBoard(show, ROWS, COLS, '*');
//布置雷
SetMine(mine, ROW, COL);
PrintBoard(show, ROW, COL);
//扫雷
int x, y;
FindMine(mine, show);
}
int main()
{
game();
}