三字棋优化 ,主要是针对棋局大小及方式的优化,可实现ROW*COL个格子,ZI字棋。也即棋盘方式,与下法都可以变化。
其中game.c中分别写了纯三字棋>优化>ROW*COL三字棋>优化>ROW*COL个格子ZI字棋的三种写法。
运行过程如下
主程序代码:
test.c
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#include "game.h"
#include "menu.h"
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择->");
scanf("%d", &input);
clc();
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
} while (input);
return 0;
}
菜单栏头文件
menu.h
#ifndef __MENU_H__
#define __MEBU_H__
void menu();
#endif
菜单栏c文件
menu.c
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#include "game.h"
void menu()
{
printf("****************************************\n");
printf("*******棋盘模式%d行,%d列,%d字棋*********\n", ROW, COL, ZI);
printf("******** 1:play 0:exit ***********\n");
printf("****************************************\n");
}
游戏程序代码,头文件
game.h
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3 //3行
#define COL 5 //5列
#define ZI 3 //后续需传参几字棋
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void game();
void InitChess(char chess[ROW][COL]);
void DisplayChess(char chess[ROW][COL]);
void PlayerMove(char chess[ROW][COL]);
void ComputerMove(char chess[ROW][COL]);
void clc(); //清除多余字符
char IsWin(char chess[ROW][COL]);
int IsFull(char chess[ROW][COL]);
#endif // !__GAME_H__
游戏程序代码,c文件
game.c
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#include "game.h"
void game()
{
char ret;
char chess[ROW][COL];
InitChess(chess); //初始化棋盘
DisplayChess(chess); //输入棋盘
while (1)
{
PlayerMove(chess); //玩家下棋
DisplayChess(chess);
ret=IsWin(chess);
if(ret!= 'C')
break;
ComputerMove(chess); //电脑下棋
DisplayChess(chess);
ret = IsWin(chess);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家赢!\n");
else if (ret == '#')
printf("电脑赢!\n");
else
printf("平局!\n");
}
//player win return '*'
//computer win return '#'
//平局 return 'Q'
//继续 return 'C'
void InitChess(char chess[ROW][COL])
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
chess[i][j] = ' ';
}
}
}
void DisplayChess(char chess[ROW][COL])
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
printf(" %c ", chess[i][j]);
if(j<COL-1)
printf("|");
}
printf("\n");
for (j = 0; j < COL; j++)
{
if (i == ROW - 1)
break;
printf("---");
if (j < COL - 1)
printf("|");
}
printf("\n");
}
}
void clc()
{
int ch = 0;
while ((ch = getchar()) != '\n')
{
;
}
}
void PlayerMove(char chess[ROW][COL])
{
printf("输入坐标形式例如>>3,4<<,表示第3行第4列\n");
int i, j;
while (1)
{
printf("玩家下棋请输入:>");
scanf("%d,%d", &i, &j);
clc();
if (i >= 1 && i <= ROW && j>=1 && j <= COL)
{
if (chess[i - 1][j - 1] == ' ')
{
chess[i - 1][j - 1] = '*';
break;
}
else
printf("此处已有棋子,换一处吧~\n");
}
else
printf("输入格式错误,请重新输入!\n");
}
}
void ComputerMove(char chess[ROW][COL])
{
printf("电脑下棋:>\n");
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (chess[x][y] == ' ')
{
chess[x][y] = '#';
break;
}
}
}
char IsWin(char chess[ROW][COL])
{
int row,col,x,i,j;
//纯纯的3字棋
//横三行判断
//for (row = 0; row < ROW; row++)
//{
// if (chess[row][0] == chess[row][1] && chess[row][0] == chess[row][2] && chess[row][1] != ' ')
// {
// return chess[row][0];
// }
//}
竖三行判断
//for (col = 0; col < COL; col++)
//{
//
// if (chess[0][col] == chess[1][col] && chess[0][col] == chess[2][col] && chess[2][col] != ' ')
// {
// return chess[0][col];
// }
//}
两个对角线
//if (chess[0][0] == chess[1][1] && chess[0][0] == chess[2][2] && chess[2][2] != ' ')
// return chess[0][0];
//if (chess[2][0] == chess[1][1] && chess[2][0] == chess[0][2] && chess[0][2] != ' ')
// return chess[0][0];
/**************************************************************************************************************************/
优化1 N行N列,3字棋
判断列连续
//
//for (i = 0; i < ROW-2; i++)
//{
// for (j = 0; j < COL; j++)
// {
// if (chess[i][j] == chess[i + 1][j] && chess[i][j] == chess[i + 2][j] && chess[i][j] != ' ')
// return chess[i][j];
// }
//}
判断行连续
//for (j = 0; j < COL-2; j++)
//{
// for (i = 0; i < ROW; i++)
// {
// if (chess[i][j] == chess[i][j+1] && chess[i][j] == chess[i][j+2] && chess[i][j] != ' ')
// return chess[i][j];
// }
//}
左对角
//for (i = 0; i < ROW-2; i++)
//{
// for (j = 0; j < COL-2; j++)
// {
// if (chess[i][j] == chess[i + 1][j+1] && chess[i][j] == chess[i + 2][j+2] && chess[i][j] != ' ')
// return chess[i][j];
// }
//}
右对角
//for (i = 2; i < ROW; i++)
//{
// for (j = 0 ; j < COL-2; j++)
// {
// if (chess[i][j] == chess[i - 1][j + 1] && chess[i][j] == chess[i - 2][j + 2] && chess[i][j] != ' ')
// return chess[i][j];
// }
//}
/***************************************************************************************************************************/
//优化2 ROW行COL列,ZI字棋
//判断列连续
for (i = 0; i < ROW-ZI+1; i++)
{
for (j = 0; j < COL; j++)
{
int sum = 0;
for (row = 0; row < ZI ; row++)
sum += chess[i + row][j];
if (sum == ZI * '*')
return '*';
else if (sum == ZI * '#')
return '#';
}
}
//判断行连续
for (j = 0; j < COL-ZI+1; j++)
{
for (i = 0; i < ROW; i++)
{
int sum = 0;
for (col = 0; col < ZI; col++)
sum += chess[i][j+col];
if (sum == ZI * '*')
return '*';
else if (sum == ZI * '#')
return '#';
}
}
//左对角
for (i = 0; i < ROW-ZI+1; i++)
{
for (j = 0; j < COL-ZI+1; j++)
{
int sum = 0;
for (x = 0; x < ZI; x++)
sum += chess[i + x][j + x];
if (sum == ZI * '*')
return '*';
else if (sum == ZI * '#')
return '#';
}
}
//右对角
for (i = ZI-1; i < ROW ; i++)
{
for (j = 0; j < COL - ZI + 1; j++)
{
int sum = 0;
for (x = 0; x < ZI; x++)
sum += chess[i - x][j + x];
if (sum == ZI * '*')
return '*';
else if (sum == ZI * '#')
return '#';
}
}
if (IsFull(chess) == 1)
return 'Q';
return 'C';
}
int IsFull(char chess[ROW][COL])
{
//flag适用于需要都执行完的程序,此处效率低,用return更好
int i, j;
// int flag=1;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (chess[i][j] == ' ')
return 0;
// flag = 0;
}
}
return 1;
}