C++ İle Araba Yarışı Örneği(Belirli Bir Yol Boyunca Klavye Kontrolunde)


20.03.2012-21:12 Tarihinde Eklendi.
www.seyfettinkahveci.com Derecelendirme: 10 / 10 Oy Sayısı: 16002827Toplam Puan: 34770 / Yorum Sayısı: 412002827 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



Yazının tamamının kopyalanması yasaktır. En baştaki birkaç paragrafı kopyalayıp, yazıya link verebilirsiniz. Aksi durumda uyarılmaksızın yasal yollara gidilecektir.

Yorum Ekle

Ad Soyad:
Şehir:
Yorum:
Yorumlar
Bu makale için henüz hiç yorum yapılmamış.
Unutmayın Makalelere Yorum Yazmak Yeni Makalelere Teşviktir.