Перейти к содержимому


[Угадай число. Мультиплеер]


Сообщений в теме: 5

#1 miceZipper

    Новичок

  • Пользователи
  • Pip
  • 12 сообщений
  • ГородЯрославль

Отправлено 13 Июль 2011 - 21:10

Реализовал популярную игру "Угадай Число" для нескольких игроков.
Один загадывает - остальные угадывают. В конце, угадавшему и загадавшему, даются баллы рейтинга. Они рассчитываются по определенным формулам, которые зависят от кол-ва попыток угадываний и от самого числа. Формулы, возможно, примитивны и не лишены недостатков, однако лучше я придумать не смог ввиду слабых знаний матанализа :D
Промежуточные результаты сохраняются в файле в таком виде:
1
100
0
51
0
Первая строка - ID того, кто загадал
Вторая строка - само загаданное число
Третья строка - кол-во попыток отгадать это число
Четвертая строка - текущее вознаграждение тому, кто угадает это число
Пятая строка - текущее вознаграждение тому, кто задал это число

Как видно из описания - все просто.

Теперь сам код.
Вопросов по коду у меня, в принципе, нет. Только я не уверен в перезаписи файла. Мне кажется я это по-корявому сделал :D
Ошибка еще будет вылетать, если загадать число, превышающее диапазон Integer. Однако, я ее убирать не буду. Пущай вылетает. Нефиг большие числа загадывать ^_^

Планирую, добавить команду для стирания загаданного числа тем, кто его загадал или админом. А то, пока никто не разгадает число - нельзя будет загадать другое. А если баг? ^_^

Прошу строго не судить - это мой второй скрипт
import ru.jimbot.modules.AbstractServer;
import ru.jimbot.util.*;
import ru.jimbot.modules.chat.*;
import ru.jimbot.modules.*;

//Установка скрипта как обработчика команды
if(in.equals("install")){
cmd.addCommand("!число2", new Cmd("!число2","$c $n",39,name));
cmd.addAuth("number2","Угадай число мультиплеер");
out="Ok";
return;
}

try{
	
	//Парсим строку аргументов
	Vector v = cmd.getParser().parseArgs(msg);
	String command_1 = (String)v.get(0);
	int nmb = (Integer)v.get(1);
	String pathto = "./services/Test/scripts/command/text/guess_number_multi.txt";
	OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream(pathto,true),"windows-1251");
	
	String output_s = null;
	String[] ss = null;
	Users victor = cmd.srv.us.getUser(uin);
	int number = 0;
	int steps = 0;
	int reward1 = 0;
	int reward2 = 0;
	//Проверяем комнату
	if(victor.room!=0){
		proc.mq.add(uin,"Играть в игру [Угадай число. Мультиплеер] можно только в комнате Банька|0|");
		return;
	}
	//Проверяем наличие в файле уже загаданных чисел
	String s = cmd.psp.loadText(pathto);
	if(command_1.equals("загадать")){
	if(s=="") {
		reward1 = (int) nmb/2 + 1;
		reward2 = 0;
		ow.write(victor.id + "\n" + nmb + "\n" + "0" + "\n" + reward1 + "\n" + reward2);
		cmd.srv.cq.addMsg("[Угадай число. Мультиплеер]\n" + victor.localnick + "|" + victor.id + "| загадал(а) число.\nНачальное вознаграждение составляет " + reward1, "", victor.room);
		ow.close();
		return;
		} else {
		ss = s.split("\n");
		int id = Integer.parseInt(ss[0]);
		Users u = cmd.srv.us.getUser(id);
		proc.mq.add(uin,"Число уже загадано пользователем " + u.localnick + "|" + u.id + "|. Отгадай сначало это.");
		return;
		}}
		//Отгадываем число
	if(command_1.equals("угадать"))if(s=="") {
		proc.mq.add(uin,"Число еще не загадано.");
		return;
		}
		else {
		ss = s.split("\n");
		//Загружаем данные из файла
		int id = Integer.parseInt(ss[0]);
		number = Integer.parseInt(ss[1]);
		steps = Integer.parseInt(ss[2]);
		reward1 = Integer.parseInt(ss[3]);
		reward2 = Integer.parseInt(ss[4]);
		Users u = cmd.srv.us.getUser(id);
		
		if(victor.id==u.id){
			proc.mq.add(uin,"Нельзя угадывать у самого себя");
			return;
		}
		//Обрабатываем эти данные
		if(nmb>number) {
			steps++;
			if(steps==number) steps++;
			reward1=(int) Math.abs(number/(steps*2) + steps)*2;
			reward2=(int) Math.abs((number + steps*2)/(number - steps) + steps)*2;
			cmd.srv.cq.addMsg("[Угадай число. Мультиплеер]\n" + victor.localnick + "|" + victor.id + "| попытался(лась) угадать загаданное число, назвав число " + nmb + "\nЗагаданное число оказалось меньше предполагаемого.\nВознаграждение составляет " + reward1, "", victor.room);
		}
		else
		if(nmb<number) {
			steps++;
			if(steps==number) steps++;
			reward1=(int) Math.abs(number/(steps*2) + steps)*2;
			reward2=(int) Math.abs((number + steps*2)/(number - steps) + steps)*2;
			cmd.srv.cq.addMsg("[Угадай число. Мультиплеер]\n" + victor.localnick + "|" + victor.id + "| попытался(лась) угадать загаданное число, назвав число " + nmb + "\nЗагаданное число оказалось больше предполагаемого.\nВознаграждение составляет " + reward1, "", victor.room);
		}
		else {
			if(steps==number) steps++;
			reward1=(int) Math.abs(number/(steps*2) + steps)*2;
			reward2=(int) Math.abs((number + steps*2)/(number - steps) + steps)*2;
			cmd.srv.cq.addMsg("[Угадай число. Мультиплеер]\n" + victor.localnick + "|" + victor.id + "| угадал(а) загаданное число " + nmb + " с " + steps + " раза\nПобедитель получает " + reward1 + "\nВедущий получает " + reward2, "", victor.room);
			
			//Награждаем ведущего и победителя
			victor.ball = victor.ball + reward1;
			u.ball = u.ball + reward2;
			
			//Стираем данные из файла
			ow.close();
			OutputStreamWriter ow1 = new OutputStreamWriter(new FileOutputStream(pathto,false),"windows-1251");
			ow1.write("");
			ow1.close();
			return;
		}
		
		//Сохраняем новые данные
		ow.close();
		OutputStreamWriter ow1 = new OutputStreamWriter(new FileOutputStream(pathto,false),"windows-1251");
		ow1.write(u.id + "\n" + number + "\n" + steps + "\n" + reward1 + "\n" + reward2);
		ow1.close();
		return;
		}
} catch (Exception ex) {
ex.printStackTrace();
proc.mq.add(uin,"Ошибка "+ex.getMessage());
} 

Сообщение отредактировал miceZipper: 13 Июль 2011 - 21:10


#2 _MasteR_

    Профи

  • Пользователи
  • PipPipPipPipPip
  • 768 сообщений
  • ГородSearchMe

Отправлено 13 Июль 2011 - 22:45

Молодец, видно что что-то умеешь! "+" Ставлю, только пожалуйста:), делай не скриптами, и вот строчку:

String pathto = "./services/Test/scripts/command/text/guess_number_multi.txt";
Заменяй на(если будешь делать в коде):
String pathto = "./services/"+srv.getName()+"/scripts/command/text/guess_number_multi.txt";
Или:
String pathto = "./services/"+cmd.srv.getName()+"/scripts/command/text/guess_number_multi.txt";
Если будешь продолжать делать скрипты.

#3 ~ёМАё~

    Профи

  • Специалисты
  • PipPipPipPipPip
  • 817 сообщений
  • ГородТамбовская обл.

Отправлено 13 Июль 2011 - 23:14

особо код не смотрел, но + поставлю..
автор что то делает сам, а это похвально :)

#4 miceZipper

    Новичок

  • Пользователи
  • Pip
  • 12 сообщений
  • ГородЯрославль

Отправлено 13 Июль 2011 - 23:38

assassins4, спасибо за замечание. Учту в дальнейшем :)

#5 rixs

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 17 Август 2011 - 11:12

+хорош

#6 fraer72

    Профи

  • Специалисты
  • PipPipPipPipPip
  • 1 429 сообщений

Отправлено 17 Август 2011 - 13:20

Можно не писать в файл, в боте есть:

Manager.getInstance().getData("key");
Manager.getInstance().setData("key", "value");

Например:

Users victor = cmd.srv.us.getUser(uin);
Manager.getInstance().setData("key", victor.id);
//Получим
Object user = Manager.getInstance().getData("key");
int id = user;

Ну уж как автору виднее.

Сообщение отредактировал fraer72: 17 Август 2011 - 13:21






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей