JAVA游戏模拟器简介:那些年我们追过的诺基亚!

一、如果……没有苹果手机

大家好,现在的手机性能相当强大了,尤其是智能手机的兴起,让手机的可玩性大大提高。

许多游戏和模拟器的登陆,也让我们得以重温当年的游戏,彻底体会到了科技的强大。

但你还记得吗?

仅仅在12年前,全球最流行的还是诺基亚手机,在上面玩到大型游戏还是个触不可及的梦。

当时的塞班系统仅仅能运行专用的小游戏,即使这些小游戏,也让我们用实体按键和小屏幕玩得如痴如醉。

拥有一台最新型的诺基亚手机,你就是班里最靓的仔!

JAVA推出的J2ME API,让移动设备达到了当时的巅峰,丰富多彩的小游戏和程序登陆塞班,为我们带来很多美好的回忆。

尤其是2009年前后,那还是苹果推出智能手机的前夜。诺基亚在市场可以说是嘎嘎乱杀,多款手机都爆红,覆盖了上到99下到刚会走的全部年龄段。

软件市场也异常火爆,大量JAVA游戏登陆,甚至连很多大厂也纷纷移植自家的游戏。

像Capcom、世嘉、TAITO、EA等就推出了很多知名系列游戏,甚至索尼都想推出自家的《战神》手机版,可由于性能问题,直到安卓时代才成行。

可以说,如果没有苹果降维打击的话,诺基亚说不定如今仍是手机的王者。

二、回忆支撑人类前进

人是需要回忆支撑的,我们有时候往往会想起那些无忧无虑的时光。伴随而来的就是想要重温那时候喜欢的游戏或电影等。

说起游戏来,我就不困了。

今天为大家介绍一下JAVA时代的手机游戏模拟器,希望能带您回味那时的欢乐。

这次的J2ME游戏采用模拟器形式运行,PC模拟器叫做Kahvibreak,游戏格式为jar,已经全部放在GAMES文件夹内了。

安卓模拟器有J2me Loader、KEmulator Lite等,需要大家自己导入喜欢的游戏ROM,启动模拟器后,找到jar游戏路径,运行即可。

我们以PC版为例,简单说一下模拟器的使用方法。

1、模拟器主界面如下图,操作按键对应当年的九宫格手机按键。回车键为确定,Q、W为左右功能键,上下左右键对应手机方向键,E、R键对应*和#键。小键盘数字键对应手机键盘数字,这个按起来是最有感觉的。

2、点击Brwse菜单,All Games显示你拥有的全部游戏,左下角是数量,大约有5679款,四舍五入算5700吧。

3、选择游戏后,点击即可打开游戏界面,用键盘对应的按键进行游玩,\”search“栏可以输入游戏名搜索。

大家可能注意到,我上面没说任天堂的游戏,其实这里面也有马里奥等游戏移植,不过是第三方移植的。

上键跳跃,左右行走,玩起来异常简单,居然还原了原作稍有惯性的手感,任天堂移植也不过如此吧。

4、推荐几个当时很喜欢的游戏,《俄罗斯方块》,效果和手感都很好,操作简便。

《打砖块》,FC非常出名的游戏,在手机端几乎完全移植,仅用左右键即可游玩。

《贪吃蛇》,这是诺基亚的经典游戏了,很多小朋友甚至是从它开始启蒙的,我虽然手残吃不了多长,相信还是有高手可以霸屏的。

其他像RPG类,有大宇亲自移植的《仙剑奇侠传》和《轩辕剑》,还有一波欧美的RPG游戏。

策略类有《文明》、《帝国时代》移植版本,模拟育成的有《三国志》、《同级生》等移植版本,足够大家打法空闲时间了。

三、永不言败的JAVA

在当前游戏繁花迷人眼的情况下,JAVA游戏就像任天堂坚持的那样,用最小的容量做出最大的游戏性。

至今还有开发者在坚持JAVA游戏,螺蛳壳里做道场,需要很大的勇气。

对于我们来说,JAVA游戏一方面可以怀旧一下,一方面也确实有些独特的游戏性,有些游戏笔者真的能沉迷一下午。

大家喜欢的话,可以到网上搜索下载,重温当年的美好。

以上就是今天的全部内容了,感谢大家的观看。

您的关注就是对我最大的鼓励!

贪吃蛇小游戏项目总结

经过了几天的思考和完善,我的贪吃蛇也是终于完成啦。属实是很开心的,当然完成这个项目的过程也是很曲折的。因此就要来一次全面的总结来对自己在这个过程中学到的新知识加以巩固。

这个项目不是完全以自己的知识范围所写出来的,我想到要开发贪吃蛇,第一个想到的问题就是怎么样让蛇显示到我想要它在的位置上呢。由于我之前并没有接触过SetConsoleCursorPosition()函数,因此这个问题就让我很困惑。因此我就开始看了慕课上的教程,于是知道了SetConsoleCursorPosition()函数可以解决我的这个问题。但是对这个函数比较陌生,因此我就在CSDN上查了这个函数加以学习。这个函数可以将你的光标移动到你想移动到的位置,这个函数是需要传入两个参数,但是参数并不是你想要移动的X,Y位置坐标,这里的参数是我之前没有接触到的。SetConsoleCursorPosition(hout,coord);coord是一个结构体,这个是由系统定义好的结构体,结构体中包括了两个成员,一个是x,一个是y,这就是你所想要移动到的坐标。那hout是什么呢?我查到的资料是说hout是一个句柄。我现在的知识量还不够特别深入详细地明白句柄的作用。但在使用这个函数的时候,只需要将coord中的X和Y两个元素赋值就可以进行操作啦。在项目中定义的gotoxy()函数中就用到了这个函数。而为了游戏的美观我又学习到了一个新的函数SetConsoleTextAttribute()函数,这个函数是API设置控制台窗口字体颜色和背景色的函数,可以改变字体颜色,让游戏更加美观。在实现键盘控制功能的时候又学习到了一个新的函数GetAsyncKeyState(VK_UP),这个函数是用来接收键盘的输入值,这里我们通过键盘的上下左右来操作蛇,直接就是UP,DOWN,RIGHT,LEFT来代表键盘的上下左右,这全都是由系统函数所规定的,直接调用即可。

除了上述三个新接触的函数,其它功能的实现都是在我已学知识范围内可以完成的或者是之前接触过的。本次我使用了刚学的链表完成了对蛇的创建。使用链表的好处就是在于实现蛇吃掉食物蛇身增加一节,以及蛇咬到自己,蛇撞墙这些功能时比较好理解,比较形象。相对于用数组来实现这些功能,个人觉得还是链表更简单一些。

新学到的知识总结完啦,下面就来总结一下自己在代码敲完之后,运行程序出现的问题,以及自己的解决方案。我在代码敲完之后,运行程序并进行测试,在多次运行程序之后,发现了这样的问题,那就是食物和蛇身重合的情况还是会出现。

一开始实现这个功能的代码如下:

/*

随机创建食物

*/

void createfood()

{

snake *food_1;

srand((unsigned)time(NULL)); //初始化随机数

food_1=(snake*)malloc(sizeof(snake)); //初始化food_1

while((food_1->x%2)!=0) //保证其为偶数,使得食物能与蛇头对齐,然后食物会出现在网格线上

{

food_1->x=rand()%52+2; //食物随机出现,食物的x坐标在2~52

}

food_1->y=rand()%24+1; //食物的y坐标在1~24

q=head;

while(q->next!=NULL)

{

if(q->x==food_1->x && q->y==food_1->y) //判断蛇身是否与食物重合

{

free(food_1); //如果蛇身和食物重合,那么释放食物指针

createfood(); //重新创建食物

}

q=q->next;

}

gotoxy(food_1->x,food_1->y);

food=food_1;

color(12);

printf(\”●\”); //输出食物

}

这是最开始的代码,这部分我要实现的功能是随机生成食物,并判断是否与蛇身重合,如果重合,就重新生成食物。但从运行效果来看,这部分的代码还是有问题的。于是我想着去把这部分代码给改善一下。思考了很多天,也和同学讨论了这部分的问题,我也在CSDN上问了一些大神博主,最终找出了这部分代码出错的原因。出错的原因有两个:1.while(q->next! =NULL)这个while循环的判断条件导致蛇尾没有进行判断就跳出了循环。2.在while循环中递归调用了这个函数本身,假若第一个节点是与食物重合的,那么会第二次调用这个函数本身,此时第一次调用这个函数中的food_1是被释放掉的。如果第二次调用中食物不在蛇身上产生了,第二次调用结束,那么这个函数回到第一次调用的时候gotoxy(food_1->x,food_1->y);这句话就是违法的。第一个错误很简单,但是即使把第一个错误改掉之后,我发现第二个错误没法改。因此我得出了创建食物和判断是否与蛇身重合不能写在一个函数中的结论。于是我想把这个函数拆成两个函数,但具体改的方案不是我自己完成的,是我和同学一起讨论,最终完成了修改。

修改完的这部分代码如下:

/*

随机出现食物

*/

void createfood()

{

snake *food_1;

srand((unsigned)time(NULL)); //初始化随机数

food_1=(snake*)malloc(sizeof(snake)); //初始化food_1

do

{

food_1->x=rand()%(52/2)*2+2; //食物随机出现,食物的x坐标在2~52

food_1->y=rand()%24+1; //食物的y坐标在1~24

}

while(intobody(food_1->x,food_1->y));

gotoxy(food_1->x,food_1->y);

food=food_1;

color(12);

printf(\”●\”); //输出食物

}

/*

判断食物是否与蛇身重合

*/

int intobody(int x,int y)

{

for(q=head;q!=NULL;q=q->next)

{

if(q->x==x&&q->y==y)

return 1;

}

return 0;

}

把原来的那个函数拆成了两个函数,一个用来创建食物,一个用来判断是否与蛇身重合,如果重合,第二个函数返回值为1,从而导致第一个函数继续循环,重新创建食物,直到不再和蛇身重合,第二个函数返回值为0,第一个函数跳出循环并且打印食物。这样修改十分具有可行性。在运行了很多次后都没有出现蛇身与食物重合的情况。自此,代码完善完成,贪吃蛇项目正式完工。

在这次的项目实践中我觉得自己独立思考问题的能力还有待提高,并且我觉得自己知识面太窄,需要想办法扩充自己的知识面。我的学习路径主要就是CSDN和百度,我认为CSDN上博主的讲解还是很好懂的,比较不错。后期我要试着开发其他一些小程序并且继续通过CSDN和百度不断学习,不断提高自己的编程能力,加油!!!

最后,想要源码的同学请点个赞并私聊我吧!

我是热爱剪辑与编程小刘同学!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。