第一次写这么长的C语言代码,超级喜欢这样的游戏代码,难的不是写出来,难的是让写的电脑打败自己,这也算是智能代码吧。
在创建棋盘和判断输赢上做到了动态, 虽然对对手电脑的智商做了优化,但是优化的代码写的很粗糙,希望自己以后可以写出来更好的代码。
代码如下:
game.h (头文件代码)
#include <stdio.h>
#define ROW 3
#define COL 3
#define COUNT 3
void init(char arr,int row ,int col); //初始化数组(棋盘)
void print(char arr,int row,int col); //打印棋盘
void playergame(char arr,int row,int col,int x,int y); //玩家选坐标
void computergame(char arr,int row,int col); //电脑选坐标
int IsWin(char arr,int row,int col); //判断输赢
int Tie(char arr,int row,int col); //平局
test.c (主函数代码)
#include "game.h"
int main()
{
char arr[ROW][COL] = {0};
while(1)
{
int num = 0;
init(arr,ROW,COL); //初始化数组(棋盘)
printf("*******************\n");
printf("**** 1.paly ****\n");
printf("**** 0.exit ****\n");
printf("*******************\n");
printf("请输入选项:\n");
scanf("%d",&num);
switch(num)
{
case 1:
while(1)
{
int r = 0,c = 0;
print(arr,ROW,COL);
printf("请玩家输入坐标:\n");
scanf("%d %d",&r,&c);
playergame(arr,ROW,COL,r,c); //玩家选坐标
if(IsWin(arr,ROW,COL) == 1) //判断输赢
{
print(arr,ROW,COL); //打印棋盘
printf("玩家赢!\n");
break;
}
if(Tie(arr,ROW,COL) == 0) //平局
{
print(arr,ROW,COL); //打印棋盘
printf("平局!\n");
break;
}
if(arr[r-1][c-1] != 'X')
{
continue;
}
print(arr,ROW,COL); //打印棋盘
printf("电脑走:\n");
computergame(arr,ROW,COL,r,c); //电脑选坐标
if(IsWin(arr,ROW,COL) == 0) //判断输赢
{
print(arr,ROW,COL); //打印棋盘
printf("电脑赢!\n");
break;
}
if(Tie(arr,ROW,COL) == 0) //平局
{
print(arr,ROW,COL); //打印棋盘
printf("平局!\n");
break;
}
}
break;
case 0:
return 0;
default:printf("输入错误,请重新输入:\n");
}
}
return 0;
}
game.h (外函数代码)
#include "game.h"
#include <time.h>
#include <stdlib.h>
void init(char arr[ROW][COL],int row ,int col) //初始化数组(棋盘)
{
int i = 0, j = 0;
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
arr[i][j] = ' ';
}
}
}
void print(char arr[ROW][COL],int row,int col) //打印棋盘
{
int i = 0, j = 0;
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
printf(" %c ",arr[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 playergame(char arr[ROW][COL],int row,int col,int x,int y) //玩家选坐标
{
if(x>row || x<1)
{
printf("输入的坐标有误,请重新输入;\n");
return 0;
}
if(y>col || y<1)
{
printf("输入的坐标有误,请重新输入;\n");
return 0;
}
if(arr[x-1][y-1] != ' ')
{
printf("输入的坐标已被填充,请重新输入;\n");
return 0;
}
arr[x-1][y-1] = 'X';
}
void computergame(char arr[ROW][COL],int row,int col) //电脑选坐标
{
int ret1 = 0, ret2 = 0;
int i = 0, j = 0;
//抢中间
if(arr[1][1] == ' ')
{
arr[1][1] = '0';
return 0;
}
//赢玩家
for(i=0 ;i<row ;i++)
{ //赢横行
if(arr[i][0] == arr[i][1] && arr[i][1] == '0')
{
if(arr[i][2] == ' ')
{
arr[i][2] = '0';
return 0;
}
}
if(arr[i][2] == arr[i][1] && arr[i][1] == '0')
{
if(arr[i][0] == ' ')
{
arr[i][0] = '0';
return 0;
}
}
if(arr[i][0] == arr[i][2] && arr[i][0] == '0')
{
if(arr[i][1] == ' ')
{
arr[i][1] = '0';
return 0;
}
}
}
for(j=0 ;j<col ;j++)
{ //赢竖行
if(arr[0][j] == arr[1][j] && arr[1][j] == '0')
{
if(arr[2][j] == ' ')
{
arr[2][j] = '0';
return 0;
}
}
if(arr[1][j] == arr[2][j] && arr[1][j] == '0')
{
if(arr[0][j] == ' ')
{
arr[0][j] = '0';
return 0;
}
}
if(arr[0][j] == arr[2][j] && arr[0][j] == '0')
{
if(arr[1][j] == ' ')
{
arr[1][j] = '0';
return 0;
}
}
}
if((arr[0][0] == arr[2][2] && arr[0][0] == '0')||(arr[0][2] == arr[2][0] && arr[0][2] == '0'))
{ //赢斜行
if(arr[1][1] == ' ')
{
arr[1][1] = '0';
return 0;
}
}
if(arr[0][0] == arr[1][1] && arr[1][1] == '0')
{
if(arr[2][2] == ' ')
{
arr[2][2] = '0';
return 0;
}
}
if(arr[0][2] == arr[1][1] && arr[1][1] == '0')
{
if(arr[2][0] == ' ')
{
arr[2][0] = '0';
return 0;
}
}
if(arr[2][2] == arr[1][1] && arr[1][1] == '0')
{
if(arr[1][1] == ' ')
{
arr[1][1] = '0';
return 0;
}
}
if(arr[2][0] == arr[1][1] && arr[1][1] == '0')
{
if(arr[0][2] == ' ')
{
arr[0][2] = '0';
return 0;
}
}
//堵玩家
for(i=0 ;i<row ;i++)
{ //堵横行
if(arr[i][0] == arr[i][1] && arr[i][1] == 'X')
{
if(arr[i][2] == ' ')
{
arr[i][2] = '0';
return 0;
}
}
if(arr[i][2] == arr[i][1] && arr[i][1] == 'X')
{
if(arr[i][0] == ' ')
{
arr[i][0] = '0';
return 0;
}
}
if(arr[i][0] == arr[i][2] && arr[i][0] == 'X')
{
if(arr[i][1] == ' ')
{
arr[i][1] = '0';
return 0;
}
}
}
for(j=0 ;j<col ;j++)
{ //堵竖行
if(arr[0][j] == arr[1][j] && arr[1][j] == 'X')
{
if(arr[2][j] == ' ')
{
arr[2][j] = '0';
return 0;
}
}
if(arr[1][j] == arr[2][j] && arr[1][j] == 'X')
{
if(arr[0][j] == ' ')
{
arr[0][j] = '0';
return 0;
}
}
if(arr[0][j] == arr[2][j] && arr[0][j] == 'X')
{
if(arr[1][j] == ' ')
{
arr[1][j] = '0';
return 0;
}
}
}
if((arr[0][0] == arr[2][2] && arr[0][0] == 'X')||(arr[0][2] == arr[2][0] && arr[0][2] == 'X'))
{ //堵斜行
if(arr[1][1] == ' ')
{
arr[1][1] = '0';
return 0;
}
}
if(arr[0][0] == arr[1][1] && arr[1][1] == 'X')
{
if(arr[2][2] == ' ')
{
arr[2][2] = '0';
return 0;
}
}
if(arr[0][2] == arr[1][1] && arr[1][1] == 'X')
{
if(arr[2][0] == ' ')
{
arr[2][0] = '0';
return 0;
}
}
if(arr[2][2] == arr[1][1] && arr[1][1] == 'X')
{
if(arr[1][1] == ' ')
{
arr[1][1] = '0';
return 0;
}
}
if(arr[2][0] == arr[1][1] && arr[1][1] == 'X')
{
if(arr[0][2] == ' ')
{
arr[0][2] = '0';
return 0;
}
}
while(1)
{
ret1 = rand()%col;
ret2 = rand()%row;
if(arr[ret1][ret2] == ' ')
{
arr[ret1][ret2] = '0';
return 0;
}
}
}
int IsWin(char arr[ROW][COL],int row,int col) //判断输赢
{
int tmp = 0,con = 0;
int i = 0, j = 0;
//横行
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
tmp = 0;
for(con=0 ;con<COUNT ;con++)
{
if(j+con<COL)
{
tmp = tmp +arr[i][j+con];
}
}
if(tmp/COUNT == 'X')
{
return 1;
}
if(tmp/COUNT == '0')
{
return 0;
}
}
}
//竖行
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
tmp = 0;
for(con=0 ;con<COUNT ;con++)
{
if(i+con<ROW)
{
tmp = tmp +arr[i+con][j];
}
}
if(tmp/COUNT == 'X')
{
return 1;
}
if(tmp/COUNT == '0')
{
return 0;
}
}
}
//斜行
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
tmp = 0;
for(con=0 ;con<COUNT ;con++)
{
if(i+con<ROW && j+con<COL)
{
tmp = tmp +arr[i+con][j+con];
}
}
if(tmp/COUNT == 'X')
{
return 1;
}
if(tmp/COUNT == '0')
{
return 0;
}
}
}
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
tmp = 0;
for(con=0 ;con<COUNT ;con++)
{
if(i+con<ROW && j-con>=0)
{
tmp = tmp +arr[i+con][j-con];
}
}
if(tmp/COUNT == 'X')
{
return 1;
}
if(tmp/COUNT == '0')
{
return 0;
}
}
}
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
tmp = 0;
for(con=0 ;con<COUNT ;con++)
{
if(i-con>0 && j+con<=COL)
{
tmp = tmp +arr[i-con][j+con];
}
}
if(tmp/COUNT == 'X')
{
return 1;
}
if(tmp/COUNT == '0')
{
return 0;
}
}
}
}
int Tie(char arr[ROW][COL],int row,int col) //平局
{
int i = 0, j = 0;
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
if(arr[i][j] == ' ')
return 1;
}
}
return 0;
}