当前位置:网站首页>七夕特制:《牛郎会织女》
七夕特制:《牛郎会织女》
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);
}
结果演示:
因为初始化炸弹数量有点多所以要耐心等一等:
一开始是已经隐藏好的网格:
键盘输入坐标会显示周围炸弹数和距离织女的半径
运气比较好,第二步就踩雷了
再来一把,胜利来的很突然:
边栏推荐
- 《剑指offer》刷题分类
- Three ways to set a specific device UWP XAML view
- UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd6 in position 120: invalid continuation byte
- UDP communication
- milvus配置相关
- "Jianzhi offer" brush title classification
- 大势所趋之下的nft拍卖,未来艺术品的新赋能
- Spss-一元回归实操
- 8 年产品经验,我总结了这些持续高效研发实践经验 · 协同篇
- 可视化工作流引擎开发OA系统,让企业少花冤枉钱
猜你喜欢
Chapter7 : Network-Driven Drug Discovery
搬走地下空间开发利用“绊脚石” 中地数码取得地下空间透明化技术突破
硬件开发定制全流程解析
PowerCLi batch configuration of NTP
【线性代数02】AX=b的2种解释和矩阵乘法的5种视角
【SQL之降龙十八掌】01——亢龙有悔:入门10题
数电快速入门(一)(BCD码和三种基本逻辑运算的介绍)
[Linear Algebra 03] Elimination method display and 4 solutions of AX=b
[2022 Hangzhou Electric Power Multi-School 5 1012 Questions Buy Figurines] Application of STL
8 年产品经验,我总结了这些持续高效研发实践经验 · 协同篇
随机推荐
[2022 Hangzhou Electric Power Multi-School 5 1012 Questions Buy Figurines] Application of STL
Zynq Fpga图像处理之AXI接口应用——axi_lite接口使用
多个平台显示IP属地,必须大力推行互联网实名制
Yolov7:Trainable bag-of-freebies sets new state-of-the-art for real-time objectdetectors
如何将二叉搜索树转化为一个有序的双向链表(原树上修改)
js数据类型、节流/防抖、点击事件委派优化、过渡动画
【SQL之降龙十八掌】01——亢龙有悔:入门10题
DSPE-PEG-Aldehyde,DSPE-PEG-CHO,磷脂-聚乙二醇-醛基一种疏水18碳磷脂
dotnet delete read-only files
buu web
[Linear Algebra 03] Elimination method display and 4 solutions of AX=b
jekyll adds a flowchart to the blog
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd6 in position 120: invalid continuation byte
Codeforces Round #811 (Div. 3)
【分布式】分布式ID生成策略
模拟对抗之红队免杀开发实践
如何一键重装Win11系统 一键重装系统方法
What does Xinchuang mean?Which industries are involved?Why develop Xinchuang?
Domestic PMP certificate of gold content how
【CC3200AI 实验教程 1】疯壳·AI语音人脸识别(会议记录仪/人脸打卡机)-开发环境搭建