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ı: 16006026Toplam Puan: 66760 / Yorum Sayısı: 412006026 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. |
| ||||||||

