“三子棋”小游戏:由电脑和用户来完成游戏操作,若哪一方首先实现一行列,一竖列,对角线均为自己的棋子则获胜。
一:产生游戏界面,判断是否进入游戏的条件;
二:电脑要能够产生正确的随机数,表示棋子的位置;
三:无论哪一方下完棋要判断下棋结果的输赢;
四:用户可以从键盘输入左边,表示棋子的位置
五:要能够在电脑上显示出棋盘以及下棋的过程;
1:显示一个是否选择玩游戏的界面,选择1:玩游戏,选择0:退出。该条件是是否执行下面游戏代码的条件。
void ShowUI(){
printf("***********************\n");
printf("**** 1.play ******\n");
printf("**** 0.exit ******\n");
printf("***********************\n");
}
2:电脑开始下棋:要对随机生成的坐标进行判别,当坐标超出棋盘大小或当前坐标已有棋子均为不合格坐标。
void ComputerMove(char board[][COL], int row, int col){
while (1){
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = 'o';
break;
}
}
}
3:判断电脑下棋的结果:每一行列,一竖列,对角线是否为同一元素且不为空。
char Judge(char board[][COL], int row, int col){
int i = 0;
int j = 0;
for (i = 0; i < row; i++){
if (board[0][i] == board[1][i] && board[1][i] == board[2][i]&&\
board[0][i] != ' '){
return board[0][i];
}
}
for (i = 0; i < col; i++){
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && \
board[1][0] != ' '){
return board[i][0];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && \
board[0][0] != ' '){
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && \
board[0][2] != ' '){
return board[1][1];
}
for (i = 0; i < row; i++){
for (j = 0; j < col; j++){
if (board[i][j] == ' ')
return 'N';
}
}
return 'E';
}
4:由用户输入棋子的坐标,开始下棋:对用户输入坐标进行判别是否合格
void PlayerMove(char board[][COL], int row, int col){
int x, y;
while (1){
printf("plese enter your pos(x,y):>\n");
scanf("%d,%d", &x, &y);
if (x >= 1 && x <= row&&y >= 1 && y <= col){
if (board[x - 1][y - 1] = ' '){
board[x - 1][y - 1] = 'x';
break;
}
else{
printf("enter pos is not ok,try again\n");
}
}
else{
printf("Error,try again\n");
}
}
}
5:显示棋盘及下棋的过程:利用二维数组完成
void ShowBoard(char board[][COL], int row, int col){
int i = 1;
int j = 0;
printf(" 1 2 3\n");
printf("---------------\n");
for (i = 0; i <row; i++){
printf("%d |", i+1);
for (j = 0; j < col; j++){
printf(" %c |", board[i][j]);
}
printf("\n----------------\n");
}
}
以上五大功能块完成后,在game()函数中调用该功能块完成游戏功能,输出输赢结果。结果共有三种可能,电脑赢,用户赢,平局。
void Game(){
char board[ROW][COL];
memset(board, ' ', sizeof(board));//将board所指向的某一块内存中的每个字节的内容全部设置为‘ ’块的大小由sizeof(board)决定。该函数通常为新申请内存做初始化工作。
char result = 'N';
srand((unsigned long)time(NULL));
while (1){
system("cls");
ComputerMove(board, ROW, COL);
ShowBoard(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != 'N'){
break;
}
PlayerMove(board, ROW, COL);
ShowBoard(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != 'N'){
break;
}
}
switch (result){
case'X':
printf("You Win!:\n");
break;
case'O':
printf("You Lose,Computer Win!:\n");
break;
case'E':
printf("Dogfall!:\n");
break;
default:
break;
}
}
1:为了更加清楚的显示下棋过程:调用system("cls");该函数对每次下棋结果清屏,显示最新的结果。
2:电脑产生随机数问题:棋盘的大小为3*3,故生成的坐标要小于等于3。在game()函数中写入srand((unsigned long)time(NULL));每次调用均会产生随机的数字。 将电脑的输入坐标表示为: int x = rand() % row; int y = rand() % col;对行,列求模后可获得合格的坐标。
以下为运行结果: