Kun yritän ajaa tätä tulee virheet:
"Compiling...
main.cpp
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/bjbot.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe."
Ja tässä koko ohjelman koodi :)
#include <stdio.h> #include <windows.h> int ax=0,ay=0; HDC hDC; char swap[3]; char board[8][8]; typedef union clrs { DWORD clr1; unsigned char clr2[4]; } udata; bool XGap(int cx, int cy, char jewel); bool YGap(int cx, int cy, char jewel); bool XDou(int cx, int cy, char jewel); bool YDou(int cx, int cy, char jewel); void Move(void) { int xcrd = ax + 19 + swap[1]*38; int ycrd = ay + 19 + swap[2]*38; SetCursorPos(xcrd,ycrd); Sleep(100); mouse_event(2, 0, 0, 0, 0); Sleep(10); mouse_event(4, 0, 0, 0, 0); Sleep(100); if (swap[0] == 1) ycrd -= 38; if (swap[0] == 2) xcrd += 38; if (swap[0] == 3) ycrd += 38; if (swap[0] == 4) xcrd -= 38; SetCursorPos(xcrd,ycrd); Sleep(100); mouse_event(2, 0, 0, 0, 0); Sleep(10); mouse_event(4, 0, 0, 0, 0); Sleep(100); SetCursorPos(ax, ay - 50); Sleep(500); } char GetJewel(int boardx, int boardy) { udata ucolor; ucolor.clr1 = GetPixel(hDC, ax + 19 + boardx * 38, ay + 19 + boardy * 38); if (ucolor.clr2[2] > 0xFE) return 1; else if (ucolor.clr2[2] == ucolor.clr2[1] && ucolor.clr2[2] == ucolor.clr2[0]) return 2; else if (ucolor.clr2[0] > 0xEE) { if (ucolor.clr2[1] < 0xB0) return 3; else { if (ucolor.clr2[2] < 0x50) return 4; else return 5; } } else if (ucolor.clr2[1] > ucolor.clr2[2]) return 6; else return 7; return 0; } bool GetBoard(void) { char jewel2; int dy=0,dx=0; for (dy=0;dy<8;dy++) { for (dx=0;dx<8;dx++) { jewel2 = GetJewel(dx,dy); if (!jewel2) return false; board[dx][dy] = jewel2; } } return true; } void PrintBoard(void) { char jewel1; int px,py; printf("board:\n"); for (py=0;py<8;py++) { for (px=0;px<8;px++) { jewel1 = board[px][py]; printf(" %d ", jewel1); } printf("\n"); } } int main(int argc,char *argv[]) { printf("Finding Bejeweled board.\n"); system("pause"); int bx,by,bcount; bool noboard = true; DWORD bcolor; printf("Searching."); while (noboard) { printf("."); Sleep(500); hDC = GetDC(0); for (by=0;by<700&&noboard;by++) { for (bx=0;bx<1024;bx++) { bcolor = GetPixel(hDC, bx, by); if (bcolor == 0x293131) bcount++; else bcount = 0; if (bcount == 37 && GetPixel(hDC, bx+2, by) == 0x364c4c) { printf("\nJewels found at %d, %d\n", bx - bcount, by); ax = bx - bcount; ay = by; noboard = false; break; } } } } char bjewel; bool bmove, bwait=false; while (1) { if (GetAsyncKeyState(VK_F12) & 1) break; if (GetAsyncKeyState(VK_F11) & 1) { bwait = (!bwait); if (bwait) printf("waiting for F11...\n"); } Sleep(500); if (bwait) continue; hDC = GetDC(0); if (GetBoard() == 0) { printf("board fucked...\n"); Sleep(1000); continue; } //PrintBoard(); //break; bmove = false; for (by=0;by<8;by++) for (bx=0;bx<8;bx++) { bjewel = board[bx][by]; if (bmove) {} else if (bx<6 && bjewel == board[bx+2][by] && XGap(bx,by,bjewel)) { printf("xgap:"); bmove = true; } else if (by<6 && bjewel == board[bx][by+2] && YGap(bx,by,bjewel)) { printf("ygap:"); bmove = true; } else if (bx<7 && bjewel == board[bx+1][by] && XDou(bx,by,bjewel)) { printf("xdou:"); bmove = true; } else if (by<7 && bjewel == board[bx][by+1] && YDou(bx,by,bjewel)) { printf("ydou:"); bmove = true; } } if (bmove) { printf(" %d,%d with %d\n", swap[1],swap[2],swap[0]); Move(); } else printf("no move...\n"); } return 1; } bool XGap(int cx, int cy, char jewel) { if (cy != 0 && jewel == board[cx+1][cy-1]) { swap[1] = cx + 1; swap[2] = cy - 1; swap[0] = 3; return true; } if (cy != 7 && jewel == board[cx+1][cy+1]) { swap[1] = cx + 1; swap[2] = cy + 1; swap[0] = 1; return true; } return false; } bool YGap(int cx, int cy, char jewel) { if (cx != 0 && jewel == board[cx-1][cy+1]) { swap[1] = cx - 1; swap[2] = cy + 1; swap[0] = 2; return true; } if (cx != 7 && jewel == board[cx+1][cy+1]) { swap[1] = cx + 1; swap[2] = cy + 1; swap[0] = 4; return true; } return false; } bool XDou(int cx, int cy, char jewel) { if (cx > 1 && jewel == board[cx-2][cy]) { swap[1] = cx - 2; swap[2] = cy; swap[0] = 2; return true; } if (cx < 5 && jewel == board[cx+3][cy]) { swap[1] = cx + 3; swap[2] = cy; swap[0] = 4; return true; } if (cy != 0) { if (cx != 0 && jewel == board[cx-1][cy-1]) { swap[1] = cx - 1; swap[2] = cy - 1; swap[0] = 3; return true; } if (cx != 6 && jewel == board[cx+2][cy-1]) { swap[1] = cx + 2; swap[2] = cy - 1; swap[0] = 3; return true; } } if (cy != 7) { if (cx != 0 && jewel == board[cx-1][cy+1]) { swap[1] = cx - 1; swap[2] = cy + 1; swap[0] = 1; return true; } if (cx != 6 && jewel == board[cx+2][cy+1]) { swap[1] = cx + 2; swap[2] = cy + 1; swap[0] = 1; return true; } } return false; } bool YDou(int cx, int cy, char jewel) { if (cy > 1 && jewel == board[cx][cy-2]) { swap[1] = cx; swap[2] = cy - 2; swap[0] = 3; return true; } if (cy < 5 && jewel == board[cx][cy+3]) { swap[1] = cx; swap[2] = cy + 3; swap[0] = 1; return true; } if (cx != 0) { if (cy != 0 && jewel == board[cx-1][cy-1]) { swap[1] = cx - 1; swap[2] = cy - 1; swap[0] = 2; return true; } if (cy != 6 && jewel == board[cx-1][cy+2]) { swap[1] = cx - 1; swap[2] = cy + 2; swap[0] = 2; return true; } } if (cx != 7) { if (cy != 0 && jewel == board[cx+1][cy-1]) { swap[1] = cx + 1; swap[2] = cy - 1; swap[0] = 4; return true; } if (cy != 6 && jewel == board[cx+1][cy+2]) { swap[1] = cx + 1; swap[2] = cy + 2; swap[0] = 4; return true; } } return false; }
Projekti tulee kääntää Win32 Console Application-tyyppisenä. Win32-sovellukset alkavat (ainakin Microsoftin työkaluilla) WinMain()-funktiosta, jota linkittäjä tuossa yrittää hakea. En itse äkkiseltään löytänyt Visual Studiosta mitään asetusta, jolla tuon voisi vaihtaa, joten helpointa lienee luoda uusi projekti ja kopioida koodi siihen.
Joo kiitoksia sain käynnistymään. Muttta jostain syystä ei tapahdu mistään napista mitään -.-
GetAsyncKeyState()-funktion paluuarvon ylin bitti on päällä, jos nappi on pohjassa. Siis
if (GetAsyncKeyState() & 0x8000) { /* jotain */ }
Mutta jostain syystä mulle ei toimi edes tämä "printf("waiting for F11...\n");". Ei tule tekstiä.
Varmaankin muistat painaa sitä nappia riittävän pitkään? Koodissasihan on puolen sekunnin odotus joka kierroksella, eli tuohon tarkistukseen ja tulostukseen päästään vain puolen sekunnin välein (tai harvemmin, jos muu koodi vie merkittävästi aikaa). Kokeilepa näin:
while (1) { if (GetAsyncKeyState(VK_F11) & 0x8000) { printf("F11 painettu.\n"); Sleep(100); } }
Jos tämäkään ei toimi, tarkista vielä, pääsetkö edes kyseiseen silmukkaan asti.
Tämän jälkeen voit ruveta itse selvittelemään, mikä toimii ja mikä ei. Kannattaa muistaa, että pitkät nukkumiset ovat debuggauksen kannalta joskus vaarallisia, jos ei tarkkaan pidä mielessä, milloin ohjelma nukkuu ja miten se vaikuttaa muun koodin toimintaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.