刚开始学c语言,写的哪里不好希望各位可以告诉,有什么意见也是希望大家多多和我交流,如果对大家有帮助我很开心,可能有点bug但是不影响使用,附源码,纯c没有办法做到很花哨,这个很简朴,和我一样刚刚开始学c的同学可以参考参考,Dev,vc++6.0等老版编译器都可以,vc可能会出警告,但是不影响。
源码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void menu();//绘制菜单
void singlegame();//单人游戏操作
void doublegame();//双人游戏操作
void initboard(char board[ROW][COL],int row,int col);//初始化棋盘
void displayedboard(char board[ROW][COL],int row,int col);//绘制棋盘
void player(char board[ROW][COL],int row,int col);//玩家操作(单人游戏)
void player1(char board[ROW][COL],int row,int col);//玩家一 操作(双人游戏)
void player2(char board[ROW][COL],int row,int col);//玩家二操作(双人游戏)
void computer(char board[ROW][COL],int row,int col);//cpu操作(电脑操作)
int win(char board[ROW][COL], int row, int col);//判断获胜条件
void restartgame();//游戏总体
void single(); //单人游戏程序
void dou(); //双人游戏程序
void regret();//悔棋
void Regret();
int Row=0; //坐标记录
int Col=0; //坐标记录
int R1 = 0; //坐标记录
int C1 = 0; //坐标记录
int R2 = 0; //坐标记录
int C2 = 0; //坐标记录
int j = 2; //条件判断
int b = 0;
int main()
{
printf("********欢迎游玩井字棋*********\n\n");
printf("输入坐标以下棋,以下是坐标格式:\n"); //提示输入规则
printf("【1 1】【1 2】【1 3】\n\n");
printf("【2 1】【2 2】【2 3】\n\n");
printf("【3 1】【3 2】【3 3】\n\n");
system("color 3f");
restartgame();
return 0;
}
void restartgame() //游戏本体函数
{
int i;
menu(); //选择菜单
scanf("%d",&i);
switch(i) //选择单人或者双人游戏
{
case 1:
single();
break;
case 2:
dou();
break;
case 0:
break;
default:
printf("error\n");
break;
}
}
void menu()
{
printf("------------------------------\n\n");
printf("--------输入1单人游戏---------\n\n--------输入2双人游戏---------\n\n--------输入0结束游戏---------\n\n");
printf("------------------------------\n\n");
}
void single()
{
system("cls");
srand((unsigned int)time(NULL));
singlegame();
}
void dou() //double
{
system("cls");
srand((unsigned int)time(NULL));
doublegame();
}
void doublegame() //多人游戏函数本体
{
char board[ROW][COL]={' '};
initboard(board,ROW,COL);
displayedboard(board,ROW,COL);
do{if(j==0)
break;
player1(board,ROW,COL);
if(j==0)
break;
player2(board,ROW,COL);
}while(j);
restartgame();
}
void singlegame() //单人游戏函数本体
{
char board[ROW][COL]={' '};
initboard(board,ROW,COL);
displayedboard(board,ROW,COL);
do{
player(board,ROW,COL);
computer(board,ROW,COL);
}while(j);
restartgame();
}
void initboard(char board[ROW][COL],int row,int col) //初始化棋盘
{
int i;
int j;
for(i=0;i<=row;i++)
{
for(j=0;j<=col;j++)
{
board[i][j]=' ';
}
}
}
void displayedboard(char board[ROW][COL],int row,int col) //显示棋盘
{
int i;
int j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
printf(" %c ",board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i<row-1)
{
for(j=0;j<col;j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
}
void player1(char board[ROW][COL],int row,int col) //玩家操作
{
int x = 0;
int y = 0;
j=win(board,ROW,COL);
printf("先手的回合\n");
while(1)
{
printf("请玩家输入坐标\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]='O';
break;
}
else
{
printf("该区域无法落棋\n");
}
}
else
{
printf("错误,请按照坐标输入\n");
}
}
R1 = x-1;
C1 = y-1;
j=win(board,ROW,COL);
//displayedboard(board,ROW,COL);
switch(b)
{ case 0:
regret(board,x,y);
break;
case 1:
printf("先手win!\n");
break;
case 2:
printf("先手win!\n");
break;
default:
printf("error\n");
break;
}
}
void player2(char board[ROW][COL],int row,int col) //玩家操作
{
int x = 0;
int y = 0;
int a = 0;
j=win(board,ROW,COL);
printf("后手的回合\n");
while(1)
{
printf("请玩家输入坐标\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("该区域无法落棋\n");
}
}
else
{
printf("错误,请按照坐标输入\n");
}
}
R2 = x-1;
C2 = y-1;
//displayedboard(board,ROW,COL);
j=win(board,ROW,COL);
switch(b)
{ case 0:
regret(board,x,y);
break;
case 1:
printf("先手win!\n");
break;
case 2:
printf("先手win!\n");
break;
default:
printf("error\n");
break;
}
}
void player(char board[ROW][COL],int row,int col) //玩家操作
{
int x = 0;
int y = 0;
printf("先手的回合\n");
while(1)
{
printf("请玩家输入坐标\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]='O';
break;
}
else
{
printf("该区域无法落棋\n");
}
}
else
{
printf("错误,请按照坐标输入\n");
}
}
Row = x-1;
Col = y-1;
j=win(board,ROW,COL);
}
void computer(char board[ROW][COL],int row,int col) //电脑操作
{
int x=0;
int y=0;
int i=0;
if(j!=0)
{
printf("后手的回合\n");
while(1)
{
x = rand() % row;
y = rand() % col;
if(board[x][y]==' ')
{
board[x][y]='X';
break;
}
}
}
//displayedboard(board,ROW,COL);
j=win(board,ROW,COL);
switch(b)
{ case 0:
regret(board,x,y);
break;
case 1:
printf("先手win!\n");
break;
case 2:
printf("后手win!\n");
break;
default:
printf("error\n");
break;
}
//regret(board,x,y);
displayedboard(board,ROW,COL);
}
int win(char board[ROW][COL], int row, int col) //获胜判断
{
int i = 0;
int j = 0;
int t = 0;
int c = 0;
for (i = 0; i < col; i++)
{
//横三行
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
if(board[i][1]=='O')
b=1;
else
b=2;
return 0;
}
}
for (j = 0; j < row; j++)
{
//竖三列
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
if(board[1][j]=='O')
{
c=1;
b=1;
}
else
b=2;
return 0;
}
}
//斜两列
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
if(board[1][1]=='O')
{
c=1;
b=1;
}
else
b=2;
return 0;
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
if(board[1][1]=='O')
{
c=1;
b=1;
}
else
b=2;
return 0;
}
//判断是否棋盘满
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(board[i][j]!=' ')
t++;
}
}
if(t==8)
{
printf("游戏以经平局\n");
return 0;
}
if(t!=8)
{
printf("下一回合\n");
return 1;
}
}
void regret(char board[ROW][COL],int row,int col) //悔棋函数
{
char a;
displayedboard(board,ROW,COL);
printf("如果您想要悔棋请按空格,不想请按enter键继续\n");
//scanf("%d",&a);
a = _getch();
if(a==' ')
{
board[row][col]=' ';
board[Row][Col]=' ';
}
}
void Regret(char board[ROW][COL]) //悔棋函数
{
char a = 0;
displayedboard(board,ROW,COL);
printf("如果您想要悔棋请按空格,不想请按enter键继续\n");
a = _getch();
if(a==' ')
{
board[R1][C1]=' ';
board[R2][C2]=' ';
}
}
作者Dld
时间2023/2/20/23.45