lua 随机战斗游戏

2014-3-12 杜世伟 Lua

--战斗结果
fight_result = false;
--创建一个空的玩家表
players = {} 
--[[
hp  气血
mp  蓝
atk 攻击
def 防御
spd 速度
luk 运气
mg  魔法
end]]

----初始化玩家数据
function create_player()
	for num=1,2,1 do  -- 创建两个玩家
		local tmp = {name="newplayer",hp=0,mp=0,atk=0,def=0,spd=0,luk=0,mg=0}
		randomseed();		
		tmp.hp  = math.random(400,1000);
		tmp.mp  = math.random(1,100);
		tmp.atk = math.random(1,100);
		tmp.atk = math.random(1,100);
		tmp.spd = math.random(1,100);
		tmp.luk = math.random(1,100);
		tmp.mg = math.random(1,100);
		table.insert(players,tmp);
	end
end

--随机种子
function randomseed()
	math.randomseed(os.time());
end

---攻击造成的伤害
----from 来自谁的攻击
----to   攻击谁
function attack(from,to)
	if(to.def>from.atk+8) then	
	     return math.random(50,200);
	else
	     return from.atk-to.def+math.random(0,8);
	end
end

--闪避
function evasion(spec)
	assert(type(spec) == 'number'); -- 判断数据类型	
	local s = math.random(0,100);
	local a = 30;
	for x=1,spec,1 do
		a = a + 2
		if s == a then return 0 end		
	end
	return 1;
end

--暴击
function crit(spec)
	assert(type(spec) == 'number'); -- 判断数据类型	
	local s = math.random(0,100);
	local a = 30;
	for x=1,spec,1 do
		a =a + 2
		if s == a then return 2 end		
	end
	return 1;
end

-- 魔法 magic
function magic(spec)
	assert(type(spec) == 'number'); -- 判断数据类型	
	local s = math.random(0,100);
	local a = 30;
	for x=1,spec,1 do
		a = a + 2
		if s == a then return 0 end		
	end
	return 1;
end

--谁先动手
function first()
	if players[1] == nil or players[2] == nil then return false end;	
	-- 判断速度
	if players[1].spd == players[2].spd then
		return math.random(0,1)
	elseif players[1].spd > players[2].spd then
	    return true;
	else
	    return 3;
	end
end

--战斗
function fight(player1,player2)
	local string_message; --提示消息
	local c_result = crit(player1.luk);   --暴击
	local e_result = evasion(player2.spd); --闪避	
	local damage = attack(player1,player2)*c_result*e_result; --造成伤害
	
	player2.hp = player2.hp - damage;  -- 气血减少
	--判断被攻击方是否躲避成功
	if e_result == 0 then 			
		-- 被攻击者使用魔法对自己发起战斗者造成伤害
		local m_result = magic(player2.mg);  
		local mg_damage = math.random(1,10)*m_result; 
		player1.mg = player1.mg - mg_damage;
		if player1.mg < 0 then
			player1.mg = 0;
		end
				
		if m_result == 1 then
			string_message = string.format("\n【%s】成功躲避了一次来自【%s】的攻击,并通过自身魔法保护
对【%s】造成【-%d】魔法损耗",player2.name,player1.name,player1.name,mg_damage);
	    else
     		string_message = string.format("\n【%s】成功躲避了一次来自【%s】的攻击",player2.name,player1.name);
	    end			
		
		--随时生成躲避事件
		local ihide = math.random(1,2);	
		if ihide == 1 then			
			print(string_message);
		elseif ihide == 2 then
		    print(string_message);
		end
	end
	
	--暴击结果处理
	if c_result == 2 then
		local iresult = math.random(1,2);
		if iresult==1 then
			print(string.format("\n【%s】请来了孙悟空,把【%s】吓得神经衰弱,【%s】受到了【-%d】点伤
害",player1.name,player2.name,player2.name,damage))
		else
		    print(string.format("\n【%s】请来了观音,把【%s】吓得屁股尿流,【%s】受到了【-%d】点伤害",
player1.name,player2.name,player2.name,damage))
		end
	else
	    if player2.hp < 0  then
		    print(string.format("\n战斗结束,【%s】被击败了\n",player2.name))
		    fight_result=true
		end
	end
end

--战斗结果
function show(player1,player2,itype)
	 if itype == 0 then
	     print("战斗前");
	 else
	     print("战斗后");
	 end
	 if player1==nil or player2==nil then return end
     print(string.format("%s--血:【%d】 攻:【%d】 防:【%d】 速:【%d】 运:【%d】 魔法: 【%d】 \n",
player1.name, player1.hp,player1.atk,player1.def,player1.spd,player1.luk,player1.mg))
     print(string.format("%s--血:【%d】 攻:【%d】 防:【%d】 速:【%d】 运:【%d】 魔法: 【%d】 \n",
player2.name, player2.hp,player2.atk,player2.def,player2.spd,player2.luk,player2.mg))
end
--战斗开始
function start_game()
    -- 临时变量,保存状态
	local state =0;
	print("请输入玩家1姓名,并回车结束");
	local name1 = io.read("*line");
	print("请输入玩家2姓名,并回车结束");
	local name2 = io.read("*line");
	if name1 == nil or  name2 == nil then
		return 0;
	else
	    print(string.format("\n 【 %s 】 和 【 %s 】将要开启一场生死战斗,Ready go",name1,name2));	
	end
	create_player(); -- 初始化玩家数据
	players[1].name = name1;
	players[2].name = name2;
	
	local f = first(); -- 判断谁发起战斗
	if f == 1 or false  then  -- 如果发起战斗失败或者同时发起战斗,则需要重新初始化数据
		players[1].name = name1;
	    players[2].name = name2;
	end
	--战斗前数据
	show(players[1],players[2],0);
	
	while fight_result == false do	
	     --luaSlp();
		  if state == 0 then
		      fight(players[1],players[2]);
			  state = 1;
		  else
		      fight(players[1],players[2]);
			  state = 0;
		  end			
	end 
	--战斗后数据
	show(players[1],players[2],1);
end 

start_game();

将以上代码保存为random.lua

运行lua random.lua ,效果如下:点击查看原图点击查看原图

标签: lua math random

Powered by emlog 沪ICP备2023034538号-1