本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下
思路:
main函数结构部署
game函数功能的实现
①创建存储空间
②初始化存储空间为空格
③打印棋盘
④实现玩家下棋
⑤实现电脑下棋
⑥实现玩家和电脑下棋后的输赢判断
所使用的文件:
test.c-----用于测试游戏
game.c----用于实现游戏中的一些函数
game.h-----头文件
test.c
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<stdio.h>
- #include"game.h"
- #include<stdlib.h>
-
- void menu()
- {
- printf("%s\n", "**********");
- printf("%s\n", "* 1.play *");
- printf("%s\n", "* 0.exit *");
- printf("%s\n", "**********");
- }
- void game()
- {
- //建立存储空间--二维数组
- char ch[ROW][COL];//我们想让数组空间变得灵活,就要保证行和列可变,单数组不接受变量,只能使用define定义的常量-----最好放在头文件里---从而改变头文件实现数组空间灵活变化
- //初始化存储空间----显示正常
- innit(ch,ROW,COL);
- //打印棋盘
- pri_board(ch, ROW, COL);
- char re='\0';//接收游戏结果
- //玩家和电脑博弈
- while (1)
- {
- //玩家下棋
- pla_move(ch, ROW, COL);
- pri_board(ch, ROW, COL);
- //使用函数判断是否产生输赢
- re=is_win(ch,ROW,COL);
- //只要不等于"c"说明产生了结果,直接结束博弈
- if (re != 'C')
- break;
- //电脑下棋
- com_move(ch, ROW, COL);
- pri_board(ch, ROW, COL);
- //使用函数判断是否产生输赢
- re=is_win(ch, ROW, COL);
- if (re != 'C')
- break;
-
- }
- if (re == '*')
- printf("玩家获胜!\n");
- else if (re == '#')
- printf("电脑获胜!\n");
- else
- printf("平局!\n");
- pri_board(ch, ROW, COL);
-
- }
-
-
-
- int main()
- {
- //srand函数的使用,后面的com_move函数使用(难点)
- srand((unsigned int)time(NULL));
- 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);
-
- }
game.c
- #define _CRT_SECURE_NO_WARNINGS 1
- #include "game.h"
- void innit(char ch[ROW][COL], int row, int col)
- {//遍历二维数组将值改为空格实现初始化
- int i = 0;
- int w = 0;
- for (i = 0; i < row; i++)
- {
- for (w = 0; w < col; w++)
- {
- ch[i][w] = ' ';
-
- }
- }
-
-
- }
-
- void pri_board(char ch[ROW][COL],int row,int col)
- {//
- int i = 0;
- int w = 0;
- //行的循环里有两个列的循环
- //列的循环里有两个打印循环
- for (i = 0; i < row; i++)
- {
- for (w = 0; w < col; w++)
- {
- printf(" %c ", ch[i][w]);
- if (w < col - 1)
- printf("|");
- }
- printf("\n");
- if (i < row - 1)
- {
- for (w = 0; w < col; w++)
- {
- printf("---");
- if (w < col - 1)
- printf("|");
- }
-
- printf("\n");
- }
- }
-
-
-
-
- }
-
- void pla_move(char ch[ROW][COL], int row, int col)
- {
- while (1)
- {
- //玩家输入下棋坐标
- int a = 0;
- int b = 0;
- printf("玩家走>:\n");
- printf("请输入你要下的棋子坐标:");
- scanf("%d%d", &a, &b);
- //判断坐标是否合法
-
- if ((a >= 1 && a <= row) && (b >= 1 && b <= col))
- {
-
- //符合规范后,判断棋子位置是否被占用
- //玩家下棋的坐标和数组坐标有差异
- if (ch[a-1][b-1] == ' ')
- {
- ch[a-1][b-1] = '*';
- break;
- }
- else
- {
- printf("该位置被占用,请重新输入\n");
- }
-
- }
- else
- {
- printf("你所输入的棋子位置不符合规范,请重新输入\n");
- }
- }
-
- }
-
-
- void com_move( char ch[ROW][COL],int row,int col)
- {
- printf("电脑走>\n");
- //涉及到srand和rand函数的使用(较难)
- //取余后坐标在正确范围内
- while(1)
- {
- int a = rand()%row;
- int b = rand()%col;
- //判断坐标处是否已经下过
-
- if (ch[a][b] == ' ')
- {
- ch[a][b] = '#';
- break;
- }
- }
- }
-
- //通过遍历二维数组里面的内容判断是否平局
- int is_full(char ch[ROW][COL], int row, int col)
- {
- int i = 0;
- int w = 0;
- for (i = 0; i < row;i++)
- {
- for (w = 0; w < col; w++)
- {
- if(ch[i][w] == ' ');
- return 0;
- }
- }
- return 1;
- }
-
-
-
- char is_win(char ch[ROW][COL], int row, int col)
- {
- int i = 0;
- //判断行(三子棋版本)
- for (i = 0; i < row; i++)
- {
- if (ch[i][0] == ch[i][1] && ch[i][1] == ch[i][2] && ch[i][0] != ' ')
- return ch[i][0];
-
- }
-
- //判断列(三子棋版本)
- for (i = 0; i < col; i++)
- {
- if (ch[0][i] == ch[1][i] && ch[1][i] == ch[2][i] && ch[0][i] != ' ')
- return ch[0][i];
- }
- //判断对角线(三子棋版本)
- if (ch[0][0]==ch[1][1]&&ch[1][1]==ch[2][2]&&ch[1][1]!=' ')
- return ch[1][1];
- if (ch[0][2] == ch[1][1] && ch[1][1] == ch[2][0] && ch[0][2] != ' ')
- return ch[0][2];
- //判断是否平局
- int ispj = is_full(ch, ROW, COL);
- //棋盘满返回1
- //不满返回0
- if (ispj == 1)
- return 'Q';
- else
- return 'C';
- }
game.h
- #define _CRT_SECURE_NO_WARNINGS 1
- #define ROW 3
- #define COL 3
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- void innit(char ch[ROW][COL], int row, int col);
- void pri_board(char ch[ROW][COL], int row, int col);
- void pla_move(char ch[ROW][COL], int row, int col);
- void com_move(char ch[ROW][COL], int row, int col);
- char is_win(char ch[ROW][COL], int row, int col);
然而,这个三子棋代码只能在3*3棋盘下实现
我们可以通过改变is_win()输赢判断条件,来实现棋盘的自由变化.
修改
优化后的判断条件
列和行的判断
- for (i = 0; i < col; i++)
- {
- int count = 0;
- for (q=0;q<row;q++)
- {//列的判断
- if (ch[q][i] == ch[q + 1][i] && ch[q][i] != ' ')
- {
- count++;
- continue;
- }
- else
- break;
- }
- if (count >= 2)
- return ch[q][i];
- }
-
- //判断行(三子棋版本)
- for (q = 0; q < row; q++)
- {
- int count = 0;
- for (i = 0; i < col; i++)
- {//行的判断
- if (ch[q][i] == ch[q][i + 1] && ch[q][i] != ' ')
- {
- count++;
- continue;
- }
- else
- break;
- }
- if (count >= 2)
- return ch[q][i];
- }
对角线的判断
- //判断对角线(三子棋版本)
- //左上角到右下角
- for (q = 0; q < row; q++)
- {
- for (i = 0; i < col; i++)
- {
- if (ch[q][i] == ' ')
- {
- continue;
- }
- else
- {
- if (ch[q][i] == ch[q + 1][i + 1])
- {
- if (ch[q + 1][i + 1] == ch[q + 2][i + 2])
- return ch[q][i];
- }
- }
- }
- }
- //右上角到左下角
- for (q = 0; q < row; q++)
- {
- for (i = 0; i < col; i++)
- {
- if (ch[q][i] == ' ')
- {
- continue;
- }
- else
- {
- if (ch[q][i] == ch[q + 1][i - 1])
- {
- if (ch[q + 1][i - 1] == ch[q + 2][i - 2])
- return ch[q][i];
- }
- }
- }
- }
等日后有时间,再来实现电脑的算法.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。