fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. char b[9];
  6. void pr(){ for(int i=0;i<9;i++){ if(i%3==0) printf("\n"); printf(" %c ", b[i]?b[i]:' '); if(i%3!=2) printf("|"); } printf("\n"); }
  7. int win(){
  8. int W[8][3]={{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
  9. for(int i=0;i<8;i++) if(b[W[i][0]] && b[W[i][0]]==b[W[i][1]] && b[W[i][1]]==b[W[i][2]]) return b[W[i][0]];
  10. return 0;
  11. }
  12. int find_move(char p){
  13. for(int i=0;i<9;i++) if(!b[i]){ b[i]=p; if(win()==p){ b[i]=0; return i; } b[i]=0; }
  14. return -1;
  15. }
  16. int any_empty(){ for(int i=0;i<9;i++) if(!b[i]) return 1; return 0; }
  17. int take_from(int arr[], int n){ for(int i=0;i<n;i++) if(!b[arr[i]]) return arr[i]; return -1; }
  18.  
  19. int ai_move(int diff, char ai, char hu){
  20. if(diff==1){ // random
  21. int empties[9],c=0;
  22. for(int i=0;i<9;i++) if(!b[i]) empties[c++]=i;
  23. if(!c) return -1;
  24. return empties[rand()%c];
  25. }
  26. // smart: win
  27. int mv = find_move(ai);
  28. if(mv!=-1) return mv;
  29. // block
  30. mv = find_move(hu);
  31. if(mv!=-1) return mv;
  32. // center
  33. if(!b[4]) return 4;
  34. // corners
  35. int corners[4]={0,2,6,8}, t = take_from(corners,4); if(t!=-1) return t;
  36. // sides
  37. int sides[4]={1,3,5,7}; return take_from(sides,4);
  38. }
  39.  
  40. int main(){
  41. srand(time(0));
  42. for(int i=0;i<9;i++) b[i]=0;
  43. printf("Tic-Tac-Toe vs AI\n1) You first\n2) AI first\nChoose who starts (1/2): ");
  44. int who; if(scanf("%d",&who)!=1) return 0;
  45. printf("Difficulty: 1=easy(random) 2=smart\nChoose difficulty: ");
  46. int diff; if(scanf("%d",&diff)!=1) diff=2;
  47. char human = (who==2)?'O':'X', ai = (human=='X')?'O':'X';
  48. int turn = (who==1)?0:1; // 0 human,1 ai
  49. while(1){
  50. pr();
  51. if(win()){ printf("%c wins!\n", win()); break; }
  52. if(!any_empty()){ printf("Draw!\n"); break; }
  53. if(turn==0){
  54. int pos; printf("Your move (1-9): ");
  55. if(scanf("%d",&pos)!=1) break;
  56. pos--; if(pos<0||pos>8||b[pos]){ printf("Invalid\n"); continue; }
  57. b[pos]=human;
  58. } else {
  59. int m = ai_move(diff, ai, human);
  60. if(m==-1){ printf("No move\n"); break; }
  61. printf("AI places %c at %d\n", ai, m+1);
  62. b[m]=ai;
  63. }
  64. turn^=1;
  65. }
  66. pr();
  67. return 0;
  68. }
Success #stdin #stdout 0.01s 5316KB
stdin
/*  Berechnung des Hamming-Abstandes zwischen zwei 128-Bit Werten in 	*/
/*	einer Textdatei. 													*/
/*  Die Werte müssen auf einer separaten Zeile gespeichert sein			*/
/* 																		*/
/*	Erstellt: 17.5.2010													*/
/*  Autor: Thomas Scheffler												*/

#include <stdio.h>
#include <stdlib.h>

#define ARRAY_SIZE 32

unsigned Hamdist(unsigned x, unsigned y)
{
  unsigned dist = 0, val = x ^ y;
 
  // Count the number of set bits
  while(val)
  {
    ++dist; 
    val &= val - 1;
  }
 
  return dist;
}



int main (void)
{
	char hex;
	int i;
	int a[ARRAY_SIZE];
	int b[ARRAY_SIZE];
	int hamDist = 0;
	FILE* fp;
	
	//Arrays mit 0 initialisieren
	for (i = 0; i < ARRAY_SIZE; ++i)
	{
  		a[i] = 0;
  		b[i] = 0;
	}

	
	fp = fopen("hex.txt","r");
	if (fp == NULL) 
	{
		printf("Die Datei hex.txt wurde nicht gefunden!");
		exit(EXIT_FAILURE);
	}

	i=0;
	printf("1.Zeile einlesen.\n");

 	while((hex=fgetc(fp))!='\n' && hex != EOF)
    {
        a[i]=strtol(&hex,0,16);
		i++;
    }
	i=0;
	printf("2.Zeile einlesen.\n");

 	while((hex=fgetc(fp))!='\n' && hex != EOF)
    {
    	b[i]=strtol(&hex,0,16);
        i++;
    }
	fclose(fp);

	printf("Hamming-Abweichung pro Nibble:\n");
	for (i = 0; i < ARRAY_SIZE; ++i)
	{
		printf ("%i\t%i\t%i\n",a[i],b[i],Hamdist(a[i],b[i]));
		hamDist += Hamdist(a[i],b[i]);
	}
	printf ("\nHamming-Abweichung der Hash-Werte:%d\n",hamDist);
}

stdout
Tic-Tac-Toe vs AI
1) You first
2) AI first
Choose who starts (1/2):