• 超过lua上帝的语言


    上帝的语言(god)它是基于lua和RPP新一代编程语言


    为什么需要它?

    1.好多人不喜欢lua语法,god的语法更像C

    2.god支持元编程、闭包、协程

    3.凡是lua支持的特性god也支持,lua不支持的宏god也支持,因此god比lua强大

    4.god能够使用lua库,甚至同意god和lua混合编程

    5.god是最快的脚本语言之中的一个,性能与C接近。由于god基于luaJIT

    6.god的编译器仅仅有92行代码。这是世界上最简单的编译器,即使是菜鸟也能看懂并改动

    7.god全然开源。92行代码想不开源都不行


    官网:https://github.com/roundsheep/god




    god写的控制台贪食蛇:


    ffi=require('ffi')
    
    ffi.cdef[
    	#pragma pack(1) 
    	typedef struct 
    	{
    		int dwSize;
    		int bVisible;
    	}CONSOLE_CURSOR_INFO;
    	int SetConsoleCursorInfo(int hConsoleOutput,
    		CONSOLE_CURSOR_INFO* lpConsoleCursorInfo);
    	int system(const char* s);
    	typedef struct 
    	{
    		unsigned short x;
    		unsigned short y;
    	}COORD;
    	int SetConsoleCursorPosition(int hConsoleOutput,
    		COORD dwCursorPosition);
    	int GetStdHandle(int nStdHandle);
    	int printf(const char* fmt,...);
    	typedef unsigned short ushort;
    	int SetConsoleTextAttribute(int h,ushort w);
    	short GetAsyncKeyState(int vkey);
    	int GetTickCount();
    ]
    
    clear=function(v)
    {
    	var i
    	for(i=1,table.maxn(v))
    	{
    		v[i]=null
    	}
    }
    
    exist=function(v,a)
    {
    	var i
    	for(i=1,table.maxn(v))
    	{
    		if(v[i]==a)
    		{
    			return true
    		}
    	}
    	return false
    }
    
    push=function(v,a)
    {
    	v[table.maxn(v)+1]=a
    }
    
    push_front=function(v,a)
    {
    	var count=#v
    	var i
    	for(i=count,1,-1)
    	{
    		v[i+1]=v[i]
    	}
    	v[1]=a
    }
    
    food=function()
    {
    	g_food=math.modf(math.random()*10000)%200+1
    	if(exist(g_arr,g_food))
    	{
    		food()
    	}
    }
    
    update=function()
    {
    	var i
    	for(i=1,200)
    	{
    		gotoxy(i%10*2,math.modf(i/10))
    		if(exist(g_arr,i))
    		{
    			out('■')
    		}
    		elif(i==g_food)
    		{
    			out('★')
    		}
    		else
    		{
    			out('  ')
    		}
    	}
    }
    
    gotoxy=function(x,y)
    {
    	var pos=ffi.new('COORD',[])
    	pos.x=x
    	pos.y=y
    	ffi.C.SetConsoleCursorPosition(g_std_out,pos)
    }
    
    out=function(s)
    {
    	ffi.C.printf(s)
    }
    
    init=function()
    {
    	math.randomseed(os.time())
    	g_std_out=ffi.C.GetStdHandle(-11)
    	g_next=10
    	clear(g_arr)
    	push(g_arr,105)
    	food()
    	var cur_info=ffi.new('CONSOLE_CURSOR_INFO',[])
    	cur_info.dwSize=1
    	cur_info.bVisible=0
    	ffi.C.SetConsoleCursorInfo(g_std_out,cur_info)
    	ffi.C.system('mode con cols=20 lines=22')
    	ffi.C.SetConsoleTextAttribute(g_std_out,0x0a)
    	gotoxy(0,20)
    	out(' ******************')
    }
    
    key=function()
    {
    	var temp
    	if(ffi.C.GetAsyncKeyState(0x26)!=0)
    	{
    		temp=-10
    	}
    	elif(ffi.C.GetAsyncKeyState(0x28)!=0)
    	{
    		temp=10
    	}
    	elif(ffi.C.GetAsyncKeyState(0x25)!=0)
    	{
    		temp=-1
    	}
    	elif(ffi.C.GetAsyncKeyState(0x27)!=0)
    	{
    		temp=1
    	}
    	else
    	{
    		return
    	}
    	if(table.maxn(g_arr)<2||g_arr[2]!=g_arr[1]+temp)
    	{
    		g_next=temp
    	}
    }
    
    check=function()
    {
    	var temp=g_arr[1]+g_next
    	if(temp<1||temp>200||math.abs(temp%10-g_arr[1]%10)>1||exist(g_arr,temp))
    	{
    		return false
    	}
    	return true
    }
    
    g_arr=[]
    init()
    var start=ffi.C.GetTickCount()
    while(true)
    {
    	key()
    	if(ffi.C.GetTickCount()-start<100)
    	{
    		goto continue
    	}
    	start=ffi.C.GetTickCount()
    	if(!check())
    	{
    		break
    	}
    	push_front(g_arr,g_arr[1]+g_next)
    	if(g_food!=g_arr[1])
    	{
    		g_arr[#g_arr]=null
    	}
    	else
    	{
    		food()
    	}
    	update()
    	::continue::
    }


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    第二十三章 kubernetes 核心技术Volume
    第二十一章 kubernetes核心技术Ingress
    第十九章 kubernetes 核心技术ConfigMap
    vuejs在解析时出现闪烁的原因及防止闪烁的方法
    2020/9/5
    2021/9/3
    2021/9/7
    2021/9/2
    2021/9/4
    2021/9/6
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4715169.html
Copyright © 2020-2023  润新知