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ı: 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



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.

Uzun süredir yorumlara cevap veremediğim için sistem yeni yorumlara kapatılmıştır. Anlayışınız için teşekkürler.
Yorumlar
Bu makale için henüz hiç yorum yapılmamış.