C++ İle Araba Yarışı Örneği(Belirli Bir Yol Boyunca Klavye Kontrolunde)
20.03.2012-21:12 Tarihinde Eklendi.
www.seyfettinkahveci.com
Oy Sayısı: 16005710Toplam Puan: 63600 / Yorum Sayısı: 412005710 adet.
Öncelikle bu projemiz için elinizde msoftcon.h kütüphanesinin bulunması gerekir.
Msoftcon.h
/msoftcon.h //declarations for Lafore's console graphics functions //uses Window's console functions #ifndef _INC_WCONSOLE //don't let this file be included #define _INC_WCONSOLE //twice in the same source file #include <windows.h> //for Windows console functions #include <conio.h> //for kbhit(), getche() #include <math.h> //for sin, cos enum fstyle { SOLID_FILL, X_FILL, O_FILL, LIGHT_FILL, MEDIUM_FILL, DARK_FILL,SPACE_FILL}; enum color { cBLACK=0, cDARK_BLUE=1, cDARK_GREEN=2, cDARK_CYAN=3, cDARK_RED=4, cDARK_MAGENTA=5, cBROWN=6, cLIGHT_GRAY=7, cDARK_GRAY=8, cBLUE=9, cGREEN=10, cCYAN=11, cRED=12, cMAGENTA=13, cYELLOW=14, cWHITE=15 }; //-------------------------------------------------------------- void init_graphics(); void set_color(color fg, color bg = cBLACK); void set_cursor_pos(int x, int y); void clear_screen(); void wait(int milliseconds); void clear_line(); void draw_rectangle(int left, int top, int right, int bottom); void draw_circle(int x, int y, int rad); void draw_line(int x1, int y1, int x2, int y2); void draw_pyramid(int x1, int y1, int height); void set_fill_style(fstyle); #endif /* _INC_WCONSOLE */
Msoftcon.cpp
//msoftcon.cpp //provides routines to access Windows console functions //compiler needs to be able to find this file //in MCV++, /Tools/Options/Directories/Include/type path name #include <stdio.h> #include <stdlib.h> #include <string> #include <iostream> #include "msoftcon.h" HANDLE hConsole; //console handle char fill_char; //character used for fill //-------------------------------------------------------------- void init_graphics() { COORD console_size = {80, 25}; //open i/o channel to console screen hConsole = CreateFile("CONOUT$", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0L, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0L); //set to 80x25 screen size SetConsoleScreenBufferSize(hConsole, console_size); //set text to white on black SetConsoleTextAttribute( hConsole, (WORD)((0 << 4) | 15) ); fill_char = '\xDB'; //default fill is solid block clear_screen(); } //-------------------------------------------------------------- void set_color(color foreground, color background) { SetConsoleTextAttribute( hConsole, (WORD)((background << 4) | foreground) ); } //end setcolor() /* 0 Black 8 Dark gray 1 Dark blue 9 Blue 2 Dark green 10 Green 3 Dark cyan 11 Cyan 4 Dark red 12 Red 5 Dark magenta 13 Magenta 6 Brown 14 Yellow 7 Light gray 15 White */ //-------------------------------------------------------------- void set_cursor_pos(int x, int y) { COORD cursor_pos; //origin in upper left corner cursor_pos.X = x - 1; //Windows starts at (0, 0) cursor_pos.Y = y - 1; //we start at (1, 1) SetConsoleCursorPosition(hConsole, cursor_pos); } //-------------------------------------------------------------- void clear_screen() { set_cursor_pos(1, 25); for(int j=0; j<25; j++) putch('\n'); set_cursor_pos(1, 1); } //-------------------------------------------------------------- void wait(int milliseconds) { Sleep(milliseconds); } //-------------------------------------------------------------- void clear_line() //clear to end of line { //80 spaces //.....1234567890123456789012345678901234567890 //.....0........1.........2.........3.........4 std::cout<<" "; std::cout<<" "; } //-------------------------------------------------------------- void draw_rectangle(int left, int top, int right, int bottom) { char temp[80]; int width = right - left + 1; int j; for(j=0; j<width; j++) //string of squares temp[j] = fill_char; temp[j] = 0; //null for(int y=top; y<=bottom; y++) //stack of strings { set_cursor_pos(left, y); std::cout<<temp; } } //-------------------------------------------------------------- void draw_circle(int xC, int yC, int radius) { double theta, increment, xF, pi=3.14159; int x, xN, yN; increment = 0.8 / static_cast<double>(radius); for(theta=0; theta<=pi/2; theta+=increment) //quarter circle { xF = radius * cos(theta); xN = static_cast<int>(xF * 2 / 1); //pixels not square yN = static_cast<int>(radius * sin(theta) + 0.5); x = xC-xN; while(x <= xC+xN) //fill two horizontal lines { //one for each half circle set_cursor_pos(x, yC-yN); putch(fill_char); //top set_cursor_pos(x++, yC+yN); putch(fill_char); //bottom } } //end for } //-------------------------------------------------------------- void draw_line(int x1, int y1, int x2, int y2) { int w, z, t, w1, w2, z1, z2; double xDelta=x1-x2, yDelta=y1-y2, slope; bool isMoreHoriz; if( fabs(xDelta) > fabs(yDelta) ) //more horizontal { isMoreHoriz = true; slope = yDelta / xDelta; w1=x1; z1=y1; w2=x2, z2=y2; //w=x, z=y } else //more vertical { isMoreHoriz = false; slope = xDelta / yDelta; w1=y1; z1=x1; w2=y2, z2=x2; //w=y, z=x } if(w1 > w2) //if backwards w { t=w1; w1=w2; w2=t; // swap (w1,z1) t=z1; z1=z2; z2=t; // with (w2,z2) } for(w=w1; w<=w2; w++) { z = static_cast<int>(z1 + slope * (w-w1)); if( !(w==80 && z==25) ) //avoid scroll at 80,25 { if(isMoreHoriz) set_cursor_pos(w, z); else set_cursor_pos(z, w); putch(fill_char); } } } //-------------------------------------------------------------- void draw_pyramid(int x1, int y1, int height) { int x, y; for(y=y1; y<y1+height; y++) { int incr = y - y1; for(x=x1-incr; x<=x1+incr; x++) { set_cursor_pos(x, y); putch(fill_char); } } } //-------------------------------------------------------------- void set_fill_style(fstyle fs) { switch(fs) { case SOLID_FILL: fill_char = '\xDB'; break; case DARK_FILL: fill_char = '\xB0'; break; case MEDIUM_FILL: fill_char = '\xB1'; break; case LIGHT_FILL: fill_char = '\xB2'; break; case X_FILL: fill_char = 'X'; break; case O_FILL: fill_char = 'O'; break; case SPACE_FILL: fill_char = ' '; break; } } //--------------------------------------------------------------
Main.Cpp Dosyamız
#include <iostream> #include "araba.h" using namespace std; int main() { init_graphics(); araba *ferrari =new araba(10,10,10,10); int x=6,y=6; char tus; int Sonuc=0; do{ if(GetAsyncKeyState(VK_LEFT)){ if((x<=70&&(y<11)) ||(x<=70)&&(y>15)) x-=5; if(x<15&&y>15){Sonuc=1;break;} } if(GetAsyncKeyState(VK_RIGHT)){ if(x<=65)x+=5; } if(GetAsyncKeyState(VK_UP)){ if(y>=8&&y<20&&x>=65&&x<70)y-=5; } if(GetAsyncKeyState(VK_DOWN)){ if(y>5&&y<14&&x>65&&x<70)y+=5; } ferrari->ilerle(x,y); wait(200); }while(x<=70&&x>=6&&y<=25&&y>=6); clear_screen(); set_cursor_pos(25,12); if(Sonuc!=1){ cout<<"!!!!!!!!!!GAME OVER!!!!!!!!!!!!!"<<endl; } else{ cout<<"!!!!!!!!!!FÝNÝSH!!!!!!!!!!!!!"<<endl; } cin.get(); return 0; }
Araba.cpp Dosyamız
#include "araba.h" araba::araba(int x,int y, int hiz, float ag) { srand(time(NULL)); xx=x; yy=y; hizi=hiz; agirlik=ag; ciz(); yol(); } araba::~araba() { //dtor } void araba::ilerle(int x,int y) { clear_screen(); set_color(cRED,cWHITE); xx=x; yy=y; ciz(); yol(); } void araba::ciz() { set_fill_style(SOLID_FILL); draw_rectangle(xx,yy,xx+5,yy+4); } void araba::yol() { for(int i=10;i<=72;i++){ set_cursor_pos(i,5); cout<<"#"<<endl; if(i<=65){ set_cursor_pos(i,11); cout<<"#"<<endl; set_cursor_pos(i,15); cout<<"#"<<endl; } set_cursor_pos(i,21); cout<<"#"<<endl; } for(int i=5;i<=21;i++){ set_cursor_pos(72,i); cout<<"#"<<endl; if(i>=11 && i<=15) { set_cursor_pos(65,i); cout<<"#"<<endl;} } }
Araba.h Dosyamız
#define ARABA_H #include"msoftcon.h" #include<cstdlib> #include<time.h> #include <iostream> using namespace std; class araba { public: araba(int x,int y, int hiz, float ag); virtual ~araba(); void ilerle(int x,int y); void yol(); protected: private: int xx; int yy; int hizi; float agirlik; void ciz(); }; #endif // ARABA_H
Kod Hakkında Anlamadığınız Bir Kısım Olursa Yorum Ekleye Yazın En Kısa Sürede Cevaplamaya Çalışırım.
Seyfettin KAHVECİ
Balıkesir Üniversitesi
NEF-BOTE
Uzun süredir yorumlara cevap veremediğim için sistem yeni yorumlara kapatılmıştır. Anlayışınız için teşekkürler. |
|