PDA

مشاهده نسخه کامل : این سورس رو چجوری به بازی ox یک نفره تبدیل کنم



MmahdiB
01-06-09, 16:01
#include<stdio.h>
#include<conio.h>
void kadr();
void show();
void get();
void help();
int won_();
const i1=30,i2=i1+3,i3=i2+3, /* */ j1=10,j2=j1+2,j3=j2+2;
char xo[3][3],f;
void main()
{
int i,j=0,won=0;
clrscr();
for(;j<3;j++)
for(i=0;i<3;xo[i][j]=' ',i++);
kadr();
do{ gotoxy(26,5);
printf("please type x:");
f=getch();
if(f=='x')f='X';
if(f=='o')f='O';
}while( (f!='O')&&(f!='X'));
printf("%c",f);
do{
get();
show();
}while(!(won=won_()));
gotoxy(30,20);
switch(won){
case 1:printf("X is won !!! \n");
break;
case 2:printf("O is won !!! \n");
break;
case 3:printf("Eqaul \n");
break;
}
getch();
}// END
void kadr(){
int i,j;
for(j=j1+1;j<=j3;j+=2)
for(i=i1-1;i<=i3+1;gotoxy(i,j),printf("~"),i++);
for(i=i1+1;i<=i3;i+=4)
for(j=j1;j<=j3;gotoxy(i,j),printf("!"),j++);
}//end of kadr
void show(){
int i,j,x=0,y=0;
clrscr();
kadr();
for(j=j1;j<=j3;j+=2,y++)
for(i=i1,x=0;i<=i3;i+=3,x++)
{
gotoxy(i,j);
printf("%c",xo[x][y]);
}
}//end of show
int won_(){
char x[3];
int i,j;
//ofoghy
for(j=0;j<3;j++)
{
for(i=0;i<3;i++)
x[i]=xo[i][j];
if((x[0]==x[1])&&(x[2]==x[1])&&(x[1]!=' '))
if(x[1]=='X')return 1;
else return 2;
}//amody
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
x[j]=xo[i][j];
if((x[0]==x[1])&&(x[2]==x[1])&&(x[1]!=' '))
if(x[2]=='X')return 1;
else return 2;
} //movarab
for(j=0,i=0;j<3;j++,i++)
x[j]=xo[i][j];
if((x[0]==x[1])&&(x[2]==x[1])&&(x[1]!=' '))
if(x[2]=='X')return 1;
else return 2;
for(j=2,i=0;i<3;j--,i++)
x[i]=xo[i][j];
if((x[0]==x[1])&&(x[2]==x[1])&&(x[1]!=' '))
if(x[2]=='X')return 1;
else return 2;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(xo[i][j]==' ') return 0;
return 3;
}//end of won_
void get(){
char c='k';
while(c=='k'){
show();
gotoxy(2,7);
printf("your keys:");
gotoxy(8,3);
printf("Welcom to Mahdi Bayat Game");
gotoxy(10,9);
printf("\n 7!8!9 \n --!-!--\n 4!5!6\n --!-!--\n 1!2!3 ");
gotoxy(12,7);
printf(" player : %c",f);
if((c=getche())=='k')c='k';
switch(c)
{ case 'k':help();
break;
case '1':if(xo[0][2]==' ')
xo[0][2]=f;
else continue;
break;
case '2':if(xo[1][2]==' ')
xo[1][2]=f;
else continue;
break;
case '3':if(xo[2][2]==' ')
xo[2][2]=f;
else continue;
break;
case '4':if(xo[0][1]==' ')
xo[0][1]=f;
else continue;
break;
case '5':if(xo[1][1]==' ')
xo[1][1]=f;
else continue;
break;
case '6':if(xo[2][1]==' ')
xo[2][1]=f;
else continue;
break;
case '7':if(xo[0][0]==' ')
xo[0][0]=f;
else continue;
break;
case '8':if(xo[1][0]==' ')
xo[1][0]=f;
else continue;
break;
case '9':if(xo[2][0]==' ')
xo[2][0]=f;
else continue;
break;
}
if((f=='X')&&(c!='f'))f='O';
else if((f=='O')&&(c!='f'))f='X';
}
}
void help(){
int i,j,x=0;
clrscr();
kadr();
for(j=j1;j<=j3;j+=2)
for(i=i1;i<=i3;i+=3)
{
gotoxy(i,j);
printf("%d",++x);
}
getch();
}

MmahdiB
01-06-09, 16:03
برای اجرای این برنامه در ++ اول کد ها رو در یک New Text Document کپی کنید.:11():

MoBiN.R
02-06-09, 09:38
شرط اولین حلقه For رو به j<2 تغییر بدین احتمالا یک نفره میشه

deopen
28-07-09, 13:12
به نظر شما اگه یک نفره بشه دومین O را کی میزنه ؟؟؟ باید یک CpuPlayer براش درست کرد , درستش میکنم فردا میذارمش.

deopen
29-07-09, 22:36
بازی رو اصلاح کردم, یک نفرش کردم, بازیکن کامپیوتر اضافه کردم, سعی کردم تا جایی که بشه کسی نتونه بازیکن منو شکست بده , فکر کردین کم الکیه بازیکنم؟؟ می دونم کد ممکنه باگ داشته باشه , فعلا درست حسابی تستش نکردم.

فردا در مورد تغییرات و مشکلات کد اصلی تا جایی که لازم بود برای تغییرات بدونم توضیح میدم.



#include<stdio.h>

#include<conio.h>

#include <windows.h>

#include<cstdlib>
using std::rand;
using std::srand;

#include<ctime>
using std::time;

void clrscr()
{
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord = {0, 0};
DWORD count;

CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hStdOut, &csbi);

FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

SetConsoleCursorPosition(hStdOut, coord);
}


void gotoxy ( short x, short y )
{
COORD coord = {x, y};
SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord );
}

void kadr();
void randomO();
int fPP(int);
void show();
void get();
void help();
int rtn(char);
int won_(int);
const int i1=30,i2=i1+3,i3=i2+3,j1=10,j2=j1+2,j3=j2+2;
char xo[3][3],f;
void main()
{
int i,j=0,won=0;
clrscr();
for(;j<3;j++)
for(i=0;i<3;xo[i][j]=' ',i++);
kadr();
do{ gotoxy(26,5);
printf("please type x:");
f='X';
}while( (f!='O')&&(f!='X'));
printf("%c",f);
int PP=1;
for (int i=0;i<10,!(won=won_(PP));i++){

if(PP==1)
get();
if (i==0) {
if(xo[2][2]==' ')
xo[2][2]='O';
else
xo[1][1]='O';
PP=fPP(PP);
}

PP=fPP(PP);
show();

}

gotoxy(30,20);
switch(won){
case 1:printf("X is won !!! \n");
break;
case 2:printf("O is won !!! \n");
break;
case 3:printf("Eqaul \n");
break;
}
getch();
}// END
void kadr(){
int i,j;
for(j=j1+1;j<=j3;j+=2)
for(i=i1-1;i<=i3+1;gotoxy(i,j),printf("~"),i++);
for(i=i1+1;i<=i3;i+=4)
for(j=j1;j<=j3;gotoxy(i,j),printf("!"),j++);
}//end of kadr
void show(){
int i,j,x=0,y=0;
clrscr();
kadr();
for(j=j1;j<=j3;j+=2,y++)
for(i=i1,x=0;i<=i3;i+=3,x++)
{
gotoxy(i,j);
printf("%c",xo[x][y]);
}
}//end of show
int won_(int cpuID){
bool type=false;
char x[3];
up :
show();
int cnt=0;
for(int i=0;i<3;i++) {
cnt=0;

if(xo[0][i]==xo[1][i])
if(xo[0][i]!=' ')
cnt++;

if(xo[1][i]==xo[2][i])
if(xo[1][i]!=' ')
cnt++;

if(xo[0][i]==xo[2][i])
if(xo[0][i]!=' ')
cnt++;

if (cnt==3 )
return rtn(xo[0][i]);

if ((cnt==1) && (cpuID==2)) {
for (int cpuW=0;cpuW<3;cpuW++)
if (xo[cpuW][i]==' ') {
xo[cpuW][i]='O';
cpuID=1;
type=true;
goto up;
}
}

cnt=0;

if(xo[i][0]==xo[i][1])
if(xo[i][0]!=' ')
cnt++;

if(xo[i][1]==xo[i][2])
if(xo[i][1]!=' ')
cnt++;

if(xo[i][0]==xo[i][2])
if(xo[i][0]!=' ')
cnt++;

if (cnt==3 )
return rtn(xo[i][0]);

if ((cnt==1) && (cpuID==2)) {
for (int cpuW=0;cpuW<3;cpuW++)
if (xo[i][cpuW]==' ') {
xo[i][cpuW]='O';
cpuID=1;
type=true;
goto up;
}
}

x[i]=xo[i][i];
cnt=0;

}
cnt=0;

if(x[0]==x[1])
if(x[1]!=' ')
cnt++;

if(x[1]==x[2])
if(x[1]!=' ')
cnt++;

if(x[0]==x[2])
if(x[0]!=' ')
cnt++;

if (cnt==3 )
return rtn(x[0]);

if ((cnt==1) && (cpuID==2)) {
for (int cpuW=0;cpuW<3;cpuW++)
if (xo[cpuW][cpuW]==' ') {
xo[cpuW][cpuW]='O';
cpuID=1;
type=true;
goto up;
}
}
for(int j=2,i=0;i<3;j--,i++)
x[i]=xo[i][j];

if(x[0]==x[1])
if(x[1]!=' ')
cnt++;

if(x[1]==x[2])
if(x[1]!=' ')
cnt++;

if(x[0]==x[2])
if(x[0]!=' ')
cnt++;

if (cnt==3 )
return rtn(x[0]);

if ((cnt==1) && (cpuID==2)) {
for(int j=2,i=0;i<3;j--,i++)
if (xo[i][j]==' ') {
xo[i][j]='O';
cpuID=1;
type=true;
goto up;
}
}
if ((cpuID==2) && !(type))
randomO();


for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(xo[i][j]==' ') return 0;
return 3;
}//end of won_
void get(){
char c='k';
while(c=='k'){
show();
gotoxy(2,7);
printf("your keys:");
gotoxy(8,3);
printf("Welcom to Mahdi Bayat Game");
gotoxy(10,9);
printf("\n 7!8!9 \n --!-!--\n 4!5!6\n --!-!--\n 1!2!3 ");
gotoxy(12,7);
printf(" player : %c",f);
if((c=getche())=='k')c='k';
switch(c)
{ case 'k':help();
break;
case '1':if(xo[0][2]==' ')
xo[0][2]=f;
else continue;
break;
case '2':if(xo[1][2]==' ')
xo[1][2]=f;
else continue;
break;
case '3':if(xo[2][2]==' ')
xo[2][2]=f;
else continue;
break;
case '4':if(xo[0][1]==' ')
xo[0][1]=f;
else continue;
break;
case '5':if(xo[1][1]==' ')
xo[1][1]=f;
else continue;
break;
case '6':if(xo[2][1]==' ')
xo[2][1]=f;
else continue;
break;
case '7':if(xo[0][0]==' ')
xo[0][0]=f;
else continue;
break;
case '8':if(xo[1][0]==' ')
xo[1][0]=f;
else continue;
break;
case '9':if(xo[2][0]==' ')
xo[2][0]=f;
else continue;
break;
}
}
}
void help(){
int i,j,x=0;

clrscr();
kadr();
for(j=j1;j<=j3;j+=2)
for(i=i1;i<=i3;i+=3)
{
gotoxy(i,j);
printf("%d",++x);
}
getch();
}
int rtn(char x) {
if(x=='X')return 1;
else return 2;
}
int fPP(int PP) {
if (PP==1)
return 2;
else
return 1;
}

void randomO() {
int x,y;
str:
srand(time(0));
x=rand()%4;
y=rand()%4;
if(xo[x][y]==' ')
xo[x][y]='O';
else
goto str;

}

deopen
30-07-09, 09:50
1-کد اصلا بهینه نیست!!!
2-بهتره سبکتون را از C به سبک CPP ارتقا بدید و توابعی مانند clrscr و gotoxy بصورت استاندارد تعریف نشده بودند.
3-در چک کردن آرایه به صورت عمودی و افقی و یکی از حالتهای مورب میتونستید از یک حلقه استفاده کنید مانند کد اصلاح شده.
4-برای رفع کم و کاستی های استاندارد بودن از کامپایلر VCPP 2008 استفاده کنید.

من همه کد را چک نکردم و تاجایی که لازم بود برای تغییرات بدونم چکش کردم و بنظرم کد خیلی میتونست بهینه تر باشه.
یکی از مواردی که نظرم را جلب کرد روش get گرفتن بود که بسیار عالی طراحی شده بود و مخصوصا روش تهیه ی کادر عالی بود.

deopen
30-07-09, 10:03
تغییراتی که در کد دادم سبب بهتر شدن کد نشده اما به هدفی که دوستمون میخواست بهش برسه نزدیکتر شده.

تغییر اصلی که من دادم در تابع won_ بود در این تابع من برای چک کردن خطهای عمودی و افقی و مورب از 3 شرط استفاده کردم که می تونستم از 1 شرط با یک && استفاده کنم اما این کارم بدلیل cpuID بود , همونطور که می بینید به Function _won یک آرگومان به اسم cpuID اضافه کردم و با این کار این تابع را به یک تابع 2 منظوره :
1-برای چک کردن خط ها
2-برای cpuID
تبدیل کردم .

از 3 شرط استفاده کردم اگر تمام شرطها درست باشد خوب یک نفر برنده است اما اگر یکی از شرطها درست باشد و cpuID برابر 2 باشد در آنصورت جای خالی که تشکیل یک خط را میدهد پیدا میشه و با یک O جایگزین میشود , در صورتی که شرطها درست در نیاند آنوقت تابع randomO یکO رندوم در جدول قرار میدهد.

deopen
02-08-09, 12:45
باگها تا حدودی بر طرف شد.


#include<stdio.h>

#include<conio.h>

#include <windows.h>

#include<cstdlib>
using std::rand;
using std::srand;

#include<ctime>
using std::time;

void clrscr()
{
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord = {0, 0};
DWORD count;

CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hStdOut, &csbi);

FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

SetConsoleCursorPosition(hStdOut, coord);
}


void gotoxy ( short x, short y )
{
COORD coord = {x, y};
SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord );
}

void kadr();
void randomO();
int fPP(int);
void show();
void get();
void help();
int rtn(char);
int won_(int);
const int i1=30,i2=i1+3,i3=i2+3,j1=10,j2=j1+2,j3=j2+2;
char xo[3][3],f;
void main()
{
int won=0;
clrscr();

for(int j=0;j<3;j++)
for(int i=0;i<3;xo[i][j]=' ',i++);
kadr();

f='X';

printf("%c",f);
int PP=1;
while(!(won=won_(PP))){

if(PP==1)
get();

PP=fPP(PP);
show();

}

gotoxy(30,20);
switch(won){
case 1:printf("X is won !!! \n");
break;
case 2:printf("O is won !!! \n");
break;
case 3:printf("Eqaul \n");
break;
}
getch();
}// END
void kadr(){
int i,j;
for(j=j1+1;j<=j3;j+=2)
for(i=i1-1;i<=i3+1;gotoxy(i,j),printf("~"),i++);
for(i=i1+1;i<=i3;i+=4)
for(j=j1;j<=j3;gotoxy(i,j),printf("!"),j++);
}//end of kadr
void show(){

clrscr();
kadr();
for(int j=j1,y=0;j<=j3;j+=2,y++)
for(int i=i1,x=0;i<=i3;i+=3,x++)
{
gotoxy(i,j);
printf("%c",xo[x][y]);
}
}//end of show
int won_(int cpuID){

bool type=false;
char x[3];
up :
show();
int cnt=0;
for(int i=0;i<3;i++) {
cnt=0;

if(xo[0][i]==xo[1][i])
if(xo[0][i]!=' ')
cnt++;

if(xo[1][i]==xo[2][i])
if(xo[1][i]!=' ')
cnt++;

if(xo[0][i]==xo[2][i])
if(xo[0][i]!=' ')
cnt++;

if (cnt==3 )
return rtn(xo[0][i]);

if ((cnt==1) && (cpuID==2)) {
for (int cpuW=0;cpuW<3;cpuW++)
if (xo[cpuW][i]==' ') {
xo[cpuW][i]='O';
cpuID=1;
type=true;
goto up;
}
}

cnt=0;

if(xo[i][0]==xo[i][1])
if(xo[i][0]!=' ')
cnt++;

if(xo[i][1]==xo[i][2])
if(xo[i][1]!=' ')
cnt++;

if(xo[i][0]==xo[i][2])
if(xo[i][0]!=' ')
cnt++;

if (cnt==3 )
return rtn(xo[i][0]);

if ((cnt==1) && (cpuID==2)) {
for (int cpuW=0;cpuW<3;cpuW++)
if (xo[i][cpuW]==' ') {
xo[i][cpuW]='O';
cpuID=1;
type=true;
goto up;
}
}

x[i]=xo[i][i];
cnt=0;

}
cnt=0;

if(x[0]==x[1])
if(x[1]!=' ')
cnt++;

if(x[1]==x[2])
if(x[1]!=' ')
cnt++;

if(x[0]==x[2])
if(x[0]!=' ')
cnt++;

if (cnt==3 )
return rtn(x[0]);

if ((cnt==1) && (cpuID==2)) {
for (int cpuW=0;cpuW<3;cpuW++)
if (xo[cpuW][cpuW]==' ') {
xo[cpuW][cpuW]='O';
cpuID=1;
type=true;
goto up;
}
}
cnt=0;
for(int j=2,i=0;i<3;j--,i++)
x[i]=xo[i][j];

if(x[0]==x[1])
if(x[1]!=' ')
cnt++;

if(x[1]==x[2])
if(x[1]!=' ')
cnt++;

if(x[0]==x[2])
if(x[0]!=' ')
cnt++;

if (cnt==3 )
return rtn(x[0]);

if ((cnt==1) && (cpuID==2)) {
for(int j=2,i=0;i<3;j--,i++)
if (xo[i][j]==' ') {
xo[i][j]='O';
cpuID=1;
type=true;
goto up;
}
}
if ((cpuID==2) && !(type))
randomO();


for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(xo[i][j]==' ') return 0;
return 3;
}//end of won_
void get(){
getUp:
char c='k';
while(c=='k'){
show();
gotoxy(2,7);
printf("your keys:");
gotoxy(8,3);
printf("Welcom to Game");
gotoxy(10,9);
printf("\n 7!8!9 \n --!-!--\n 4!5!6\n --!-!--\n 1!2!3 ");
gotoxy(12,7);
printf(" player : %c",f);
if((c=getche())=='k')c='k';
switch(c)
{ case 'k':help();
break;
case '1':if(xo[0][2]==' ')
xo[0][2]=f;
else goto getUp;
break;
case '2':if(xo[1][2]==' ')
xo[1][2]=f;
else goto getUp;
break;
case '3':if(xo[2][2]==' ')
xo[2][2]=f;
else goto getUp;
break;
case '4':if(xo[0][1]==' ')
xo[0][1]=f;
else goto getUp;
break;
case '5':if(xo[1][1]==' ')
xo[1][1]=f;
else goto getUp;
break;
case '6':if(xo[2][1]==' ')
xo[2][1]=f;
else goto getUp;
break;
case '7':if(xo[0][0]==' ')
xo[0][0]=f;
else goto getUp;
break;
case '8':if(xo[1][0]==' ')
xo[1][0]=f;
else goto getUp;
break;
case '9':if(xo[2][0]==' ')
xo[2][0]=f;
else goto getUp;
break;
}
}
}
void help(){


clrscr();
kadr();
for(int j=j1,x=0;j<=j3;j+=2)
for(int i=i1;i<=i3;i+=3)
{
gotoxy(i,j);
printf("%d",++x);
}
getch();
}
int rtn(char x) {
if(x=='X')return 1;
else return 2;
}
int fPP(int PP) {
if (PP==1)
return 2;
else
return 1;
}

void randomO() {
int x,y;
str:
srand(time(0)-(1+rand()%100));
x=rand()%4;
y=rand()%4;
if(xo[x][y]==' ')
xo[x][y]='O';
else
goto str;
}