简单方法实现三子棋游戏
思想:(一)主函数中可以有一个测试函数test(),完成用户的整个游戏体验。
(二)test()函数中应该有菜单menu()和游戏game()部分。
game()函数为重点完成部分。
(三) game()函数可单独创建一个源文件game.c
game()函数所需完成的内容:
1,棋盘有行和列,因此首先定义一个二维数组arr[ROW][COL]。ROW为行,COL为列。
2,在游戏开始前将数组内容赋值为空格。----调用InIt()函数。
3,先把棋盘打印出来,展示给玩家。----调用Display()函数。
4,开始玩游戏。玩游戏部分定义在循环中,游戏结束后才可跳出循环。
(1)电脑走。----调用ComputerGo()函数。
每走一步展示一次棋盘。----调用函数Display()。
每走一步判断一次输赢。----调用IsWin()函数。
(2)玩家走。----调用PlayerGo()函数。
每走一步展示一次棋盘。----调用函数Display()。
每走一步判断一次输赢。----调用IsWin()函数。
(四)创建一个头文件game.h
将函数的声明,引用的头文件,define定义的标识符常量都放在所定义的头文件中,则源文件中就可以省略。
每个源文件中只需声明头文件,就可调用头文件中的所有内容。
</font><br />
头文件如下:
#ifndef __GAME__H__
#define __GAME__H__
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void menu();
void InIt(char arr[ROW][COL], int row, int col);
void Display(char arr[ROW][COL],int row,int col);
void ComputerGo(char arr[ROW][COL], int row, int col);
void PlayerGo(char arr[ROW][COL], int row, int col);
char IsWin(char arr[ROW][COL], int row, int col);
#endif __GAME__H__
游戏主体部分如下:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include <stdlib.h>
//打印菜单
void menu()
{
printf("**********************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("**********************\n");
}
//游戏函数
void game()
{
char arr[ROW][COL] = { 0 };
char ret = 0;
//输入坐标全为空格
InIt(arr, ROW, COL);
//打印棋盘
Display(arr, ROW, COL);
while (1)
{
//(1)电脑走
//电脑赢--'*'
//玩家赢--'1'
//平局----'='
//游戏继续-' '
ComputerGo(arr, ROW, COL);
Display(arr, ROW, COL);
ret = IsWin(arr, ROW, COL);
if (' ' != ret)
{
if ('*' == ret)
{
printf("电脑赢。\n");
break;
}
if ('=' == ret)
{
printf("平局。\n");
break;
}
}
else
{
printf("游戏继续。。。\n");
}
//(2)玩家走
PlayerGo(arr, ROW, COL);
Display(arr, ROW, COL);
ret = IsWin(arr, ROW, COL);
if (' ' != ret)
{
if ('1' == ret)
{
printf("玩家赢。\n");
break;
}
if ('=' == ret)
{
printf("平局。\n");
break;
}
}
else
{
printf("游戏继续。。。\n");
}
}
}
//测试函数
void test()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏......\n");
break;
default:
printf("输入错误!!请重新输入!!!\n");
break;
}
} while (input);
}
//主函数
int main()
{
test();
system("pause");
return 0;
}
游戏部分函数如下:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//输入坐标,全部坐标赋值为空格
void InIt(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
//展示棋盘
void Display(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row ; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
{
printf("|");
}
else
{
printf("\n");
}
}
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("___");
if (j < col - 1)
{
printf(".");
}
else
{
printf("\n");
}
}
}
printf("\n");
}
}
//电脑走
void ComputerGo(char arr[ROW][COL], int row, int col)
{
srand((unsigned)time(NULL));
printf("电脑走:\n\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
//坐标合法
if (x >= 0 && x < row && y >= 0 && y < col )
{
//判断坐标是否被占用
if (' ' == arr[x][y])
{
arr[x][y] = '*';
break;
}
}
//坐标不合法,此处不用再判断,如果不满足以上条件,直接进入下一次循环
}
}
//玩家走
void PlayerGo(char arr[ROW][COL]。, int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家走:> ");
//输入的坐标以玩家体验为前提,输入坐标(1,1)则表示arr[0][0],以此类推
scanf("%d%d", &x, &y);
printf("\n\n");
//坐标合法
if (x-1 >= 0 && x-1 < row && y-1 >= 0 && y-1 < col)
{
//判断坐标是否被占用
if (' ' == arr[x-1][y-1])
{
arr[x - 1][y - 1] = '1';
break;
}
else
{
printf("该坐标已被占用,请重新输入!!!\n");
}
}
//坐标不合法
else
{
printf("输入的坐标不符合要求,请重新输入!!!\n");
}
}
}
//判断谁赢
//1.电脑赢
//.玩家赢
//3.平局
//4.游戏继续
char IsWin(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
//判断谁赢--电脑赢,玩家赢,平局
//判断行
for (x = 0; x < row; x++)
{
if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][0] != ' ')
{
return arr[x][0];
break;
}
}
//判断列
for (x = 0; x < col; x++)
{
if (arr[0][x] == arr[1][x] && arr[1][x] == arr[2][x] && arr[0][x] != ' ')
{
return arr[0][x];
break;
}
}
//判断对角线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
{
return arr[1][1];
}
//平局 和 游戏继续
for (x = 0; x < row; x++)
{
for (y = 0; y < col; y++)
{
if (' ' != arr[x][y])
{
count++;
}
}
}
if (row * col == count)
{
return '=';
}
else
{
return ' ';
}
}