您的位置:首页 > 其它

三子棋小游戏

2017-04-05 14:22 323 查看
三子棋小游戏  之前没怎么写过功能复杂一点的程序,在程序的结构,函数的声明引用方面遇到了一些问题。还是得多练。

game.h文件

#ifndef __GAME_H__
#define __GAME_H__

#include<stdio.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__

game.c文件

#define _CRT_SECURE_NO_DEPRECATE 1
#include"game.h"
void init_board(char board[ROWS][COLS],int row,int col)//初始化棋谱空间
{
memset(board,' ',col*row*sizeof(char));
}
void display_board (char board[ROWS][COLS],int row,int col)//打印棋谱
{
int i;
for(i=0;i<row;i++)
{
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
if(i<row-1)
printf("---|---|---\n");
}
}
void player_move(char board[ROWS][COLS], int row, int col)//玩家输入
{
int x,y;
while(1)
{
printf("请输入坐标");
scanf("%d%d",&x,&y);
if(x>=1&&x<=row&&y>=1&&y<=col)
{
x--;
y--;
if(board[x][y]==' ')
{
board[x][y]='x';
break;
}
else
{
printf("该位置已占用请重新输入");

}
}
else
{
printf("不在棋盘范围内 请重新输入");
}
}
}
void computer_move (char board[ROWS][COLS], int row, int col)//电脑输入
{

while(1)
{
int x=rand()%3;
int y=rand()%3;
if(board[x][y]==' ')
{
board[x][y]='0';
break;
}
}
}
int check_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]) //不能使用三连等a==b==c!=d
&&(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(check_full(board, row, col))
{
return 'D'; //draw
}
return ' ';
}
主函数文件test.c
#define _CRT_SECURE_NO_DEPRECATE 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"

int menu()
{
printf("*******************************\n");
printf("*******1 PIAY 0 EXIT *********\n");
printf("*******************************\n");
printf(" 请选择 \n");
return 0;
}

void game()
{
char board[ROWS][COLS];
char 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') //根据返回值判断输出输赢
{ printf("恭喜玩家赢\n");
display_board(board, ROWS, COLS);
}
else if(ret == '0')
{
printf("电脑赢\n");
display_board(board, ROWS, COLS);
}
else if(ret == 'D')
{
printf("平局\n");
display_board(board, ROWS, COLS);
}

}

int main()
{
int c;
do{
menu();
scanf("%d",&c);
switch(c){
case 1:game() ;break;
case 0:printf("退出游戏\n") ;break;
default:printf("选择有误,请重新输入\n") ;break;
}
}while(c!=0);

system("pause");
return 0;
}






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