Miscellaneous Examples from Class

(new stuff added at the beginning; scroll down for older stuff.)

 

nov 19

notes on lookahead

 

 

 

to find a blocking move for a gamestate

 

            make sure you AVOID any move that lets the opponent win

                        in the gamestate

 

to tell if a move lets the opponent win in a gamestate

 

            apply the move to the gamestate

 

            find the best move for that gamestate //RECURSION

            //this will be a move for the OPPONENT

 

            apply that move to the gamestate

 

            if the player who last played has won, return 1;

           

            return 0;

 

//NOTE that this approach assumes that your move finder checks for

//winning moves and takes them!!

----------------------------------------------

 

 

 

 

to find best move for a gamestate:

 

            generate all moves

 

            use knockout plan to find legal move with highest score

                        in this gamestate

 

            return that move

 

to find score for a move in a gamestate

 

            apply the move to the gamestate //notes 7

 

            return the score for the resulting gamestate

 

to find score for a gamestate

 

            if the player who just played won, return 100

 

            if the game is a draw, return 0; //no legal moves

 

            find the best move for this gamestate //recursion!

 

            return -1 * the score for this move in this gamestate

            //because the score is for the opponent

 

 

another approach

struct evaluated_move

{

            struct move m;

            int value;

}

 

to find best move in a gamestate

 

            find best evaluated_move in the gamestate

 

            return the move part of the evaluated_move

 

to find best evaluated_move in a gamestate

 

            generate all moves

 

            if there are no legal moves

                        create a dummy move and set its value to 0 //draw

 

 

            if there is a winning move

                        set its value to 100 and return it

 

            use knockout plan to find move with highest value

                        in this situation

 

            create evaluated_move with this move and value

           

            return it

 

to find value of a move in a situation

 

            apply move to the situation

 

            find best evaluated_move in the new situation //recursion

 

            return -1 * the value of this move

            //because this is the opponent's move

 

           

 

oct 24

example code to troubleshoot

 

Sep 22

int x,z;

x=foo(3,&z);

//x should now be 27 [the cube of 3],z should be 9 [the square of 3]

//which, if any, of the following definitions of foo() will work?

int foo(int a,int* b) //1

{

    *b=a*a;

    printf("%d",a*a*a);

}

int foo(int a,int* b) //2

{

    return a*a*a;

    *b=a*a;

}

int foo(int a,int* b) //3

{

    *b=a*a;

    return int a*a*a;

}

int foo(int a,int* b) //4

{

    *b=&b;

    *b=a*a;

    return a*a*a;

}

 

 

int foo(int a,int* b, int *c) //5

{

    *b=a*a;

    return a*a*a;

}

int foo(int *3,int* b) //6

{

    *b=a*a;

    return a*a*a;

}

int foo(int a,int &b) //7

{

    *b=a*a;

    return a*a*a;

}

int foo(int a) //8

{

    return a*a;

    return a*a*a;

}

int foo(int *a,int* b) //9

{

    *b=a*a;

    return a*a*a;

}

 

 

Sep 7 program for examining addresses of array elements

#include <stdio.h>

int main()

{

      int i;

      int addr;

     

      char eggplant[4];

      eggplant[0]='a';

      eggplant[1]='b';

      eggplant[2]='c';

      eggplant[3]='d';

      printf("the value is %d\n",eggplant[3]);

      printf("the address of eggplant is %d\n",(int)&eggplant);

     

 

      printf("type an address: ");

      scanf("%d",&addr);

      for (i=0;i<25;i++)

                  printf("contents of %d: [%hX] as bits; [%d] as int; [%c] as character\n",addr+i,*(char *)(addr+i),*(char *)(addr+i),*(char *)(addr+i));

      eggplant[3]='x';

      //eggplant[6]='q';

      printf("and after the assignment\n");

      for (i=0;i<25;i++)

                  printf("contents of %d: [%hX] as bits; [%d] as int; [%c] as character\n",addr+i,*(char *)(addr+i),*(char *)(addr+i),*(char *)(addr+i));

     

      while(1)

      {

      printf("Type a subscript: ");

      scanf("%d",&i);

      printf("the address of eggplant[i] is %d\n",(int)&eggplant[i]);

 

      }

     

      return 0;

}

 

 

Sep 3 programs for looking at structs and arrays in memory

#include <stdio.h>

int main()

{

      int i;

      int addr;

     

      int eggplant[4];

      eggplant[0]=31;

      eggplant[1]=32;

      eggplant[2]=33;

      eggplant[3]=34;

      printf("the address of eggplant is %d\n",(int)&eggplant);

      while(1)

      {

            printf("type an address: ");

            scanf("%d",&addr);

            for (i=0;i<25;i++)

                  printf("contents of %d: [%hX] as bits; [%d] as int; [%c] as character\n",addr+i,*(char *)(addr+i),*(char *)(addr+i),*(char *)(addr+i));

      }

      return 0;

}

 

 

 

#include <stdio.h>

struct point

{

      int x;

      int y;

};

int main()

{

      int i;

      int addr;

     

      struct point p;

     

     

     

      printf("the address of point is %d\n",(int)&p);

     

      while(1)

      {

            printf("type an address: ");

            scanf("%d",&addr);

            for (i=0;i<25;i++)

                  printf("contents of %d: [%hX] as bits; [%d] as int; [%c] as character\n",addr+i,*(char *)(addr+i),*(char *)(addr+i),*(char *)(addr+i));

      }

      return 0;

}

 

 

Sep 1: the program for looking at bits in memory

#include <stdio.h>

int main()

{

      int i;

      int addr;

      char okra='w';

      int eggplant=257;

      char broccoli='W';

      printf("the address of eggplant is %d\n",(int)&eggplant);

      printf("the address of broccoli is %d\n",(int)&broccoli);

      while(1)

      {

            printf("type an address: ");

            scanf("%d",&addr);

            for (i=0;i<10;i++)

                  printf("contents of %d: [%hX] as bits; [%d] as int; [%c] as character\n",addr+i,*(char *)(addr+i),*(char *)(addr+i),*(char *)(addr+i));

      }

      return 0;

}