您的位置:首页 > 编程语言 > C语言/C++

用C语言实现三子棋小游戏

2017-10-26 15:04 861 查看
#ifndef __GAME_H__
#define __GAME_H__

#define COL 3
#define ROW 3
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
#include<stdio.h>
#include<windows.h>

void init_board(char arr[COL][ROW], int col, int row);
void display_board(char arr[COL][ROW], int col, int row);
void blue_player_move(char arr[COL][ROW], int col, int row);//blue|'X'
void red_player_move(char arr[COL][ROW], int col, int row);//red|'O'
void computer_move(char arr[COL][ROW], int col, int row);
char check_win(char arr[COL][ROW], int col, int row);
void pve_game();
void pvp_ganme();

#endif//__GAME_H__


# define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void init_board(char arr[COL][ROW], int col, int row)
{
memset(arr, ' ', sizeof(arr[COL][ROW]) * col*row);
}

void display_board(char arr[COL][ROW], int col, int row)
{
int i = 0;
for (i = 0; i < col; i++)
{
printf(" %c | %c | %c\n", arr[i][0], arr[i][1], arr[i][2]);
if (i!=col-1)
printf("---|---|---\n");
}
printf("\n");

}

void computer_move(char arr[COL][ROW], int col, int row)
{

while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (arr[x][y] == ' ')
{
arr[x][y] = 'O';
break  ;
}
}
}
void blue_player_move(char arr[COL][ROW], int col, int row)//blue|'X'
{
int x = 0;
int y = 0;

while (1)
{
printf("请blue玩家输入你要下的坐标( x , y ):>");
scanf("%d %d", &x, &y);
if (((x <= 3 && y <= 3) && (x >= 1 && y >= 1)) && (arr[x - 1][y - 1] == ' '))
{
arr[x - 1][y - 1] = 'X';
break;
}
else
{
printf("输入错误\n");
}
}

}
void red_player_move(char arr[COL][ROW], int col, int row)//red|'O'
{
int x = 0;
int y = 0;

while (1)
{
printf("请red玩家输入你要下的坐标( x , y ):>");
scanf("%d %d", &x, &y);
if (((x <= 3 && y <= 3) && (x >= 1 && y >= 1)) && (arr[x - 1][y - 1] == ' '))
{
arr[x - 1][y - 1] = 'O';
break;
}
else
{
printf("输入错误\n");
}
}

}
static int is_full(char arr[COL][ROW], int col, int row)
{
int i = 0;
int j = 0;
for (i = 0; i < col; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char check_win(char arr[COL][ROW], int col, int row)//判定函数,COL、ROW改变此函数需修改
{
int i = 0;
char Q = 0;
for (i = 0; i < col; i++)
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])&&(arr[i][2]==arr[i][0])&& (arr[i][0] != ' '))
return arr[i][0];
}
for (i = 0; i < col; i++)
{
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i])&&(arr[2][i]==arr[0][i]) && (arr[0][i] != ' '))
return  arr[0][i];
}
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == arr[0][0]) && (arr[1][1] != ' '))
{
return arr[1][1];
}
if ((arr[2][0] == arr[1][1]) && (arr[1][1] == arr[0][2])&&(arr[0][2]==arr[2][0]) && (arr[1][1] != ' '))
{
return arr[1][1];
}
if (is_full(arr,col,row))
{
return 'Q';
}
else
return ' ';
}


# define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void menu()
{
printf("**************************************************************************************\n");
printf("******************    1.play      2.Game rules      0.exit      **********************\n");
printf("**************************************************************************************\n");
}
void menu_Game_mode()
{
printf("**********************************************************************************\n");
printf("**********        1.player with player        0.player with computer    **********\n");
printf("**********************************************************************************\n");
}

void menu3()
{
printf("**************************************************************************************\n");
printf("*********        1.computer before player        0.player before computer    *********\n");
printf("**************************************************************************************\n");
}
void menu_first_player()
{
printf("**********************************************************************************\n");
printf("****   1.red player before bule player      0.bule player before red player   ****\n");//red is 'O'  bule is 'X'
printf("****          blue player is 'X'                       red player is 'O'       ***\n");
printf("**********************************************************************************\n");
}
void menu_Game_rules()
{
printf("**************************************************************************************\n");
printf("******     当一方三子连成一条直线时该方获胜,若棋盘下满还未有人获胜则为平局     ******\n");
printf("**************************************************************************************\n");
}
void pve_game()
{
int a = 0;
char win = 0;
char board[COL][ROW] = { 0 };
srand((unsigned int)time(NULL));
init_board(board, COL, ROW);
system("cls");
menu3();
printf("请选择:>");
scanf("%d", &a);
display_board(board, COL, ROW);
switch (a)
{
case 1:
{
while (1)
{
computer_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(board, COL, ROW);
blue_player_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(board, COL, ROW);
}
system("cls");
display_board(board, COL, ROW);
if (win == 'X')
{
printf("恭喜您取得胜利!!!\n");
}
else if (win == 'O')
{
printf("电脑取得胜利,不要气磊,再战一局吧\n");
}
else if (win == 'Q')
{
printf("平局啦!再战一局吧\n");
}
break;
}
case 0:
{
while (1)
{
system("cls");
blue_player_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(board, COL, ROW);
computer_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(board, COL, ROW);
}
system("cls");
display_board(board, COL, ROW);
if (win == 'X')
{
printf("恭喜您取得胜利!!!\n");
}
else if (win == 'O')
{
printf("电脑取得胜利,不要气磊,再战一局吧\n");
}
else if (win == 'Q')
{
printf("平局啦!再战一局吧\n");
}
break;
}
default:
printf("输入错误\n");
break;
}
}

void pvp_game()
{
int a = 0;
char win = 0;
char board[COL][ROW] = { 0 };
init_board(board, COL, ROW);
system("cls");
menu_first_player();
printf("请选择:>");
scanf("%d", &a);
display_board(board, COL, ROW);
switch (a)
{
case 1:// red('O') first
{
while (1)
{
system("cls");
display_board(board, COL, ROW);
red_player_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(bo
aff1
ard, COL, ROW);
blue_player_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(board, COL, ROW);
}
system("cls");
display_board(board, COL, ROW);
if (win == 'X')
{
printf("恭喜blue玩家取得胜利!!!\n");
}
else if (win == 'O')
{
printf("恭喜red玩家取得胜利!!!\n");
}
else if (win == 'Q')
{
printf("平局啦!再战一局吧\n");
}
break;
}
case 0:// blue('X') first
{
while (1)
{
system("cls");
blue_player_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(board, COL, ROW);
red_player_move(board, COL, ROW);
win = check_win(board, COL, ROW);
if (win != ' ')
break;
system("cls");
display_board(board, COL, ROW);
}
system("cls");
display_board(board, COL, ROW);
if (win == 'X')
{
printf("恭喜blue玩家取得胜利!!!\n");
}
else if (win == 'O')
{
printf("恭喜red玩家取得胜利!!!\n");
}
else if (win == 'Q')
{
printf("平局啦!再战一局吧\n");
}
break;
}
default:
printf("输入错误\n");
break;
}
}

void play_game()
{
int input = 0;
menu_Game_mode();
printf("请选择:>");
scanf("%d", &input);
system("cls");
switch (input)
{
case 0:
pve_game();
break;
case 1:
pvp_game();
break;
default:
printf("输入错误\n");
break;

}
}

void test()
{
int input = 0;

do
{
menu();
printf("请选择:>");
scanf("%d", &input);
system("cls");
switch (input)
{
case 1:
play_game();
break;
case 0:
break;
case 2:
system("cls");
menu_Game_rules();
break;
default:
printf("输入错误\n");
break;
}
} while (input != 0);

}

int main()
{

test();

system("pause");
return 0;
}












内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: