当前位置:网站首页>七夕特制:《牛郎会织女》
七夕特制:《牛郎会织女》
2022-08-04 21:33:00 【代码骑士】
相传,天帝的女儿织女下凡间游玩,
爱上了聪明忠厚的凡人牛郎,
织女偷偷下凡与牛郎成婚,过起了男耕女织的幸福生活,
天上一日,人间数年,他们很快便生下了一儿一女,
但好景不长,这件事很快就让天帝和王母娘娘知道了,王母娘娘亲自下凡,强行带走了织女,
老牛帮助牛郎很快就要追上了织女,
王母眼看情势不妙,就用头上的银钗在两人之间一挥,一条波涛汹涌的大河出现也就就是所谓的银河,挡在了牛郎前面,
牛郎过不去于是在河这边哀伤。织女也在河那边哭泣,
王母感于两人的感情,开恩让他们每年见一面,
到了见面之日,喜鹊自动搭桥,两人在桥上拥抱,诉说一年的相思和想念。
以上就是中国传统神话《牛郎织女》的故事,正所谓有情人终成眷属,但是一年才能见一次,这俩人也太惨了点,于是乎,为了能让牛郎织女顺利相见,顺便展示一下我的才华,直接撸起袖子,打开了我尘封已久的visual studio。
借助《牛郎织女》的传统神话故事为背景,我有一个初步的想法,做个牛郎拯救织女的小游戏,用unity?但是缺少素材,一天又画不完,所以果断放弃了,那就重操旧业,用C++和那个简单好操作的EasyX图形库。
先设计一个玩法:
首先弄一张游戏地图,其实就是一个n*n的网格。
然后随机找个格子,放入织女。
玩家通过点击网格一步一步找到织女,来个鹊桥相会!
但是这样就感觉过于简单了,在来点其他元素。
随机放几个炸弹,组织牛郎见织女,就说这是王母娘娘的陷阱!(王母娘娘:这锅我不背a!)
但是光有炸弹也不行,得把它和织女全部隐藏,然后稍微给牛郎一点点提示,比如目前的位置周围有几个炸弹,距离织女的半径是多少……
(怎么有点扫雷那味了……)
大致设计好了,接下来就撸代码了!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
首先得有个游戏地图就用二维数组来表示:
//定义地图数组并初始化为0
int map[MAX][MAX] = { 0 };
然后还要有织女和炸弹等元素:
int w_num = 1;//设置织女星数量
int trap = 10;//设置陷阱数量
随机设置织女的位置和炸弹位置:
//游戏初始化设置,定义织女星和陷阱的位置
void InitSetting()
{
//loadimage(&Bridge, L"bridge.jpg", SIZE, SIZE);
//随机生成织女星位置
if (w_num > 0)
{
srand((unsigned)time(NULL));
int pos_i = rand() % (MAX - 1);//0~MAX-1
int pos_j = rand() % (MAX - 1);//0~MAX-1
if (pos_i * SIZE < border && pos_i * SIZE < border)
{
if (map[pos_i][pos_j] == 0)//确保不出地图有效边界
{
map[pos_i][pos_j] = 1;//设置织女星位置
w_num--;
}
}
}
//获取陷阱个数
trap = rand() % 17 + 15;//产生15到32个炸弹
//随机生成陷阱
while (trap > 0)
{
srand((unsigned)time(NULL));
int pos_i = rand() % (MAX - 1);//0~MAX-1
int pos_j = rand() % (MAX - 1);//0~MAX-1
if (pos_i * SIZE < border && pos_j * SIZE < border)
{
if (map[pos_i][pos_j] == 0)//确保陷阱位置自身不重合且与织女星位置不重合
{
map[pos_i][pos_j] = 2;//设置陷阱位置
trap--;
}
}
}
}
然后新建一个绘制函数,用来显示游戏画面:
void Show()
{
//遍历网格
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if (map[i][j] != 3)//绘制空格(map[i][j]==0)
{
setlinecolor(BLACK);
rectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
setfillcolor(WHITE);
fillrectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
}
if (map[i][j] == 1)//绘制织女星
{
setlinecolor(BLUE);
circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
}
if (map[i][j] == 2)//绘制陷阱
{
setlinecolor(WHITE);
circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
}
if (map[i][j] == 3)//绘制玩家位置
{
setlinecolor(WHITE);
circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
putimage(i * SIZE, j * SIZE, &Bridge);
}
}
}
}
在让用户从键盘输入当前位置:
void WithInput()//用户输入函数
{
int pos_x, pos_y;//定义用户选择输入的位置
//scanf_s("%d,%d", &pos_x, &pos_y);//获取用户键盘输入
cin >> pos_x >> pos_y;
if (map[pos_x-1][pos_y-1] == 2) {
//踩中陷阱游戏结束
gameOver = 0;
}
else if (map[pos_x-1][pos_y-1] == 1) {
//找到织女星游戏胜利
gameOver = 2;
}
else if (map[pos_x-1][pos_y-1] == 0
&& pos_x >= 1 && pos_x <= 10
&& pos_y >= 1 && pos_y <= 10)
{
map[pos_x-1][pos_y-1] = 3;
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
temp[i][j] = 0;
temp[pos_x - 1][pos_y - 1] = 3;
}
}
计算一下周围的炸弹个数:
if (map[i][j] == 3)//绘制玩家位置
{
int t_num = 0;
//判断周围九宫格中的陷阱数量
if (map[i - 1][j - 1] == 2)t_num++;//左上
if (map[i][j - 1] == 2)t_num++;//上
if (map[i + 1][j - 1] == 2)t_num++;//右上
if (map[i - 1][j] == 2)t_num++;//左
if (map[i + 1][j] == 2)t_num++;//右
if (map[i - 1][j + 1] == 2)t_num++;//左下
if (map[i][j + 1] == 2)t_num++;//下
if (map[i + 1][j + 1] == 2)t_num++;//右下
//显示陷阱个数
printText(t_num, j*SIZE, i*SIZE);
//cout << t_num << endl;
}
在计算一下距离织女的位置:
这里显示的是方圆位置,也就是半径,因为直接告诉横纵坐标太简单了!!!
所以用勾股定理简单算一下半径:
//结算终点距离
void getLength()
{
int x1, y1, x2, y2;
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if (temp[i][j] == 3)//当前位置
{
x2 = i;
y2 = j;
}
if (map[i][j] == 1)//终点位置
{
x1 = i;
y1 = j;
}
}
}
int x = x1 - x2;
int y = y1 - y2;
if (x < 0)x = -x;
if (y < 0)y = -y;
int length = (int)sqrt(x * x + y * y);
printText(length, 550, 550);
}
然后在稍加润色,小游戏就完成了!
#include<iostream>
#include<graphics.h>
#include<time.h>
#include<Windows.h>
#define SIZE 50
#define MAX 10
using namespace std;
//定义全局变量
const int border = MAX * SIZE;
const int weidth = 640;
const int heigth = 640;
int map[MAX][MAX] = { 0 };
int temp[MAX][MAX] = { 0 };
int w_num = 1;//织女星
int trap = 10;//陷阱数量
int gameOver = 1;
//函数声明
void InitSetting();//游戏初始化函数
void printMap();//打印地图函数
void printText(int t_count, int x, int y);//打印文字函数
void Show();//绘制游戏画面
void WithInput();//获取用户输入
void getLength();//计算终点距离
int main()
{
initgraph(weidth, heigth);
InitSetting();
while (1)
{
Show();
WithInput();
if (gameOver == 0)
{
MessageBox(NULL, TEXT("游戏失败!牛郎掉入了王母娘娘的陷阱!"), TEXT("《鹊桥会》"), MB_OK);
printf("游戏失败!牛郎掉入了王母娘娘的陷阱!\n");
printf("游戏地图:1是织女星2是陷阱\n");
printMap();
break;
}
else if (gameOver == 2)
{
MessageBox(NULL, TEXT("游戏胜利!你已成功帮助牛郎和织女相会!"), TEXT("《鹊桥会》"), MB_OK);
printf("游戏胜利!你已成功帮助牛郎和织女相会!\n");
printf("游戏地图:1是织女星2是陷阱\n");
printMap();
break;
}
getLength();
}
return 0;
}
void InitSetting() {
if (w_num > 0)
{
srand((unsigned)time(NULL));
int pos_i = rand() % (MAX - 1);//0~MAX-1
int pos_j = rand() % (MAX - 1);//0~MAX-1
if (pos_i * SIZE < border && pos_i * SIZE < border)
{
if (map[pos_i][pos_j] == 0)//确保不出地图有效边界
{
map[pos_i][pos_j] = 1;//设置织女星位置
w_num--;
}
}
}
//获取陷阱个数
trap = rand() % 17 + 15;//产生15到32个炸弹
//随机生成陷阱
while (trap > 0)
{
srand((unsigned)time(NULL));
int pos_i = rand() % (MAX - 1);//0~MAX-1
int pos_j = rand() % (MAX - 1);//0~MAX-1
if (pos_i * SIZE < border && pos_j * SIZE < border)
{
if (map[pos_i][pos_j] == 0)//确保陷阱位置自身不重合且与织女星位置不重合
{
map[pos_i][pos_j] = 2;//设置陷阱位置
trap--;
}
}
}
}
void printMap() {
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
cout << map[i][j] << ' ';
}
cout << endl;
}
}
void printText(int t_count, int x, int y) {
TCHAR text[20];
_stprintf_s(text, _T("%d"), t_count);
settextcolor(RED);
settextstyle(SIZE, SIZE, _T("宋体"));
outtextxy(x, y, text);
}
void Show() {
//遍历网格
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if (map[i][j] != 3)//绘制空格(map[i][j]==0)
{
setlinecolor(BLACK);
rectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
setfillcolor(WHITE);
fillrectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
}
if (map[i][j] == 1)//绘制织女星
{
setlinecolor(BLUE);
//circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
}
if (map[i][j] == 2)//绘制陷阱
{
setlinecolor(WHITE);
//circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
}
if (map[i][j] == 3)//绘制玩家位置
{
int t_num = 0;
//setlinecolor(RED);
//circle(j * SIZE + SIZE / 2, i * SIZE + SIZE / 2, SIZE / 2);
if (map[i - 1][j - 1] == 2)t_num++;//左上
if (map[i][j - 1] == 2)t_num++;//上
if (map[i + 1][j - 1] == 2)t_num++;//右上
if (map[i - 1][j] == 2)t_num++;//左
if (map[i + 1][j] == 2)t_num++;//右
if (map[i - 1][j + 1] == 2)t_num++;//左下
if (map[i][j + 1] == 2)t_num++;//下
if (map[i + 1][j + 1] == 2)t_num++;//右下
//显示陷阱个数
printText(t_num, j * SIZE, i * SIZE);
//cout << t_num << endl;
}
}
}
}
void WithInput() {
int pos_x, pos_y;//定义用户选择输入的位置
//scanf_s("%d,%d", &pos_x, &pos_y);//获取用户键盘输入
cin >> pos_x >> pos_y;
if (map[pos_x - 1][pos_y - 1] == 2) {
//踩中陷阱游戏结束
gameOver = 0;
}
else if (map[pos_x - 1][pos_y - 1] == 1) {
//找到织女星游戏胜利
gameOver = 2;
}
else if (map[pos_x - 1][pos_y - 1] == 0
&& pos_x >= 1 && pos_x <= 10
&& pos_y >= 1 && pos_y <= 10)
{
map[pos_x - 1][pos_y - 1] = 3;
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
temp[i][j] = 0;
temp[pos_x - 1][pos_y - 1] = 3;
}
}
void getLength() {
int x1, y1, x2, y2;
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if (temp[i][j] == 3)//当前位置
{
x2 = i;
y2 = j;
}
if (map[i][j] == 1)//终点位置
{
x1 = i;
y1 = j;
}
}
}
int x = x1 - x2;
int y = y1 - y2;
if (x < 0)x = -x;
if (y < 0)y = -y;
int length = (int)sqrt(x * x + y * y);
printText(length, 550, 550);
}
结果演示:
因为初始化炸弹数量有点多所以要耐心等一等:
一开始是已经隐藏好的网格:
键盘输入坐标会显示周围炸弹数和距离织女的半径
运气比较好,第二步就踩雷了
再来一把,胜利来的很突然:
边栏推荐
- Develop your own text recognition application with Tesseract
- PCBA scheme design - kitchen voice scale chip scheme
- ROS packages visualization
- 热力学相关的两个定律
- DSPE-PEG-Aldehyde,DSPE-PEG-CHO,磷脂-聚乙二醇-醛基一种疏水18碳磷脂
- 传奇服务器需要什么配置?传奇服务器租用价格表
- SPSS-unary regression practice
- Altium Designer 19.1.18 - draw polygons copper hollow out, for the cursor just capture solutions
- In which industries is the PMP certificate useful?
- 强网杯2022——WEB
猜你喜欢
随机推荐
【线性代数03】消元法展示以及AX=b的4种解情况
Arduino 电机测速
[2022 Hangzhou Electric Multi-School 5 1003 Slipper] Multiple Super Source Points + Shortest Path
Altium Designer 19.1.18 - Protecting Locked Objects
信创是什么意思?涉及哪些行业?为什么要发展信创?
大势所趋之下的nft拍卖,未来艺术品的新赋能
强网杯2022——WEB
EasyGBS接入最新版海康摄像头后无法传递告警信息该如何解决?
STM32MP157A驱动开发 | 01- 板载LED作为系统心跳指示灯
Codeforces Round #811 (Div. 3)
国内的PMP证书含金量到底如何
LayaBox---知识点
NFT宝典:你需要知道NFT的术语和定义
LayaBox---TypeScript---Example
How to understand the crawler's Scrapy framework in the simplest and most popular way?
数字重塑客观世界,全空间GIS发展正当其时
Some problems with passing parameters of meta and params in routing (can be passed but not passed, empty, collocation, click to pass multiple parameters to report an error)
中大型商业银行堡垒机升级改造方案!必看!
deepstream多相机显示布局
stm32mp157系统移植 | 移植ST官方5.10内核到小熊派开发板