Что нового

[Элементы GUI] Игра "Поймай кнопку"

Egorkaru

Новичок
Сообщения
20
Репутация
1
Версия AutoIt: 3.3.9.21

Описание: Цель игры - поймать кнопку с надписью "Поймай меня". При каждом нажатии на эту кнопку будет прибавляться по 1 очку. Имеется возможность отображения времени игры в формате "минуты:секунды", отнятия определённое количество очков за промахи. Доступные звания: никто (0-10 очков), новичок (10-25 очков), опытный игрок (25-50 очков), магистр (50-100 очков), мастер (100-250 очков), эксперт (250-500 очков), профи (500-750 очков), ас (750-1000 очков), победитель (1000 очков).

Примечания: нет.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Egorkaru,
Эту игру написать надо? Или я что-то недопонял?
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
:smile: Написал и завис на пару часов) Даже не думал что будет так увлекательно)
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiToolbar.au3>
#include <StaticConstants.au3>
#include <ToolbarConstants.au3>
#include <WindowsConstants.au3>

Global $Stats = 0, $sTime = 0, $mTime = 0, $hFile

#Region ### START Koda GUI section ###
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Eat Me so fast how you can!", 1201, 882, 239, 93)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "No")
$Label1 = GUICtrlCreateLabel($Mtime & ":" & $STime, 1144, 3, 51, 20)
$Label2 = GUICtrlCreateLabel("Очки: " & $stats, 160, 3, 90, 20)
$Label3 = GUICtrlCreateLabel("", 584, 3, 90, 20)
$Button1 = GUICtrlCreateButton("Eat Me", 576, 400, 51, 25)
GUICtrlSetOnEvent($Button1, "Eat_Button")
$Button2 = GUICtrlCreateButton("Load", 0, 1, 75, 23)
GUICtrlSetOnEvent($Button2, "Load_Game")
$Button3 = GUICtrlCreateButton("Save", 80, 1, 75, 23)
GUICtrlSetOnEvent($Button3, "Save_Game")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

AdlibRegister("Time", 1000)

While 1
	GUICtrlSetPos( $button1, Random(0,1140), Random(30,770), 60)
	Text()
WEnd

Func Eat_Button()
	$stats += 2
	$Label2 = GUICtrlCreateLabel("Очки: " & $stats, 160, 3, 90, 20)
EndFunc

Func No()
	$stats -= 1
	$label2 = GUICtrlCreateLabel("Очки: " & $stats, 160, 3, 90, 20)
EndFunc

Func Load_Game()
	$stats += 1
	$hFile = FileOpen(@ScriptDir & "\SetsEatGame.txt", 0)
	If $hFile = -1 Then MsgBox(4096, "Ошибка", "Невозможно открыть файл настроек!")
	$Stats = FileReadLine($hFile, 1)
	$sTime = FileReadLine($hFile, 2)
	$mTime = FileReadLine($hFile, 3)
EndFunc

Func Save_Game()
	$stats += 1
	FileDelete(@ScriptDir & "\SetsEatGame.txt")
	$hFile = FileOpen(@ScriptDir & "\SetsEatGame.txt", 1)
	If $hFile = -1 Then MsgBox(4096, "Ошибка", "Невозможно открыть файл настроек!")
	FileWriteLine($hFile, $Stats)
	FileWriteLine($hFile, $sTime)
	FileWriteLine($hFile, $mTime)
EndFunc

Func Time()
	$STime += 1
	If $STime > 59 Then
		$STime = 0
		$Mtime += 1
	EndIf
	GUICtrlDelete($label1)
	$labelTime = GUICtrlCreateLabel($Mtime & ":" & $STime, 1144, 3, 90, 20)
EndFunc

Func CLOSE()
	AdlibUnRegister("Time")
	FileClose($hFile)
	Exit
EndFunc

Func Text()
	If $stats < 0 Then Sleep(1050)
	If $stats >= 0 And $stats <= 10 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Никто", 584, 3, 320, 20)
		Sleep(1000)
	EndIf
	If $stats >= 11 And $stats <= 25 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Новичок", 584, 3, 320, 20)
		Sleep(950)
	EndIf
	If $stats >= 26 And $stats <= 50 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Опытный", 584, 3,320, 20)
		Sleep(900)
	EndIf
	If $stats >= 51 And $stats <= 100 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Магистр", 584, 3, 320, 20)
		Sleep(850)
	EndIf
	If $stats >= 101 And $stats <= 250 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Мастер", 584, 3, 320, 20)
		Sleep(800)
	EndIf
	If $stats >= 251 And $stats <= 500 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Эксперт", 584, 3, 320, 20)
		Sleep(750)
	EndIf
	If $stats >= 501 And $stats <= 750 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Профи", 584, 3, 320, 20)
		Sleep(700)
	EndIf
	If $stats >= 751 And $stats <= 1000 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Ас", 584, 3, 320, 20)
		Sleep(650)
	EndIf
	If $stats >= 1001 And $stats <= 2000 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: Победитель", 584, 3, 320, 20)
		Sleep(600)
	EndIf
	If $stats >= 2001 Then
		GUICtrlDelete($Label3)
		$Label3 = GUICtrlCreateLabel("Звание: БОГ", 584, 3, 320, 20)
		Sleep(550)
	EndIf
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Анти-Бот :smile:
Код:
Func Eat_Button()
    $tPoint = _WinAPI_GetMousePos()
    If WinActive($Form1) And _WinAPI_WindowFromPoint($tPoint) = GUICtrlGetHandle($Button1) Then
        $stats += 2
        $Label2 = GUICtrlCreateLabel("Очки: " & $stats, 160, 3, 90, 20)
    Else
        No()
    EndIf
EndFunc
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Такой вот баг выявился: если быстро кликать по кнопке то она не сдвинется... Как решить? А то я в недоумении :blink:


Добавлено:
Сообщение автоматически объединено:

:D Сглупил, надо было всего лишь добавить:
Код:
Func Eat_Button()
    $tPoint = _WinAPI_GetMousePos()
    If WinActive($Form1) And _WinAPI_WindowFromPoint($tPoint) = GUICtrlGetHandle($Button1) Then
        $stats += 2
        $Label2 = GUICtrlCreateLabel("Очки: " & $stats, 160, 3, 90, 20)
		GUICtrlSetPos( $button1, Random(0,1140), Random(30,770), 60)
    Else
        No()
    EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Dima1337,
Вы каждую секунду создаете новый элемент (GUICtrlCreateLabel) на окне. Создайте его один раз и используйте функцию GUICtrlSetData(). С другими можно делать то же самое.
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
madmasles, Спасибо, с кнопкой вроде вписал сразу а с Label тормознул)
InnI, И вам спасибо за анти ботик :beer:
Добавил скрытие сейва. Просто мешает на рабочем столе висит)
Код:
FileSetAttrib(@ScriptDir & "\SetsEatGame.txt", "+H")

Итог :D
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiToolbar.au3>
#include <StaticConstants.au3>
#include <ToolbarConstants.au3>
#include <WindowsConstants.au3>

Global $Stats = 0, $sTime = 0, $mTime = 0, $hFile

#Region ### START Koda GUI section ###
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Eat Me so fast how you can!", 1201, 882, 239, 93)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "No")
$Label1 = GUICtrlCreateLabel($Mtime & ":" & $STime, 1144, 3, 51, 20)
$Label2 = GUICtrlCreateLabel("Очки: " & $stats, 160, 3, 90, 20)
$Label3 = GUICtrlCreateLabel("", 584, 3, 190, 20)
$Button1 = GUICtrlCreateButton("Eat Me", 576, 400, 51, 25)
GUICtrlSetOnEvent($Button1, "Eat_Button")
$Button2 = GUICtrlCreateButton("Load", 0, 1, 75, 23)
GUICtrlSetOnEvent($Button2, "Load_Game")
$Button3 = GUICtrlCreateButton("Save", 80, 1, 75, 23)
GUICtrlSetOnEvent($Button3, "Save_Game")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

AdlibRegister("Time", 1000)

While 1
	GUICtrlSetPos( $button1, Random(0,1140,1), Random(30,770,1), 60)
	Text()
WEnd

Func Eat_Button()
    $tPoint = _WinAPI_GetMousePos()
    If WinActive($Form1) And _WinAPI_WindowFromPoint($tPoint) = GUICtrlGetHandle($Button1) Then
        $stats += 2
		GUICtrlSetData($Label2,"Очки: " & $stats)
        GUICtrlSetPos( $button1, Random(0,1140,1), Random(30,770,1), 60)
    Else
        No()
    EndIf
EndFunc

Func No()
	$stats -= 1
	GUICtrlSetData($Label2,"Очки: " & $stats)
EndFunc

Func Load_Game()
	$stats += 1
	$hFile = FileOpen(@ScriptDir & "\SetsEatGame.txt", 0)
	If $hFile = -1 Then MsgBox(4096, "Ошибка", "Невозможно открыть файл настроек!")
	$Stats = FileReadLine($hFile, 1)
	$sTime = FileReadLine($hFile, 2)
	$mTime = FileReadLine($hFile, 3)
	FileClose($hFile)
	GUICtrlSetData($Label2,"Очки: " & $stats)
EndFunc

Func Save_Game()
	$stats += 1
	FileDelete(@ScriptDir & "\SetsEatGame.txt")
	$hFile = FileOpen(@ScriptDir & "\SetsEatGame.txt", 1)
	If $hFile = -1 Then MsgBox(4096, "Ошибка", "Невозможно открыть файл настроек!")
	FileWriteLine($hFile, $Stats)
	FileWriteLine($hFile, $sTime)
	FileWriteLine($hFile, $mTime)
	FileClose($hFile)
	FileSetAttrib(@ScriptDir & "\SetsEatGame.txt", "+H")
	GUICtrlSetData($Label2,"Очки: " & $stats)
EndFunc

Func Time()
	$STime += 1
	If $STime > 59 Then
		$STime = 0
		$Mtime += 1
	EndIf
	GUICtrlSetData($label1,$Mtime & ":" & $STime)
EndFunc

Func CLOSE()
	AdlibUnRegister("Time")
	Exit
EndFunc

Func Text()
	If $stats < 0 Then Sleep(1050)
	If $stats >= 0 And $stats <= 10 Then
		GUICtrlSetData($Label3,"Звание: Никто")
		Sleep(1000)
	EndIf
	If $stats >= 11 And $stats <= 25 Then
		GUICtrlSetData($Label3,"Звание: Новичок")
		Sleep(950)
	EndIf
	If $stats >= 26 And $stats <= 50 Then
		GUICtrlSetData($Label3,"Звание: Опытный")
		Sleep(900)
	EndIf
	If $stats >= 51 And $stats <= 100 Then
		GUICtrlSetData($Label3,"Звание: Магистр")
		Sleep(850)
	EndIf
	If $stats >= 101 And $stats <= 250 Then
		GUICtrlSetData($Label3,"Звание: Мастер")
		Sleep(800)
	EndIf
	If $stats >= 251 And $stats <= 500 Then
		GUICtrlSetData($Label3,"Звание: Эксперт")
		Sleep(750)
	EndIf
	If $stats >= 501 And $stats <= 750 Then
		GUICtrlSetData($Label3,"Звание: Профи")
		Sleep(700)
	EndIf
	If $stats >= 751 And $stats <= 1000 Then
		GUICtrlSetData($Label3,"Звание: Ас")
		Sleep(650)
	EndIf
	If $stats >= 1001 And $stats <= 2000 Then
		GUICtrlSetData($Label3,"Звание: Победитель")
		Sleep(600)
	EndIf
	If $stats >= 2001 Then
		GUICtrlSetData($Label3,"Звание: БОГ")
		Sleep(550)
	EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Мой вариант (пример реализации).
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
;~ В версиях AutoIt выше 3.3.8.1 нельзя пользоваться функцией GUICtrlSetCursor()
Global Const $aData[3][2] = [['Start', 'Stop'],['', '_WM_SETCURSOR'],[$GUI_HIDE, $GUI_SHOW]], $aBkColor[3] = [0x0000FF, 0x00FF00, 0xFF0000]

Global $hGui, $iBtn, $hBtn, $iPS_Lbl, $iLbl, $hLbl, $iDummy, $iPlay, $fShow, $iPointsScored, $aKey[1][2] = [['^1']];Ctrl+1

$hGui = GUICreate('Catch me', 400, 400)
$iBtn = GUICtrlCreateButton($aData[0][$iPlay], 5, 5, 40, 20)
$hBtn = GUICtrlGetHandle(-1)
GUICtrlCreateLabel('Очки:', 50, 5, 30, 20, BitOR($GUI_SS_DEFAULT_LABEL, $SS_CENTER, $SS_CENTERIMAGE))
$iPS_Lbl = GUICtrlCreateLabel('0', 80, 5, 20, 20, BitOR($GUI_SS_DEFAULT_LABEL, $SS_CENTER, $SS_CENTERIMAGE))
$iLbl = GUICtrlCreateLabel('catch me', Random(0, 370, 1), Random(25, 370, 1), 30, 30, BitOR($GUI_SS_DEFAULT_LABEL, $SS_CENTER))
GUICtrlSetBkColor(-1, $aBkColor[Random(0, 2, 1)])
GUICtrlSetState(-1, $GUI_HIDE)
$hLbl = GUICtrlGetHandle(-1)
$iDummy = GUICtrlCreateDummy()
$aKey[0][1] = $iBtn
GUISetAccelerators($aKey)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iBtn
			$iPlay = Not $iPlay
			GUICtrlSetData($iBtn, $aData[0][$iPlay])
			GUIRegisterMsg($WM_SETCURSOR, $aData[1][$iPlay])
			If $iPlay Then
				AdlibRegister('_ShowHide', 1000)
			Else
				AdlibUnRegister('_ShowHide')
				$fShow = False
				GUICtrlSetState($iLbl, $aData[2][$fShow])
			EndIf
		Case $iDummy
			$iPointsScored += GUICtrlRead($iDummy)
			GUICtrlSetData($iPS_Lbl, $iPointsScored)
			$fShow = False
			GUICtrlSetState($iLbl, $aData[2][$fShow])
			GUICtrlSetBkColor($iLbl, $aBkColor[Random(0, 2, 1)])
			GUICtrlSetPos($iLbl, Random(0, 370, 1), Random(25, 370, 1))
			AdlibRegister('_ShowHide', 1000)
	EndSwitch
WEnd

Func _ShowHide()
	$fShow = Not $fShow
	GUICtrlSetState($iLbl, $aData[2][$fShow])
	If Not $fShow Then
		GUICtrlSetBkColor($iLbl, $aBkColor[Random(0, 2, 1)])
		GUICtrlSetPos($iLbl, Random(0, 370, 1), Random(25, 370, 1))
		GUICtrlSendToDummy($iDummy, -1)
	EndIf
EndFunc   ;==>_ShowHide

Func _WM_SETCURSOR($h_Wnd, $i_Msg, $i_wParam, $i_lParam)
	If $fShow Then
		Switch BitShift($i_lParam, 16)
			Case $WM_LBUTTONDOWN
				Switch $i_wParam
					Case $hBtn
					Case $hLbl
						GUICtrlSendToDummy($iDummy, 1)
					Case Else
						GUICtrlSendToDummy($iDummy, -1)
				EndSwitch
		EndSwitch
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_SETCURSOR
Надо бы еще добавить ники игроков, уровни сложности, звуки, картинки и т.д. и т.п., но лень...
 
Верх