admin管理员组

文章数量:1794759

新手学习C语言,入门小游戏的编写(三子棋)

新手学习C语言,入门小游戏的编写(三子棋)

在学习了一段时间的C语言之后,运用循环嵌套,合理的逻辑思路以及函数的建立和调用,可以尝试着写一个小游戏——三子棋(也可以是n子棋)。

以下是相关的代码以及解释:

一个游戏的建立,不是抬手就去写的,是需要自己反复推敲,不断寻找最优化的逻辑解决方案。在写三子棋的开始,不能像平常刷题一样直接写,需要构建框架,想好之后的每一步该怎么做。

我们在写的时候,不像平常的代码一样,而是需要将该项目的头文件、源文件以及函数分开存放,这样方便以后的更改。

 1. test.c文件

该文件中是写该游戏的代码框架主体。

用while循环,如果一直不赢就死循环,一旦有一方赢得游戏,就break跳出循环。

用do-while循环来定义游戏的开始,1或0来开始或结束游戏,否则选择错误,需要重新选择。

#define _CRT_SECURE_NO_WARNINGS #include"game.h" void menu() { printf("*****************************\\n"); printf("***** 1. play 0. exit *****\\n"); printf("*****************************\\n"); } void game() { char ret = 0; char board[ROW][COL] = { 0 }; //初始化棋盘的功能 InitBoard(board , ROW , COL); DispalyBoard(board, ROW , COL); //下棋 while (1) { PlayerMove(board,ROW,COL); //判断输赢 ret = IsWin(board,ROW,COL); if (ret != 'C') { break; } DispalyBoard(board, ROW, COL); ComputerMove(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } DispalyBoard(board, ROW, COL); } if (ret == '*') { printf("玩家赢\\n"); } else if (ret == '#') { printf("电脑赢\\n"); } else { printf("平局\\n"); } DispalyBoard(board, ROW, COL); } int main() { 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); return 0; } 2. 头文件

将项目所需要引用的头文件以及函数体放在头文件中,这样方便查找以及代码的阅读。定义的棋盘格子数,是可以修改的。

#pragma once #include <stdio.h> #include <stdlib.h> #include <time.h> //棋盘的格子数 #define ROW 3 #define COL 3 //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void DispalyBoard(char board[ROW][COL], int row, int col); //玩家下棋 void PlayerMove(char board[ROW][COL], int row, int col); //电脑下棋 //找没有下棋的随机下棋 void ComputerMove(char board[ROW][COL], int row, int col); // //玩家赢 - '*' //电脑赢 - '#' //平局 - 'Q' //继续 - 'C' // char IsWin(char board[ROW][COL], int row, int col); 3. game.c文件

这个文件中,完成了每个函数的逻辑。其中包含了定义棋盘,初始化棋盘,玩家下棋,电脑下棋,判断输赢。

(1)在定义棋盘的时候,没有死板的固定写法,这里是用for循环来将棋盘输出,目的是方便修改棋盘的大小;

(2)游戏还需要一个函数来判断棋盘是否满了,如果满了,返回1,游戏重新开始,如果没满,游戏继续;

(3)在判断输赢时,需要考虑三种情况,行、列、对角线,这三种情况,满足一种就可以判断游戏胜出,反之游戏平局,重新选择开始或者退出。

#define _CRT_SECURE_NO_WARNINGS #include "game.h" //定义棋盘 void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } } //棋盘初始化 void DispalyBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { //打印数据 int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\\n"); //打印分割信 //printf("---|---|---\\n"); if (i < row - 1) { int j = 0; for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\\n"); } } } //玩家下棋 void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋:>\\n"); while (1) { printf("请输入坐标:>"); scanf("%d %d", &x, &y); //坐标范围合法的判断 if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐标被占用,不能下棋,请选择其他位置\\n"); } } else { printf("坐标非法,请重新输入\\n"); } } } //电脑下棋 void ComputerMove(char board[ROW][COL], int row, int col) { printf("电脑下棋:>\\n"); int x = 0; int y = 0; while (1) { x = rand() % row;//0~2 y = rand() % col;//0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } //满了就返回1 //不满 返回0 int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') { return 0; } } } return 1; } char IsWin(char board[ROW][COL], int row, int col) { //行 int i = 0; for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') { return board[i][1];// } } //列 int j = 0; for (j = 0; j < col; j++) { if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') { return board[1][j]; } } //对角线 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } //没有人赢,就要平局 if (IsFull(board, row, col)) { return 'Q'; } //游戏继续 return 'C'; }

在写一个游戏的时候,要考虑的往往会很多,不能仅仅只保证游戏可以运行下去,也要保证其他情况的发生会不会影响到程序的安全。

最后附上游戏运行的截图 游戏开始

 选择1,游戏开始,玩家下棋,输入坐标

 玩家选择1 1坐标,电脑自动下棋

 如此反复进行游戏,直到分出胜负为止,游戏重新开始

 

本文标签: 小游戏三子入门新手语言