Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
C
CPTR142_AI_Game
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Christian Rippe
CPTR142_AI_Game
Commits
fd7a23cb
Commit
fd7a23cb
authored
Mar 19, 2019
by
Jason Riggs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added AI
parent
21425bc4
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
210 additions
and
74 deletions
+210
-74
AIplayer.cpp
AIplayer.cpp
+56
-1
AIplayer.h
AIplayer.h
+11
-15
mainOthello.cpp
mainOthello.cpp
+143
-58
No files found.
AIplayer.cpp
View file @
fd7a23cb
#include <iostream>
#include <cstdlib>
#include "AIplayer.h"
using
namespace
std
;
\ No newline at end of file
#include "Board.h"
using
namespace
std
;
// Creates a random x and y for the easy computers move
void
AIplayer
::
move1
(
int
&
x
,
int
&
y
)
{
displayBoard
AImove
;
int
tempRow
,
tempCol
;
while
(
!
(
AImove
.
isValidAdjacent
(
tempCol
,
tempRow
,
'X'
)
&&
AImove
.
isValidFlip
(
tempCol
,
tempRow
,
'O'
)))
{
tempRow
=
rand
()
%
8
;
tempCol
=
rand
()
%
8
;
if
(
AImove
.
isValidAdjacent
(
tempCol
,
tempRow
,
'X'
)
&&
AImove
.
isValidFlip
(
tempCol
,
tempRow
,
'O'
))
{
x
=
tempCol
;
y
=
tempRow
;
}
}
}
// Picks the best possible move for the hard computer
void
AIplayer
::
move2
(
int
&
x
,
int
&
y
)
{
// declare class variable for board
displayBoard
AImove
;
// chip gain
int
chips
=
0
;
int
temp
=
0
;
// check each position for valid move
for
(
int
row
=
0
;
row
<
9
;
++
row
)
{
for
(
int
col
=
0
;
col
<
9
;
++
col
)
{
if
(
AImove
.
isValidAdjacent
(
row
,
col
,
'X'
)
&&
AImove
.
isValidFlip
(
row
,
col
,
'O'
))
{
AImove
.
upCheck
(
x
,
y
,
'O'
,
false
);
temp
=
AImove
.
getDifference
();
AImove
.
downCheck
(
x
,
y
,
'O'
,
false
);
temp
+=
AImove
.
getDifference
();
AImove
.
leftCheck
(
x
,
y
,
'O'
,
false
);
temp
+=
AImove
.
getDifference
();
AImove
.
rightCheck
(
x
,
y
,
'O'
,
false
);
temp
+=
AImove
.
getDifference
();
AImove
.
uprightCheck
(
x
,
y
,
'O'
,
false
);
temp
+=
AImove
.
getDifference
();
AImove
.
upleftCheck
(
x
,
y
,
'O'
,
false
);
temp
+=
AImove
.
getDifference
();
AImove
.
downrightCheck
(
x
,
y
,
'O'
,
false
);
temp
+=
AImove
.
getDifference
();
AImove
.
downleftCheck
(
x
,
y
,
'O'
,
false
);
temp
+=
AImove
.
getDifference
();
if
(
temp
>
chips
)
{
y
=
row
;
x
=
col
;
}
}
}
}
}
AIplayer.h
View file @
fd7a23cb
#ifndef AIPLAYER_H
#define AIPLAYER_H
#include <vector>
#include <string>
using
namespace
std
;
#include <cstdlib>
class
Board
;
class
AIplayer
{
public:
AIplayer
();
AIplayer
(
int
difficulty
)
{
this
->
difficulty
=
difficulty
;
}
void
move
();
private:
int
difficulty
;
// basic constructor to seed random number generator
AIplayer
()
{
srand
(
0
);
}
// constructor to seed random number generator with desired seed
AIplayer
(
int
seed
)
{
srand
(
seed
);
}
// easy move
void
move1
(
int
&
x
,
int
&
y
);
// hard move mutator
void
move2
(
int
&
x
,
int
&
y
);
};
#endif
\ No newline at end of file
mainOthello.cpp
View file @
fd7a23cb
#include <iostream> // For cin and cout
#include "Board.h"
#include "AIplayer.h"
using
namespace
std
;
...
...
@@ -8,6 +9,7 @@ int main() {
int
turn
=
1
;
int
difficulty
=
0
;
int
x
,
y
;
int
aiX
,
aiY
;
bool
winner
=
false
;
// Seeding random number genrator
...
...
@@ -16,6 +18,9 @@ int main() {
srand
(
seed
);
cout
<<
endl
;
// Creates AI
AIplayer
AIturn
(
seed
);
// Header
cout
<<
"Welcome to Othello!"
<<
endl
;
cout
<<
"the game of Reversi"
<<
endl
;
...
...
@@ -24,9 +29,8 @@ int main() {
// ask for difficulty level
cout
<<
"What difficulty would you like to play against:"
<<
endl
;
cout
<<
"1) Easy"
<<
endl
;
cout
<<
"2) Medium"
<<
endl
;
cout
<<
"3) Hard"
<<
endl
;
cout
<<
"4) 2 Player"
<<
endl
;
cout
<<
"2) Hard"
<<
endl
;
cout
<<
"3) 2 Player"
<<
endl
;
cout
<<
"Enter your choice: "
;
cin
>>
difficulty
;
...
...
@@ -38,79 +42,160 @@ int main() {
cout
<<
"Invalid selection."
<<
endl
;
cout
<<
"What difficulty would you like to play against:"
<<
endl
;
cout
<<
"1) Easy"
<<
endl
;
cout
<<
"2) Medium"
<<
endl
;
cout
<<
"3) Hard"
<<
endl
;
cout
<<
"4) 2 Player"
<<
endl
;
cout
<<
"2) Hard"
<<
endl
;
cout
<<
"3) 2 Player"
<<
endl
;
cout
<<
"Enter your choice: "
;
cin
>>
difficulty
;
}
// start the game
displayBoard
board
;
board
.
start
();
board
.
printBoard
();
cout
<<
"X goes first."
<<
endl
;
do
{
// Ask for players move
cout
<<
"Enter the (X,Y) coordinates of where you would like to place a chip: "
;
cin
>>
x
>>
y
;
//
switch
(
difficulty
)
{
// Player one's move
if
(
turn
==
1
)
{
// Check fo valid move
if
(
board
.
isValidAdjacent
(
x
-
1
,
y
-
1
,
'O'
)
&&
board
.
isValidFlip
(
x
-
1
,
y
-
1
,
'X'
)){
// Player moves
board
.
playerMove1
(
x
,
y
);
// Check for flips in every direction
board
.
upCheck
(
x
,
y
,
'X'
,
true
);
board
.
downCheck
(
x
,
y
,
'X'
,
true
);
board
.
leftCheck
(
x
,
y
,
'X'
,
true
);
board
.
rightCheck
(
x
,
y
,
'X'
,
true
);
board
.
uprightCheck
(
x
,
y
,
'X'
,
true
);
board
.
upleftCheck
(
x
,
y
,
'X'
,
true
);
board
.
downrightCheck
(
x
,
y
,
'X'
,
true
);
board
.
downleftCheck
(
x
,
y
,
'X'
,
true
);
case
1
:
{
// Change to player 2
turn
++
;
}
else
{
cout
<<
"Invalid Move!"
<<
endl
;
}
// Player two's Move
}
else
if
(
turn
==
2
)
{
// Check fo valid move
if
(
board
.
isValidAdjacent
(
x
-
1
,
y
-
1
,
'X'
)
&&
board
.
isValidFlip
(
x
-
1
,
y
-
1
,
'O'
)){
// Player moves
board
.
playerMove2
(
x
,
y
);
// Check for flips in every direction
board
.
upCheck
(
x
,
y
,
'O'
,
true
);
board
.
downCheck
(
x
,
y
,
'O'
,
true
);
board
.
leftCheck
(
x
,
y
,
'O'
,
true
);
board
.
rightCheck
(
x
,
y
,
'O'
,
true
);
}
break
;
case
2
:
{
do
{
// Player one's move
if
(
turn
==
1
)
{
// Ask for players move
cout
<<
"Enter the (X,Y) coordinates of where you would like to place a chip: "
;
cin
>>
x
>>
y
;
// Check fo valid move
if
(
board
.
isValidAdjacent
(
x
-
1
,
y
-
1
,
'O'
)
&&
board
.
isValidFlip
(
x
-
1
,
y
-
1
,
'X'
)){
// Player moves
board
.
playerMove1
(
x
,
y
);
// Check for flips in every direction
board
.
upCheck
(
x
,
y
,
'X'
,
true
);
board
.
downCheck
(
x
,
y
,
'X'
,
true
);
board
.
leftCheck
(
x
,
y
,
'X'
,
true
);
board
.
rightCheck
(
x
,
y
,
'X'
,
true
);
board
.
uprightCheck
(
x
,
y
,
'X'
,
true
);
board
.
upleftCheck
(
x
,
y
,
'X'
,
true
);
board
.
downrightCheck
(
x
,
y
,
'X'
,
true
);
board
.
downleftCheck
(
x
,
y
,
'X'
,
true
);
// Change to player 2
turn
++
;
}
else
{
cout
<<
"Invalid Move!"
<<
endl
;
}
// Player two's Move
}
else
if
(
turn
==
2
)
{
aiX
=
0
;
aiY
=
0
;
AIturn
.
move2
(
aiX
,
aiY
);
// Check fo valid move
if
(
board
.
isValidAdjacent
(
aiX
,
aiY
,
'X'
)
&&
board
.
isValidFlip
(
aiX
,
aiY
,
'O'
)){
// Player moves
board
.
playerMove2
(
aiX
,
aiY
);
// Check for flips in every direction
board
.
upCheck
(
aiX
,
aiY
,
'O'
,
true
);
board
.
downCheck
(
aiX
,
aiY
,
'O'
,
true
);
board
.
leftCheck
(
aiX
,
aiY
,
'O'
,
true
);
board
.
rightCheck
(
aiX
,
aiY
,
'O'
,
true
);
board
.
uprightCheck
(
aiX
,
aiY
,
'O'
,
true
);
board
.
upleftCheck
(
aiX
,
aiY
,
'O'
,
true
);
board
.
downrightCheck
(
aiX
,
aiY
,
'O'
,
true
);
board
.
downleftCheck
(
aiX
,
aiY
,
'O'
,
true
);
// Change to player 1
turn
--
;
}
else
{
// Prints invalid and then asks for another move
cout
<<
"Invalid Move!"
<<
endl
;
}
}
board
.
printBoard
();
board
.
uprightCheck
(
x
,
y
,
'O'
,
true
);
board
.
upleftCheck
(
x
,
y
,
'O'
,
true
);
board
.
downrightCheck
(
x
,
y
,
'O'
,
true
);
board
.
downleftCheck
(
x
,
y
,
'O'
,
true
);
// Change to player 1
turn
--
;
}
while
(
winner
==
false
);
}
break
;
case
3
:
{
do
{
// Ask for players move
cout
<<
"Enter the (X,Y) coordinates of where you would like to place a chip: "
;
cin
>>
x
>>
y
;
}
else
{
// Prints invalid and then asks for another move
cout
<<
"Invalid Move!"
<<
endl
;
// Player one's move
if
(
turn
==
1
)
{
// Check fo valid move
if
(
board
.
isValidAdjacent
(
x
-
1
,
y
-
1
,
'O'
)
&&
board
.
isValidFlip
(
x
-
1
,
y
-
1
,
'X'
)){
// Player moves
board
.
playerMove1
(
x
,
y
);
// Check for flips in every direction
board
.
upCheck
(
x
,
y
,
'X'
,
true
);
board
.
downCheck
(
x
,
y
,
'X'
,
true
);
board
.
leftCheck
(
x
,
y
,
'X'
,
true
);
board
.
rightCheck
(
x
,
y
,
'X'
,
true
);
board
.
uprightCheck
(
x
,
y
,
'X'
,
true
);
board
.
upleftCheck
(
x
,
y
,
'X'
,
true
);
board
.
downrightCheck
(
x
,
y
,
'X'
,
true
);
board
.
downleftCheck
(
x
,
y
,
'X'
,
true
);
// Change to player 2
turn
++
;
}
else
{
cout
<<
"Invalid Move!"
<<
endl
;
}
// Player two's Move
}
else
if
(
turn
==
2
)
{
// Check fo valid move
if
(
board
.
isValidAdjacent
(
x
-
1
,
y
-
1
,
'X'
)
&&
board
.
isValidFlip
(
x
-
1
,
y
-
1
,
'O'
)){
// Player moves
board
.
playerMove2
(
x
,
y
);
// Check for flips in every direction
board
.
upCheck
(
x
,
y
,
'O'
,
true
);
board
.
downCheck
(
x
,
y
,
'O'
,
true
);
board
.
leftCheck
(
x
,
y
,
'O'
,
true
);
board
.
rightCheck
(
x
,
y
,
'O'
,
true
);
board
.
uprightCheck
(
x
,
y
,
'O'
,
true
);
board
.
upleftCheck
(
x
,
y
,
'O'
,
true
);
board
.
downrightCheck
(
x
,
y
,
'O'
,
true
);
board
.
downleftCheck
(
x
,
y
,
'O'
,
true
);
// Change to player 1
turn
--
;
}
else
{
// Prints invalid and then asks for another move
cout
<<
"Invalid Move!"
<<
endl
;
}
}
board
.
printBoard
();
}
}
while
(
winner
==
false
);
}
board
.
printBoard
()
;
break
;
}
while
(
winner
==
false
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment