这篇文章主要是对前面三子棋游戏的完善和改进。
文章目录
目录
1.将棋子*和#,改为1和0;
2.电脑下棋显示坐标
3.可以选择电脑先手或玩家先手
4.在退出游戏时显示游戏信息
5.完善后的游戏效果
二、完整程序代码
1.game.h
2.test.c
3.game.c
总结
前言
http://t.csdn.cn/PcROJ 在这篇文章里面,我们将进阶版三子棋实现了,但游戏效果和游戏体验不是很好,这里将它改进一下。
一、完善程序效果
1.将棋子*和#,改为1和0;
将原来程序中的*#替换掉,使棋子更方便确认;
2.电脑下棋显示坐标
有随机下时坐标和判断下时坐标: 只需要在给数组赋值后,打印一下坐标就可以啦!
3.可以选择电脑先手或玩家先手
这里在调用过菜单函数之后,再使用一个函数,用Switch case 来进行选择,外面是一个do while 循环防止程序中断;
最后在game()函数中,用if else 来进行一个判断,选择1是玩家先手,再后面电脑走;如果是其他的就是电脑先手。
4.在退出游戏时显示游戏信息
在test()函数结束后,显示游戏信息。
5.完善后的游戏效果
二、完整程序代码
1.game.h
#define ROW 3//行
#define COL 3//列
#include<stdio.h>
#include<stdlib.h>//头文件
#include<time.h>
int a, b, c, d;//结束时打印盘数的变量
void Initializ(char arr[ROW][COL], int row, int col);//初始化
void disprint(char arr[ROW][COL], int row, int col);//打印
void Playermove(char arr[ROW][COL], int row, int col);//玩家移动
void Computermove(char arr[ROW][COL], int row, int col);//电脑移动
char Judge_win(char arr[ROW][COL], int row, int col);//判断胜负
int Judge_com(char arr[ROW][COL], int row, int col, int z);//电脑判断自己能否赢
int Judge_player(char arr[ROW][COL], int row, int col, int z);//电脑判断玩家是否要赢,进行拦截
2.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("------------------------------------------------------\n");
printf("----------1.开始游戏--------0.退出游戏----------------\n");
printf("------------------------------------------------------\n");
}
void C_Dcome()
{
printf("------------------------------------------------------\n");
printf("----------1.玩家先手--------2.电脑先手----------------\n");
printf("------------------------------------------------------\n");
}
void game()
{
int shind = 0;
int hand = 0;
do {
C_Dcome();
printf("请选择:>");
scanf("%d", &shind);
switch (shind)
{
case 1:
hand = 1;
shind = 0;
break;
case 2:
hand = 2;
shind = 0;
break;
default:
printf("输入错误\n");
break;
}
} while (shind);
int ret = 0;
char arr[ROW][COL] = { 0 };//创建一个数组
Initializ(arr, ROW, COL);//对数组进行初始化
disprint(arr, ROW, COL);//打印棋盘
while (1)
{
if (hand == 1)
{
Playermove(arr, ROW, COL);//玩家下棋
}
else
{
Computermove(arr, ROW, COL);//电脑下棋
}
disprint(arr, ROW, COL);//打印棋盘
ret = Judge_win(arr, ROW, COL);
if (ret != 'C')
{
break;
}
if (hand == 1)
{
Computermove(arr, ROW, COL);//电脑下棋
}
else
{
Playermove(arr, ROW, COL);//玩家下棋
}
disprint(arr, ROW, COL);//打印棋盘
ret = Judge_win(arr, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '1')
{
printf("玩家胜利!再来一盘吧!\n");
a++;
}
else if (ret == '0')
{
printf("哈哈哈 电脑胜利啦!再去练练吧!\n");
b++;
}
else if (ret == 'Q')
{
printf("平局\n");
c++;
}
}
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();
printf("一共玩了%d盘\n", d = a + b + c);
printf("其中:\n");
printf("玩家胜利:%d盘\n", a);
printf("电脑胜利:%d盘\n", b);
printf("平局:%d盘\n", c);
return 0;
}
3.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Initializ(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 disprint(char arr[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
int j = 0;
printf("------------");
printf("\n");
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
printf("|");
}
printf("\n");
if (i < row - 1)
{
int s = 0;
for (s = 0; s < col; s++)
{
printf("---");
printf("|");
}
printf("\n");
}
}
printf("------------\n");
}
int is_full(char arr[ROW][COL], int row, int col)//判断是否平局
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
void Playermove(char arr[ROW][COL], int row, int col)//玩家下棋
{
int x = 0;
int y = 0;
int d = 0;
printf("请玩家下棋:>");
while (1)
{
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '1';
break;
}
else
{
printf("输入错误,请重新输入:>");
}
}
else
{
printf("输入错误,请重新输入:>");
}
}
}
void Computermove(char arr[ROW][COL], int row, int col)//电脑下棋
{
int x = 0;
int y = 0;
int z = 0;
printf("电脑下棋:>");
z = Judge_com(arr, ROW, COL, z);//电脑判断自己能否赢
while (z == 0)
{
x = rand() % ROW;
y = rand() % COL;
if (arr[x][y] == ' ')
{
printf("%d %d\n", x + 1 , y + 1);
arr[x][y] = '0';
break;
}
}
}
char Judge_win(char arr[ROW][COL], int row, int col)//判断胜负
{
int i = 0;
//判断3行
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
{
return arr[i][0];
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
{
return arr[0][i];
}
}
//判断2个斜线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
{
return arr[0][0];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] != ' ')
{
return arr[0][2];
}
//判断是否下满,是否平局
int len = 0;
len = is_full(arr, ROW, COL);
if (len == 1)
{
return 'Q';
}
else
{
return 'C';
}
}
int Judge_com(char arr[ROW][COL], int row, int col, int z)//电脑判断自己能否胜利
{
while (z == 0)
{
int i = 0;
for (i = 0; i < row; i++)//判断三行是否有两个‘#’
{
if (arr[i][0] == arr[i][1] && arr[i][1] == '0' && arr[i][2] == ' ')
{
z = 1;
arr[i][2] = '0';
printf("%d %d\n", i + 1, 3);
break;
}
if (arr[i][1] == arr[i][2] && arr[i][2] == '0' && arr[i][0] == ' ')
{
z = 1;
arr[i][0] = '0';
printf("%d %d\n", i + 1, 1);
break;
}
if (arr[i][0] == arr[i][2] && arr[i][2] == '0' && arr[i][1] == ' ')
{
z = 1;
arr[i][1] = '0';
printf("%d %d\n", i + 1, 2);
break;
}
}
if (z != 0)
break;
for (i = 0; i < col; i++)//判断三列是否有两个‘#’
{
if (arr[0][i] == arr[1][i] && arr[1][i] == '0' && arr[2][i] == ' ')
{
z = 1;
arr[2][i] = '0';
printf("%d %d\n", 3, i + 1);
break;
}
if (arr[1][i] == arr[2][i] && arr[2][i] == '0' && arr[0][i] == ' ')
{
z = 1;
arr[0][i] = '0';
printf("%d %d\n", 1, i + 1);
break;
}
if (arr[0][i] == arr[2][i] && arr[2][i] == '0' && arr[1][i] == ' ')
{
z = 1;
arr[1][i] = '0';
printf("%d %d\n", 2, i + 1);
break;
}
}
break;
}
while (z == 0)//判断两个竖线是否有两个‘#’
{
if (arr[0][0] == arr[1][1] && arr[1][1] == '0' && arr[2][2] == ' ')
{
z = 1;
arr[2][2] = '0';
printf("%d %d\n", 3, 3);
break;
}
if (arr[0][0] == arr[2][2] && arr[2][2] == '0' && arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '0';
printf("%d %d\n", 2, 2);
break;
}
if (arr[1][1] == arr[2][2] && arr[1][1] == '0' && arr[0][0] == ' ')
{
z = 1;
arr[0][0] = '0';
printf("%d %d\n", 1, 1);
break;
}
if (arr[0][2] == arr[1][1] && arr[1][1] == '0' && arr[2][0] == ' ')
{
z = 1;
arr[2][0] = '0';
printf("%d %d\n", 3, 1);
break;
}
if (arr[0][2] == arr[2][0] && arr[0][2] == '0' && arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '0';
printf("%d %d\n", 2, 2);
break;
}
if (arr[1][1] == arr[2][0] && arr[1][1] == '0' && arr[0][2] == ' ')
{
z = 1;
arr[0][2] = '0';
printf("%d %d\n", 1, 3);
break;
}
break;
}
z = Judge_player(arr, ROW, COL, z);//判断玩家是否要赢,进行拦截
return z;
}
int Judge_player(char arr[ROW][COL], int row, int col, int z)//判断玩家是否要赢,进行拦截
{
while (z == 0)
{
int i = 0;
for (i = 0; i < row; i++)//判断玩家3行
{
if (arr[i][0] == arr[i][1] && arr[i][1] == '1' && arr[i][2] == ' ')
{
z = 1;
arr[i][2] = '0';
printf("%d %d\n", i + 1, 3);
break;
}
if (arr[i][1] == arr[i][2] && arr[i][2] == '1' && arr[i][0] == ' ')
{
z = 1;
arr[i][0] = '0';
printf("%d %d\n", i + 1, 1);
break;
}
if (arr[i][0] == arr[i][2] && arr[i][2] == '1' && arr[i][1] == ' ')
{
z = 1;
arr[i][1] = '0';
printf("%d %d\n", i + 1, 2);
break;
}
}
if (z != 0)
break;
for (i = 0; i < col; i++)//判断玩家3列
{
if (arr[0][i] == arr[1][i] && arr[1][i] == '1' && arr[2][i] == ' ')
{
z = 1;
arr[2][i] = '0';
printf("%d %d\n", 3, i + 1);
break;
}
if (arr[1][i] == arr[2][i] && arr[2][i] == '1' && arr[0][i] == ' ')
{
z = 1;
arr[0][i] = '0';
printf("%d %d\n", 1, i + 1);
break;
}
if (arr[0][i] == arr[2][i] && arr[2][i] == '1' && arr[1][i] == ' ')
{
z = 1;
arr[1][i] = '0';
printf("%d %d\n", 2, i + 1);
break;
}
}
break;
}
while (z == 0)//判断两个斜线
{
if (arr[0][0] == arr[1][1] && arr[1][1] == '1' && arr[2][2] == ' ')
{
z = 1;
arr[2][2] = '0';
printf("%d %d\n", 3, 3);
break;
}
if (arr[0][0] == arr[2][2] && arr[2][2] == '1' && arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '0';
printf("%d %d\n", 2, 2);
break;
}
if (arr[1][1] == arr[2][2] && arr[1][1] == '1' && arr[0][0] == ' ')
{
z = 1;
arr[0][0] = '0';
printf("%d %d\n", 1, 1);
break;
}
if (arr[0][2] == arr[1][1] && arr[1][1] == '1' && arr[2][0] == ' ')
{
z = 1;
arr[2][0] = '0';
printf("%d %d\n", 3, 1);
break;
}
if (arr[0][2] == arr[2][0] && arr[0][2] == '1' && arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '0';
printf("%d %d\n", 2, 2);
break;
}
if (arr[1][1] == arr[2][0] && arr[1][1] == '1' && arr[0][2] == ' ')
{
z = 1;
arr[0][2] = '0';
printf("%d %d\n", 1, 3);
break;
}
break;
}
return z;
}
总结
以上就是对<进阶版三子棋>的优化完善和改进!