您的位置:首页 > 其它

三子棋小游戏(新手必看)

2017-04-23 14:00 323 查看
头文件

game.h

#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include<time.h>
#include <stdlib.h>
#include <string.h>
#define ROWS 3
#define COLS 3
void init_board(char board[ROWS][COLS], int row, int col);
void display_board(char board[ROWS][COLS], int row, int col);
void player_move(char board[ROWS][COLS], int row, int col);
void computer_move(char board[ROWS][COLS], int row, int col);
char check_win(char board[ROWS][COLS], int row, int col);
#endif //__GAME_H__


test.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"

void game()
{
char board[ROWS][COLS] = {0};
int ret = 0;
init_board(board,ROWS, COLS);//初始化棋盘
display_board(board,ROWS, COLS);//打印棋盘
//srand((unsigned int)time(NULL));
//产生一个随机值
while(1)
{
player_move(board, ROWS, COLS);//玩家下
if ((ret = check_win(board,ROWS,COLS)) != ' ')
//若所下坐标不为空,则跳出重新打印
break;
display_board(board,ROWS, COLS);

computer_move(board, ROWS, COLS);
if ((ret = check_win(board,ROWS,COLS)) != ' ')//若所下坐标不为空,跳出重新打印

break;
display_board(board, ROWS, COLS);

}
if(ret == 'X')//check_win函数的返回值是“X”
{
printf("玩家赢\n");
}
else if(ret == '$')//...
{
printf("电脑赢\n");
}
else if(ret == 'q')//...
{
printf("平局\n");
}

display_board(board, ROWS,COLS);//返回值是' '重新打印
}
void menu()//打印菜单
{
printf("**********************\n");
printf("**** 1.play 0.exit ***\n");
printf("**********************\n");

}

void test()
{
int input = 0;
srand((unsigned int)time(NULL));//产生一个随机值
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch(input)//玩家输入选择开始游戏
{
case 1:
game();
break;

case 0:
break;
default://输入除0 1外其他无效选项,打印提示信息
printf("输入错误\n");
break;
}
}
while(input);

}

int main()
{
test();
return 0;
}


game.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"
void init_board(char board[ROWS][COLS], int row, int col)//初始化棋盘函数
{
memset(board,' ',row*col*sizeof(char));

}
void display_board(char board[ROWS][COLS], int row, int col)//打印棋盘函数
{
int i = 0;
for(i=0; i<row; i++)//将棋盘打印出来
{
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
if(i!=2)
printf("---|---|---\n");
}

}
void player_move(char board[ROWS][COLS], int row, int col)//玩家下
{
int x = 0;
int y = 0;
while(1)
{
printf("请输入坐标:>");
scanf("%d%d",&x,&y);
x--;
y--;
if(((x>=0)&&(x<=2))&&((y>=0)&&(y<=2)))//判断输入坐标是否合理
{
if(board[x][y] == ' ')//判断所下位置是否已经下过
{
{
board[x][y] = 'X';
break;
}
}
else
{
printf("坐标错误,重新输入\n");
}
}
else
{
printf("坐标错误,重新输入\n");
}
}

}
void computer_move(char board[ROWS][COLS], int row, int col)//电脑下
{
int x = 0;
int y = 0;
while(1)
{
x = rand()%3;
y = rand()%3;

if(board[x][y]==' ')
{
board[x][y] = '$';
break;

}

}

}
static int is_full(char board[ROWS][COLS], int row, int col)//判断棋盘是否已经下满
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
for(j=0; j<col; j++)
{
if(board[i][j]==' ')
return 0;
}
return 1;
}
char check_win(char board[ROWS][COLS], int row, int col)//判断输赢
{
int i = 0;
for(i=0; i<row; i++)//同行的三个相同
{
if((board[i][0]==board[i][1])&&
(board[i][1]==board[i][2])&&
(board[i][1]!=' '))
return board[i][1];
}
for(i=0; i<col; i++)//同列的三个相同
{
if((board[0][i]==board[1][i])&&
(board[1][i]==board[2][i])&&
(board[1][i]!=' '))
return board[1][i];
}
if((board[0][0]==board[1][1])&&
(board[1][1]==board[2][2])&&
(board[1][1]!=' '))//对角线三个相同
return board[1][1];
if((board[0][2]==board[1][1])&&
(board[1][1]==board[2][0])&&
(board[1][1]!=' '))//对角线三个相同
return board[1][1];

if (is_full(board,row,col))

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