Παιχνιδι χρησιμοποιωντας τεχνητη νοημοσυνη στην C

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
tasosatha
Δημοσιεύσεις: 37
Εγγραφή: 27 Δεκ 2010 17:16

Παιχνιδι χρησιμοποιωντας τεχνητη νοημοσυνη στην C

Δημοσίευση από tasosatha » 25 Μάιος 2015 19:27

Προσπαθω να φτιαξω ενα παιχνιδι στην c. Στο παιχνιδι αυτο εχουμε Μ(define) κυβους και μπορουμε να παρουμε 1 ή Κ(define) κυβους. Αρχικα παιζει ο υπολογιστης, ο οποιος πρεπει να κανει την βελτιστη κινηση(χρησιμοποιει τον αλγοριθμο minimax). Στη συνεχεια παιζει ο παιχτης. Νικητης του παιχνιδιου ειναι αυτος ο οποιος θα παρει τον τελευταιο κυβο.
Προσπαθησα να γραψω αυτο το προγραμμα αλλα σε καποιο σημειο εχει ενα προβλημα το οποιο δεν μπορω να διορθωσω. Οταν το τρεχω παιζει κανονικα ο υπολογιστης. Απο κει και περα αν εγω επιλεξω να παρει 1 κυβο ο ανθρωπος τοτε ο υπολογιστης παιρνει 1 κυβο στην επομενη κινηση. Αν επιλεξω να παρω Κ κυβους με πεταει το προγραμμα. Μπορει καποιος να βοηθησει? Εχω φαει παρα πολλες ωρες και δεν καταλαβαινω το λαθος.

Κώδικας: Επιλογή όλων

#define M 13
#define K 3


char player[3] = "MAX";


struct Node{
	int cubesRemaining;
	struct Node *left;
	struct Node *right;
};


int minimum(int a, int b){
	if &#40;a < b&#41;&#123;
		return a;
	&#125;
	else&#123;
		return b;
	&#125;
&#125;


int maximum&#40;int a, int b&#41;&#123;
	if &#40;a > b&#41;&#123;
		return a;
	&#125;
	else&#123;
		return b;
	&#125;
&#125;


char switchPlayer&#40;&#41;&#123;
	if &#40;strcmp&#40;player, "MAX"&#41; == 0&#41;&#123;
		strcpy&#40;player, "MIN"&#41;;
	&#125;
	else&#123;
		strcpy&#40;player, "MAX"&#41;;
	&#125;
&#125;


struct Node *buildGameTree&#40;int ncubes&#41;&#123;
	struct Node *cube = calloc&#40;1, sizeof&#40;struct Node&#41;&#41;;
	cube->cubesRemaining = ncubes;

	if &#40;cube->cubesRemaining >= 1&#41;&#123;
		cube->left = buildGameTree&#40;ncubes - 1&#41;;
		switchPlayer&#40;&#41;;
	&#125;
	if &#40;cube->cubesRemaining >= M&#41;&#123;
		cube->right = buildGameTree&#40;ncubes - K&#41;;
		switchPlayer&#40;&#41;;
	&#125;

	return &#40;cube&#41;;
&#125;


int computeMinimax&#40;struct Node *n&#41;&#123;
	int value;

	if &#40;n->cubesRemaining == 0&#41;&#123;
		if &#40;strcmp&#40;player, "MIN"&#41; == 0&#41;&#123;
			return 1;
		&#125;
		else&#123;
			return -1;
		&#125;
	&#125;
	else&#123;
		if &#40;strcmp&#40;player, "MIN"&#41; == 0&#41;&#123;
			value = minimum&#40;-1, computeMinimax&#40;n->left&#41;&#41;;
			if &#40;n->right != NULL&#41;&#123;
				value = minimum&#40;value, computeMinimax&#40;n->right&#41;&#41;;
			&#125;
		&#125;
		else&#123;
			value = maximum&#40;1, computeMinimax&#40;n->left&#41;&#41;;
			if &#40;n->right != NULL&#41;&#123;
				value = maximum&#40;value, computeMinimax&#40;n->right&#41;&#41;;
			&#125;
		&#125;
	&#125;

	return value;

&#125;


main&#40;&#41;&#123;
	struct Node *root = buildGameTree&#40;M&#41;;
	int r;

	printf&#40;"WELCOME TO THE GAME\n"&#41;;
	srand&#40;time&#40;NULL&#41;&#41;;

	while &#40;true&#41;&#123;
		int takenCubes = 0;
		int v1,v2;

		v1 = computeMinimax&#40;root->left&#41;;
		if &#40;root->right != NULL&#41;&#123;
			v2 = computeMinimax&#40;root->right&#41;;
		&#125;
		else&#123;
			v2 = 2;
		&#125;

		if &#40;v1 < v2&#41;&#123;
			takenCubes = 1;
		&#125;
		else if&#40;v2 < v1&#41;&#123;
			takenCubes = K;
		&#125;
		else&#123;
			r = &#40;&#40;double&#41;rand&#40;&#41; / &#40;RAND_MAX&#41;&#41; + 1;
			if &#40;r == 0&#41;&#123;
				takenCubes = 1;
			&#125;
			else&#123;
				takenCubes = K;
			&#125;
		&#125;


		if &#40;takenCubes == 1&#41;&#123;
			root = root->left;
		&#125;
		if&#40;takenCubes == K&#41;&#123;
			root = root->right;
		&#125;

		printf&#40;"MAX player&#40;PC&#41; takes %d cubes, remaining %d cubes\n", takenCubes, root->cubesRemaining&#41;;
		if &#40;root->cubesRemaining == 0&#41;&#123;
			printf&#40;"MAX player&#40;PC&#41; wins the game!"&#41;;
			break;
		&#125;

 
		do&#123;
			printf&#40;"How many cubes do you want? "&#41;;

			scanf&#40;"%d", &takenCubes&#41;;
			if &#40;takenCubes == 1 || takenCubes == K && root->cubesRemaining - takenCubes >= 0&#41;&#123;
				break;
			&#125;
			printf&#40;"That's an illegal move. Choose 1 or %d matches.\n", K&#41;;

		&#125; while &#40;true&#41;;

		if &#40;takenCubes == 1&#41;&#123;							//den mpainei edw
			root = root->left;
		&#125;
		else&#123;
			root = root->right;
		&#125;


		printf&#40;"MIN player&#40;human&#41; takes %d cubes, leaving %d\n", takenCubes, root->cubesRemaining&#41;;

		if &#40;root->cubesRemaining == 0&#41;&#123;
			printf&#40;"MIN player&#40;human&#41; wins the game!"&#41;;
			break;
		&#125;
	&#125;
&#125;

sibas
Honorary Member
Δημοσιεύσεις: 1851
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

Παιχνιδι χρησιμοποιωντας τεχνητη νοημοσυνη στην C

Δημοσίευση από sibas » 27 Μάιος 2015 11:03

λαθος μου σορρυ

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης