- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的电路板创建一个撤消功能,以返回到上一个
董事会状态。
我还建立了一个临时保存功能,该功能创建一个包含所有先前游戏状态的列表。但是,当我撤消直到棋盘达到初始游戏状态(全部为空白)然后进行移动时,在4x4棋盘中说A3时,撤消功能无法返回到初始状态(全部为空白),并且保存了当前作为板的第一个状态移动,因此初始空白状态消失了...
如果有人对我可能做错了什么,请发表评论。
任何帮助表示赞赏。
我是一名初学者程序员,但我希望我对该问题的解释能提供很多信息。在此之后,我将把tempSave函数,Undo Function和我称为Board State的结构放置:
这是董事会状态的结构:
typedef struct state *stateptr;
struct state {
char **table;
stateptr prev;
};
extern stateptr last=NULL;
void tmpSave(char **table,int dim)
{
//dim is the dimension of the dim x dim board and i have a main
//function that calls tmpSave after each move with the above parameters
int i,j;
stateptr newstate;
newstate=malloc(sizeof(struct state));
newstate->table=malloc(dim*sizeof(char*));
for(i=0; i<dim; i++)
{
newstate->table[i]=malloc(dim*sizeof(char));
}
for(i=0; i<dim; i++)
{
for(j=0; j<dim; j++)
{
newstate->table[i][j]=table[i][j];
}
}
if(last!=NULL)
{
newstate->prev=last;
last=newstate;
}
else
{
printf("\nHi!!\n");
last=newstate;
last->prev=NULL;
}
}
char **undo(short int *START)
{
stateptr prev=last->prev;
if(last->prev==NULL)
{
printf("\nCan't further undo\n");
}
else
{
free(last);
last=prev;
}
if(last->prev==NULL) *START=1;
return last->table;
}
0 0 0 0
w 0 0 0
0 0 0 0
0 0 0 0
0 0 w 0
w 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
此时,'last'指针等于初始状态,因此last-> prev = NULL且* START变为1,该指针用于定义机器人玩家执行的移动(不要不要认真考虑)
0 0 0 w
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 w
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
(空白状态)
最佳答案
由于示例不完整,因此我假设table
和last
是全局的,并且DIM是常量。
首先调用tmpSave
将存储空白板的副本。
在该结构中,将table
作为类型char (*table)[DIM]
使得可以通过一次调用分配和释放内存。它还使复制和复制table
内容与存储的副本更加容易。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define DIM 4
struct state {
char (*table)[DIM];
struct state *prev;
};
struct state *last = NULL;
char table[DIM][DIM];
void tmpSave ( )
{
struct state *newstate = NULL;
newstate = malloc ( sizeof ( *newstate));//allocate structure
newstate->table = malloc ( sizeof table);//allocate table
memmove (newstate->table, table, sizeof table);//copy table
if ( last != NULL)
{
newstate->prev = last;
last = newstate;
}
else
{
printf ( "\nHi!!\n");
last = newstate;
last->prev = NULL;
}
}
void undo ( void)
{
struct state *prev = last->prev;
if ( last->prev == NULL)
{
printf ( "\nCan't further undo\n");
}
else
{
free ( last->table);//free table
free ( last);//free structure
last = prev;
memmove ( table, last->table, sizeof table);//copy saved table back to table
}
}
void showboard ( void)
{
int i = 0;
for ( i = 0; i < DIM; ++i)
{
printf ( "%.*s\n", DIM, table[i]);//no zero terminator so print only DIM number of characters
}
}
struct state *freestate ( struct state *all)
{
//make sure all structures are free
while ( all) {
struct state *tmp = all;
free ( all->table);//free table
free ( all);//free structure
all = tmp->prev;
}
return NULL;
}
int main( void) {
srand ( time ( NULL));//seed random number generator
memset ( table, '0', sizeof table);//set table to all 0
showboard ( );
tmpSave ( last);//make sure empty table is saved
for ( int each = 0; each < DIM; ++each) {//DIM moves
int row = rand ( ) % DIM;
int col = rand ( ) % DIM;
table[col][row] = each + '1';
tmpSave ( last);//save table
printf ( "\tMove %d\n", each + 1);
showboard ( );
}
for ( int each = 0; each < DIM + 1; ++each) {//undo DIM + 1
printf ( "\tundo %d\n", each + 1);
undo ( );
showboard ( );
}
last = freestate ( last);
return 0;
}
dim
,请使用
char **table
并根据需要进行分配。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct State state;
struct State {
char **table;
state *prev;
};
state *tmpSave ( state *last, int dim, char **table) {
state *newstate = NULL;
if ( NULL == ( newstate = malloc ( sizeof ( *newstate)))) {//allocate structure
fprintf ( stderr, "malloc newstate problem\n");
return last;
}
if ( NULL == ( newstate->table = malloc ( sizeof *newstate->table * dim))) {//allocate table pointers
fprintf ( stderr, "malloc newstate->table problem\n");
free ( newstate);
return last;
}
for ( int each = 0; each < dim; ++each) {
if ( NULL == ( newstate->table[each] = malloc ( sizeof **newstate->table * dim))) {//chars to pointers
fprintf ( stderr, "malloc newstate->table[each] problem\n");
while ( each--) {
free ( newstate->table[each]);
}
free ( newstate->table);
free ( newstate);
return last;
}
memmove ( newstate->table[each], table[each], dim);//copy table
}
if ( last != NULL) {
newstate->prev = last;
last = newstate;
}
else {
printf ( "\nHi!!\n");
last = newstate;
last->prev = NULL;
}
return last;
}
state *undo ( state *last, int dim, char **table) {
state *prev = last->prev;
if ( last->prev == NULL) {
printf ( "Can't further undo\n");
}
else {
for ( int each = 0; each < dim; ++each) {
free ( last->table[each]);//free chars
}
free ( last->table);//free table pointers
free ( last);//free structure
last = prev;
for ( int each = 0; each < dim; ++each) {
memmove ( table[each], last->table[each], dim);//copy saved table back to table
}
}
return last;
}
void showboard ( int dim, char **table) {
int show = 0;
for ( show = 0; show < dim; ++show) {
printf ( "%.*s\n", dim, table[show]);//no zero terminator so print only dim number of characters
}
}
state *freeall ( state *all, int dim) {
//make sure all structures are free
while ( all) {
state *tmp = all;
for ( int each = 0; each < dim; ++each) {
free ( all->table[each]);//free chars
}
free ( all->table);//free pointers
free ( all);//free structure
all = tmp->prev;
}
return NULL;
}
int main( void) {
char input[100] = "";
int dim = 0;
int scanned = 0;
char extra = 0;
char **table = NULL;
state *last = NULL;
srand ( time ( NULL));//seed random number generator
do {
if ( 1 != scanned) {
printf ( "enter a number only. try again\n");
}
printf ( "enter a number\n");
if ( fgets ( input, sizeof input, stdin)) {
scanned = sscanf ( input, "%d %c", &dim, &extra);
}
else {
fprintf ( stderr, "fgets problem\n");
return 0;
}
} while ( 1 != scanned);
if ( NULL == ( table = malloc ( sizeof *table * dim))) {//allocate pointers
fprintf ( stderr, "problem malloc table\n");
return 0;
}
for ( int each = 0; each < dim; ++each) {
if ( NULL == ( table[each] = malloc ( sizeof **table * dim))) {//allocate chars to pointers
fprintf ( stderr, "problem malloc table[each]\n");
while ( each--) {
free ( table[each]);
}
free ( table);
return 0;
}
memset ( table[each], '-', dim);//set chars to all -
}
showboard ( dim, table);
last = tmpSave ( last, dim, table);//make sure empty table is saved
for ( int move = 0; move < dim; ++move) {//dim number of random moves
int row = rand ( ) % dim;
int col = rand ( ) % dim;
table[col][row] = move + 'A';
last = tmpSave ( last, dim, table);//save table
printf ( "\tMove %d of %d\n", move + 1, dim);
showboard ( dim, table);
printf ( "press enter\n");
if ( ! fgets ( input, sizeof input, stdin)) {
fprintf ( stderr, "fgets problem\n");
last = freeall ( last, dim);
return 0;
}
}
for ( int move = 0; move < dim + 1; ++move) {//try to undo dim + 1 moves
printf ( "\tundo %d of %d\n", move + 1, dim + 1);
last = undo ( last, dim, table);
showboard ( dim, table);
printf ( "press enter\n");
if ( ! fgets ( input, sizeof input, stdin)) {
fprintf ( stderr, "fgets problem\n");
last = freeall ( last, dim);
return 0;
}
}
last = freeall ( last, dim);
return 0;
}
关于c - 撤消功能在达到游戏初始状态后无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54722467/
我已经下载了 RStudio,在打开我的代码所在的文件时,我似乎已经达到了容量限制: The file is 2.3MB the maximum file size is 2MB The file i
我有一个按钮,每次单击时,都会将 1 添加到变量中。当此变量超过 5 时,将触发警报。然而,此后触发器仍不断激活。我尝试使用 == 而不是 > 进行检查,但它做同样的事情。有什么想法吗? http:/
我正在将Slick 3.0与HikariCP 2.3.8一起使用(也可以玩2.4) 我做了很多数据库IO,并且不断达到队列限制。 有没有一种方法可以获取当前的队列大小,以及如何增加队列大小? 还是建议
在 Salesforce 中,您可以设置各种工作流程或构建用于发送电子邮件的 API 应用程序。对于大多数标准 Salesforce 组织,每天有 1000 封电子邮件的限制。 (例如,参见 here
我有一个类是这样的: public sealed class Contract { public bool isExpired { get; set; } public DateTim
我有一个带有特殊符号按钮的输入作为附加组件。 HTML
我正在尝试压缩 pdf 文件(有时是图像)。我需要一个 java 压缩器来帮助我压缩文件。我需要尺寸小于原始文档尺寸的一半。我尝试了java api中给出的deflator。但它并不是很成功。请帮我解
我正在使用这条线来创建淡入效果。 $('#div').css({opacity: 0, visibility:"visible"}).animate({opacity: 1}, 500); 可见类达到
我使用 URLCache 来缓存请求响应,最大容量如下: let diskCapacity = 100 * 1024 * 1024 let memoryCapacity = 100
我有一个计数器函数,我从这个 Answer 得到它: function countDown(i) { var int = setInterval(function () {
下面是一段代码,用于检查给定数字是否为 Lychrel 数字。这基本上意味着该程序取一个数及其倒数之和,然后取那个数及其倒数之和,等等,直到找到回文。如果它在一定的迭代次数内没有找到这样的数字(我在这
我即将对这个可怕的旧 Java Web 应用程序做一些工作,这是我的一个 friend 不久前继承的。 在我设置 tomcat、导入项目和所有这些到我的 eclipse 工作区后,我收到此错误,指出
我有一个 NSDictionary 对象,其中包含深层结构,例如包含包含字典的进一步数组的数组... 我想在层次结构中向下获取一个对象。是否有任何直接索引方法可以使用键名或其他方式获取它们? 多次调用
正如标题所说,我的 .border div 的边框跨度比它里面的要宽。它只会在达到 710px 时发生,因此您需要在 this fiddle 中展开结果窗口。 . 我希望边框保持在其内容周围而不超过它
我在 MySQL 中有一个表,通过 Microsoft Access 2013 中的链接表(通过 ODBC) Access 。 此表包含超过 124,000 条记录,我需要一个表单中的 ComboBo
一旦上一个输入达到其最大长度值,我如何才能聚焦下一个输入? a: b: c: 如果用户粘贴的文本大于最大长度,理想情况下它应该溢出到下一个输入。 jsFiddle: http://jsfiddl
我的任务是在客户的 QA 服务器上提供服务器性能报告。理想情况下,客户希望对约 900 个并发用户进行负载测试,因为这是他们在高峰时段通常使用的数量。然而,我一直在做的负载测试正在使他们的 QA 服务
我在 django 应用程序中对我的 celery worker 运行任务,其中每个任务执行大约需要 1-2 秒。通常这些执行都很好,但有时,特别是如果 Django 应用程序已经部署了一段时间,我开
我有一个 one_for_one 主管来处理类似且完全独立的 child 。 当一个 child 出现问题时,反复崩溃并触发: =SUPERVISOR REPORT==== 30-Mar-2011::
根据该网站,他们在免费计划中限制了 100 个并发连接,但是当第 101 个连接尝试连接时,它被拒绝,那么什么时候允许新连接? 例如:用户是否必须等待一定时间或一旦一个连接关闭,另一个连接就有机会连接
我是一名优秀的程序员,十分优秀!