我该如何使用结构数组制作菜单(将Lua代码转换为C++代码)?
2015-11-22 11:14:24
收藏:0
阅读:124
评论:1
我使用 lua 编写了一个菜单,现在想在 c++ 中实现相同的功能。以下是我尝试的代码,但我认为需要使用结构体并创建一个新的数组来实现。在 lua 中,我只需使用三个函数即可制作任何样式的菜单。
在下面的数组中:
char* menuname[]
= { "calc", "internet", "painter", "movie", "update", "exit" };
void SelectItem(char* menu[])
{
fflush(stdin);
int key = _getch();
if (key == 13)
{
system("CLS");
switch (selecteditem)
{
case 1:Calcmenu(); break;
case 2:CtoF(); wait(); break;
case 3:painter(); break;
case 4:printf("Work In Progress\n"); wait(); break;
case 5:printf("Work In Progress\n"); wait(); break;
case 6:exit(0); wait(); break;
default: mainmenu(); break;
}
}
switch (key)
{
case 72: if(selecteditem > 1) selecteditem -= 1; break;
case 80: if (selecteditem < 6) selecteditem += 1; break;
}
}
void printmenu(char* menu[])
{
gotoxy(20, 10);
int menusize = strlen(*menu);
for (int i = 0; i < menusize; i++)
{
if (i == selecteditem - 1)
{
gotoxy(30, 9 + i);
printf(">>[%d]%s\n", i + 1, menu[i]);
}
else
{
gotoxy(30, 9 + i);
printf(" [%d]%s\n", i + 1, menu[i]);
}
}
}
void main()
{
while (1)
{
system("CLS");
printmenu(menuname);
SelectItem(menuname);
}
}
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你的编码相当优秀。我的意思是,Lua。在一些练习之后,你也会成为一个优秀的C程序员。
以下是如何在C中实现的(不是真正的C++):
#include <stdio.h> /* ---------------------- type -------------------------*/ /* 将类型'menu_item'定义为菜单项。 */ typedef struct { char *text; void (*handler)(); /* 指向函数的指针 */ } menu_item; /* --------------------- handlers ----------------------*/ void ItemCalc() { printf("启动计算器...\n"); } void ItemPainter() { printf("启动画图工具...\n"); } void ItemMovie() { printf("启动电影播放器...\n"); } /* --------------------- data --------------------------*/ menu_item my_menu[] = { { "calc", ItemCalc }, { "painter", ItemPainter }, { "movie", ItemMovie }, }; int my_menu_size = sizeof(my_menu) / sizeof(menu_item); int selecteditem = 1; /* -------------------- I/O-----------------------------*/ /* 输入输出(I/O)非常依赖于平台。在我的系统上没有_getch()。 因此为了让这个程序在所有系统上都可以运行,我们模拟了一个I/O系统: */ int _key = 0; void simulate_key_press(int key) { _key = key; } int read_key() { return _key; } /* -----------------------------------------------------*/ void SelectItem(menu_item menu[], int menu_size) { fflush(stdin); int key = read_key(); if (key == 13) { printf("正在执行第 %d 项: \n", selecteditem); menu[selecteditem].handler(); } else { int num = (key - '0'); // convert characters '1'..'9' to integers 1..9. if (num >= 1 && num <= menu_size) { selecteditem = num; printf("选中第 %d 项。\n", num); } else printf("无效按键。只能输入ENTER键或数字\n"); } } void printmenu(menu_item menu[], int menu_size) { int i; for (i = 0; i < menu_size; i++) { if (i == selecteditem - 1) { printf(">>[%d]%s\n", i + 1, menu[i].text); } else { printf(" [%d]%s\n", i + 1, menu[i].text); } } } void main() { printmenu(my_menu, my_menu_size); simulate_key_press('2'); SelectItem(my_menu, my_menu_size); printmenu(my_menu, my_menu_size); simulate_key_press(13); SelectItem(my_menu, my_menu_size); }关于使用数组:有两种方法可以确定它们的大小。上面,我在函数中明确告诉数组的大小。另一种方法是使用“哨兵”值标记数组的末尾:
menu_item my_menu[] = { { "calc", ItemCalc }, { "painter", ItemPainter }, { "movie", ItemMovie }, { NULL, NULL }, };然后在循环中,在达到这个元素时停止:
void printmenu(menu_item menu[]) { int i; for (i = 0; menu[i].text != NULL; i++) {Lua这样的“脚本”语言和C(或C++)这样的低级语言之间有很多差异。我希望我的代码能激励你学习更多。即使最终你不会使用C,学习它了解机器的实际工作原理也是值得的。