الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف ابرمج لعبة التك تاك تو Tic Tac Toe

بدأه Gigaman في 13 مارس 2008 · 4 رد · 3,241 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كيف ابرمج لعبة التك تاك تو Tic Tac Toe

لعبة سهلة و فكرتها صعبة للتحدي مع الكمبيوتر

نحن المبرمجين العرب نفكر فقط باللعبة من ناحية الاظهار احسن غرافيك و احسن صوت و تقليد العاب مثل دوووم و السيارات

و عدم الاهتمام بالفكرة و المضمون و احيانا للعبة تكون رائعة و سهلة

و عدم الاعتناء بفكرة الدكاء الصناعي

مع اننا افراد و نريد تحدي العاب قام بها فرق محترفة من المبرمجين مثل الرزدنت ايفل

فلنتعلم صنع العاب مثل التترس او الباك مان

و انا اريد ان كود لبرمجة اللعبة الاكس و الاو

post-1386-1223033542.jpg
#3

كلامك صحيح ... يجب أن نفصل الجرافكس عن المنطق ..

أما لعبة اكس أو .. فهي ستتعقد اذا فكرت فيها من جانب الجرافكس .. أقصد اذا بدأت بالبرمج مباشرة بالجرافكس .

لذلك دائما .. افصل المنطق عن الجرافكس وستجد أنك برمجة اللعبة في دقائق .. وهذا ما تعلمته بعد شهور طويلة من المعاناة ...

نأتي للعبة :: لتبرمجها ... قم بانشاء مصفوفة 3*3 مثلا ..

اللاعب الاول له الرقم صفر .. واللاعب الثاني الرقم واحد

int x[3][3];

if( (x[0][0] == x[0][1] == x[0][2] == 1 ) || (x[1][0] == x[1][1] ...... ) 
the winner is "first player "

وهكذا ... الفكرة .. أنك تنشئ مصفوفة .. وتحدث بياناتها كلما غير اللاعب الX أو O .. حيث ال X يقبله الرقم واحد .. والO الرقم صفر ..

ويفوز أحد اللاعبين .. اذا تساوت الصفوف او الاعمدة او الاقطار ..

ما رأيك لو تعمل لنا هذه اللعبة كنوع من التحدي لك :) .. لن تستفيد الا بالتطبيق .

موضوع جميل .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

السلام عليكم

اقتباس
كلامك صحيح ... يجب أن نفصل الجرافكس عن المنطق ..

أما لعبة اكس أو .. فهي ستتعقد اذا فكرت فيها من جانب الجرافكس .. أقصد اذا بدأت بالبرمج مباشرة بالجرافكس .

لذلك دائما .. افصل المنطق عن الجرافكس وستجد أنك برمجة اللعبة في دقائق .. وهذا ما تعلمته بعد شهور طويلة من المعاناة ...

100%

وهذا ماكنت أريد أن أوصله إلى الأعضاء من خلال سلسلة دروس الرياضيات والذكاء الاصطناعي التي لم أكتب منها إلا درسين

في الحقيقه تعلم برمجة الجرافيكس( opengl أو dx( لن يجعل منك مبرمج ألعاب بل سيجعلك مبرمج جرافيكس

لذلك إذا حاولة عمل لعبه صغيره ستواجهك أكبر مشكله وهي عدم معرفة من أين تبدأ

بالنسبه لي أستخدم الجرافيكس في موضعين

الأول : عند النهايه من كتابة البرنامج (فأربط المشروع بالجرافكس )وهذه لا تأخذ وقت كثير

الثاني: أستخدمه كمخرجات كمثال لو كان عندي شكلين مثلا: مثليثين وأريد معرفة إذا كانا يتقاطعان في أي نقطة بعد كتابت القوانين الرياضيه

لكشف التصادم أريد التحقق من صحتها عن طريق إختبارها هناك طريقتين الأوله إستخدام الكونسل والثانيه الكرافكس

في هذه الحاله أستخدمه لأنه أسهل من قراءة الإحداثيات

أخي Gigaman

هل لازلة مهتم بموضوع إنشاء الغرف مثل رزدنت إيفل

هل تريد أن أشرحها

وأيضا هل تريدوا أن أكمل السلسله أم ليس لها ذاعي أو ننتظر حتى إفتتاح المنتدى الجديد

#5

السلام عليكم

هذا كود للعبة التك تاك تو بلغة سي..وجدته على النت

 

#include <stdio.h>

#define X 4
#define O 1
#define SPACE 0
#define S SPACE

#define SUM(x,y,z) (board[x]+board[y]+board[z])

/* Global vars - I know, a bad idea :) */
int board[9];
int done=0;

#define PLAYER X
#define COMPUTER O

char bd_ch(int num) {
  if(num==X) return 'X';
  if(num==O) return 'O';
  if(num==S) return ' ';
  return '?';
}

show_board(){
  fprintf(stdout,"\n"
				 " %c | %c | %c\n-----------\n"
				 " %c | %c | %c\n-----------\n"
				 " %c | %c | %c\n\n",
				 bd_ch(board[6]),bd_ch(board[7]),bd_ch(board[8]),
				 bd_ch(board[3]),bd_ch(board[4]),bd_ch(board[5]),
				 bd_ch(board[0]),bd_ch(board[1]),bd_ch(board[2])
				 );
}

int check_line(int x,int y,int z,int sum,int *a,int *b,int *c) {
  if(board[x]+board[y]+board[z]!=sum) return 0;
  if(SUM(x,y,z)!=sum) return 0;
  *a=x; *b=y; *c=z;
  return 1;
}
int find_line(int sum,int *a,int *b,int *c) {
  if(check_line(0,1,2,sum,a,b,c)) return 1;
  if(check_line(3,4,5,sum,a,b,c)) return 1;
  if(check_line(6,7,8,sum,a,b,c)) return 1;
  if(check_line(0,3,6,sum,a,b,c)) return 1;
  if(check_line(1,4,7,sum,a,b,c)) return 1;
  if(check_line(2,5,8,sum,a,b,c)) return 1;
  if(check_line(0,4,8,sum,a,b,c)) return 1;
  if(check_line(2,4,6,sum,a,b,c)) return 1;
  return 0;
}

check_win() {
  int a,b,c;

  if(find_line(X+X+X,&a,&b,&c)) {
	fprintf(stdout,"\nX wins at %d,%d,%d!\n\n",a,b,c);
	done=1;
  }
  if(find_line(O+O+O,&a,&b,&c)) {
	fprintf(stdout,"\nO wins at %d,%d,%d!\n\n",a,b,c);
	done=1;
  }
  for(a=0,b=0;a<9;a++) if(board[a]==S) b=1;
  if(b==0) {
	fprintf(stdout,"\nTie game\n\n");
	done=1;
  }
}

player_turn() {
  char buf[81];
  int num=-1;

  fflush(stdin);
  fprintf(stdout,"Your move: ");
  fgets(buf,80,stdin);
  if(!strncmp("quit",buf,4)) return done=1;
  if(!sscanf(buf,"%d",&num) || num<1 || num>9) {
	 fprintf(stdout,"Not a valid entry: %s",buf);
	 show_board();
	 return player_turn();
  }
  if(board[num-1]!=S) {
	 fprintf(stdout,"The space %d is already a %c\n",num,bd_ch(board[num-1]));
	 show_board();
	 return player_turn();
  }
  board[num-1]=PLAYER;
}

#define C COMPUTER
#define P PLAYER
go(int where) {
  if(board[where]!=S) {
	fprintf(stderr,"COMPUTER HAS MADE FATAL MOVE\n");
	exit(-1);
  }
  board[where]=C;
  return;
}
computer_turn() {
  int a,b,c;
  int i;

/*
 * first check for win spots
 * if you find one, just take it.
 * It doesn't matter if there are others - you've just won
 */
/* fprintf(stdout,"					   Looking for wins\n"); */
  if(find_line(C+C+S,&a,&b,&c)) {
	if(board[a]==S) return go(a);
	if(board==S) return go(b);
	if(board[c]==S) return go(c);
  }
/*
 * then check for blocks
 * if you find one - you have to take it.
 * It doesn't matter if there are others, you'll just have to lose
 * since you don't have a win you can take right now (otherwise we
 * would have taken it above, and wouldn't be here
 */
/* fprintf(stdout,"					   Looking for blocks\n"); */
  if(find_line(P+P+S,&a,&b,&c)) {
	if(board[a]==S) return go(a);
	if(board==S) return go(b);
	if(board[c]==S) return go(c);
  }
/* that was easy, no choices involved.  Now we have
 * to *choose* a place to go.  :)
 * first lets see if we have any TAS situations we should take
 * check for two lines going through empty spots with C+S+S.
 * Fill the empty and we have two lines with C+C+S, and they can only block one
 */
/* fprintf(stdout,"					   Looking for TAS\n"); */
  for(i=0;i<9;i++) {
	int tot=0;

	if(board!=S) continue;

	/* check horizontal line - if C+S+S then increment total */
	if(SUM(i/3*3,i/3*3+1,i/3*3+2)==C+S+S) tot++;

	/* check vertical line */
	if(SUM(i,(i+3)%9,(i+6)%9)==C+S+S) tot++;

	/* possibly check diagonals */
	if(i==0 || i==4 || i==8) if(SUM(0,4,8)==C+S+S) tot++;
	if(i==2 || i==4 || i==6) if(SUM(2,4,6)==C+S+S) tot++;
/* if(tot>=2) fprintf(stdout,"FOUND TAS AT %d\n",i); */
	if(tot>=2) return go(i);  /* WE HAVE A TAS SITUATION! :) */
  }
  /* No TAS found, check automatic moves
   * (Actually, this should look for TWBS - oh well)
   */
  /* First move */
  if(board[6]==S) return go(6);
  /* If they take center we have to go across, or else we risk losing */
  if(board[4]==P) return go(2);
  /* Our normal TWBS is if they don't go to 0 or 3 we can go to 0
   * and TWBS because they will need to block at 3.
   * However, if they go to 0 or 3, we can do TWBS at 8.
   * (In reality, there are *lots* of TWBS at this point)
   */
  if(board[0]==P || board[3]==P) return go(8);
  if(board[0]==S) return go(0);

}

main() {
  int i;

  fprintf(stdout,"Tic Tac Toe\n\n");
  for(i=0;i<9;i++) board=S;
  fprintf(stdout,
		  " 7 | 8 | 9\n-----------\n 4 | 5 | 6\n-----------\n 1 | 2 | 3\n\n");

  while(!done) {
	computer_turn();
	show_board();
	check_win();
	if(!done) {
	  player_turn();
	  show_board();
	  check_win();
	}
  }
}

لدي عدد من الكودات لبرمجة اللعبة..بما في ذلك كود برمجته بنفسي

لكنها من غير جرافيكس.ربما بامكانك اضافة الجرافكس لها..و اعادة ارسالها

اذا اردت الكودات الاخرى..فانا جاهزة

ملاحظة: حاولت رفع الكود بملف..و لكنهم في كل مرة يقولون لي..فشل الرفع..لماذا؟؟

شكرا..و دمت

مواضيع مشابهة